日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对象属性结构赋值_(六)面向对象-下

發(fā)布時間:2025/3/19 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对象属性结构赋值_(六)面向对象-下 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

(六)面向?qū)ο?下

關(guān)鍵字:static

static

  • 可以用來修飾的結(jié)構(gòu):主要用來修飾類的內(nèi)部結(jié)構(gòu)
  • 屬性、方法、代碼塊、內(nèi)部類
  • static修飾屬性:靜態(tài)變量(類變量

屬性,是否使用static修飾,又分為:靜態(tài)屬性vs非靜態(tài)屬性(實例變量

實例變量:

我們創(chuàng)建了類的多個對象,每個對象獨立擁一套類中的非靜態(tài)屬性。當(dāng)修改其中一個對象中的靜態(tài)屬性 時 不會導(dǎo)致其他對象中同樣的屬性值的修改。

靜態(tài)變量:

我們創(chuàng)建了類的多個對象,多個對象共享同一個靜態(tài)變量。當(dāng)通過某一個對象修改靜態(tài)變量時會導(dǎo)致其他對象調(diào)用此靜態(tài)變量時,是修改過的

static修飾屬性的其它說明:

1、靜態(tài)變量隨著類的加載而加載

2、靜態(tài)變量加載早于對象的創(chuàng)建??梢酝ㄟ^"類.靜態(tài)變量"的方式進行調(diào)用

3、由于類智慧加載一次,則靜態(tài)變量的內(nèi)存中也只會存在一份:存在方法區(qū)的靜態(tài)域

?靜態(tài)屬性舉例:System.out; Math.PI

  • 靜態(tài)變量內(nèi)存解析

內(nèi)存解析
  • static修飾方法:靜態(tài)方法

隨著類的加載而加載,可以通過“類.靜態(tài)方法”的方式進行調(diào)用

靜態(tài)方法中,只能調(diào)用靜態(tài)的方法或?qū)傩?/p>

非靜態(tài)方法中,既可以調(diào)用靜態(tài)的方法或?qū)傩?#xff0c;也可以調(diào)用靜態(tài)的方法或?qū)傩?/p>

  • static的注意點 在靜態(tài)的方法內(nèi),不能使用this關(guān)鍵字、super關(guān)鍵字 關(guān)于靜態(tài)屬性和靜態(tài)方法的使用,大家都從生命周期的角度去理解
  • 如何判定屬性和方法應(yīng)該使用static關(guān)鍵字

關(guān)于屬性

屬性可以被多個對象所共享的,不會隨著對象的不同而不同 類中的常量也常常聲明為靜態(tài)變量

關(guān)于方法

操作靜態(tài)屬性的方法通常設(shè)置為靜態(tài)的 工具類的方法,通常聲明為static的。比如:Math、Arrays、Collections

  • 使用舉例

舉例一:Arrays、Math、Collections等工具類

舉例二:單例模式

舉例三:

class Circle{ private double radius; private int id;public Circle(){id = init++;total++;}public Circle(double radius){this();this.radius = radius;}private static int total;//記錄圓創(chuàng)建的個數(shù)private static int init = 1001;//static的屬性被所對象所共public void setId(int id) {this.id = id;}public void setRadius(double radius) {this.radius = radius;}public double getRadius() {return radius;}public int getId() {return id;}public double findArea(){return 3.14*radius*radius;}public static int getTotal() {return total;} }

單例模式

  • 設(shè)計模式的說明

理解:設(shè)計模式是在大量的實踐中總結(jié)和理論化之后優(yōu)的代碼結(jié)構(gòu)、編程風(fēng)格、以及解決問題的思考方式

常用設(shè)計模式:23種經(jīng)典的設(shè)計模式

  • 單例模式

要解決的問題:所謂 類的單例設(shè)計模式,就是采取一定的方法保證在整個的軟件系統(tǒng)中,對某個類只能存在一個對象實例 ,并且該類只提供一個取得其對象實例的方法。

具體代碼的實現(xiàn):

//餓漢式 class Bank{ //1、私化類的構(gòu)造器 private Bank(){ }//2、內(nèi)部創(chuàng)建類的對象//4、提要求對象也為staticprivate static Bank instance = new Bank();//3、提供公共方法,返回類的對象public static Bank getInstance(){return instance;} }//懶漢式 class Order{ //1、私化類的構(gòu)造器 private Order(){ }//2、聲明當(dāng)前類的對象//4、此對象聲明為staticprivate static Order instance = null;//3、聲明public的static返回當(dāng)前類對象的方法public static Order getInstance(){if (instance==null){instance=new Order();}return instance;} }

兩種方式的對比:

餓漢式:壞處:對象加載時間過長

好處:餓漢式是線程安全的

懶漢式:好處:延遲對象創(chuàng)建

壞處:線程不安全。---->到多線程內(nèi)容,在修改


main()的使用說明

main()方法使用說明

  • main方法作為程序的入口
  • main()方法也是普通的靜態(tài)方法
  • main()方法可以作為我們與控制臺交互的入口(之前使用Scanner)
  • 如何將控制臺獲取的數(shù)據(jù)傳給形參:String[] args? 運行時:java類名 "tom" "jerry" "123" "true"

sout(args[0]);//tom

public static void main(String[] args)

權(quán)限修飾符:private 缺省 protected public---->封裝性 修飾符:static final abstract native 可以用來修飾方法 返回類型:無返回值/有返回值--->return 需要滿足標識符命名規(guī)范 形參列表:重載vs重寫;參數(shù)的值傳遞機制;體現(xiàn)對象的多態(tài)性 方法體:來體現(xiàn)方法的功能


類的結(jié)構(gòu)之四:代碼塊

代碼塊

  • 代碼塊的作用:用來初始化類、對象的信息
  • 分類:代碼塊要是使用修飾符,只能使用static
  • 靜態(tài)代碼塊
內(nèi)部可以輸出語句 隨著類的加載而執(zhí)行,而且只執(zhí)行一次 作用:初始化類的信息 如果一個類中定義了多個靜態(tài)代碼塊,則按照聲明的先后順序執(zhí)行 靜態(tài)代碼塊的執(zhí)行優(yōu)先于非靜態(tài)代碼快的執(zhí)行 靜態(tài)代碼塊內(nèi)只能調(diào)用靜態(tài)屬性、靜態(tài)方法,不能調(diào)用非靜態(tài)的結(jié)構(gòu)
  • 非靜態(tài)代碼塊
隨著對象的創(chuàng)建而執(zhí)行 內(nèi)部可以輸出語句 每創(chuàng)建一個對象,就執(zhí)行一次非靜態(tài)代碼塊 作用:可以在創(chuàng)建對象時,對對象的屬性進行初始化 如果一個類中定義了多個靜態(tài)代碼塊,則按照聲明的先后順序執(zhí)行
非靜態(tài)代碼塊內(nèi)都可以調(diào)用靜態(tài)和非靜態(tài)的結(jié)構(gòu)
  • 實例化子類對象時,涉及到父類、子類中靜態(tài)代碼塊、非靜態(tài)代碼塊、構(gòu)造器的加載順序

由父及子,靜態(tài)先行。

屬性的賦值順序

  • 對屬性可以賦值的位置
默認初始化 顯式初始化 構(gòu)造器中初始化 兩了對象以后,可以通過"對象.屬性"或"對象.方法"的方式,進行賦值 在代碼塊中賦值

關(guān)鍵字:final

  • 可以用來修飾:類、方法、變量

具體使用說明

  • final可以用來修飾的結(jié)構(gòu):類,方法,變量
  • final用來修飾一個類:此類不能被其它類所繼承。比如:String類、System類、StringBuffer類
  • final用來修飾方法:表明此方法不可以被重寫,比如:Object類中的getClass();
  • final用來修飾變量:此時的“變量”稱為一個常量
  • final修飾屬性:可以考慮賦值的位置:顯示初始化、代碼塊中初始化、構(gòu)造器中
final修飾局部變量
尤其是使用final來修飾形參時,表明該形參是一個常量。當(dāng)調(diào)用此方法時,給常量形參賦一個實參,一旦賦值以后,就只能在方法體內(nèi)使用此形參,但不能重新賦值。
  • static final:用來修飾屬性:全局常量

關(guān)鍵字:abstract

  • 可以用來修飾:類、方法

具體使用說明

  • abstract修飾類、抽象類
此類不能實例化 抽象類中構(gòu)造器,便于子類實例化調(diào)用 開發(fā)中,都會提供抽象類的子類,讓子類實例化,完成相關(guān)操作--->抽象的使用前提:繼承性
  • abstract修飾方法、抽象方法
抽象方法只有方法的聲明,沒有方法體 包含抽象方法的類一定是一個抽象類。反之,抽象類可以沒有抽象方法 若子類重寫了父類的所抽象方法后,此子類方可實例化 若子類沒重寫父類中的所的抽象方法,則此子類是一個抽象類,需要使用abstract修飾
  • 注意點
abstract不能用來修飾:屬性、構(gòu)造器等結(jié)構(gòu)
abstract不能用來修飾私方法、靜態(tài)方法、final的方法、final的類
  • abstract的應(yīng)用舉例

舉例一

abstract class GeometricObject{ public abstract double findArea(); } class Circle extends GeometricObject{ private double radius; public double findArea(){retuan 3.14*radius*radius; } }

舉例二

IO流中涉及到的抽象類:InputStream/OutputStream/Reader/Writer。在其內(nèi)部 定義了抽象的read()、write()方法。

模板方法的設(shè)計模式

  • 解決的問題

換句話說,在軟件開發(fā)中實現(xiàn)一個算法時,整體步驟很固定、通用,這些步驟已經(jīng)在父類中寫好了。但是某些部分易變,易變部分可以抽象出來,供不同子類實現(xiàn)。這就是一種模板模式。

  • 舉例
bstract class Template{//計算某段代碼執(zhí)行所需要花費的時間public void spendtime(){long start = System.currentTimeMillis();code();//易變部分long end = System.currentTimeMillis();System.out.println("花費的時間為:"+(end-start));}public abstract void code(); }class Subtemplate extends Template{@Overridepublic void code() {for(int i=2;i<=1000;i++){boolean isFlag = true;for (int j = 2;j<Math.sqrt(i);j++){if(i%j==0){isFlag = false;break;}}if (isFlag){System.out.println(i);}}} }

應(yīng)用場景


關(guān)鍵字:interface

  • 使用說明
1.接口使用interface來定義 2.java語言中接口和類是并列的結(jié)構(gòu) 3.如何定義接口:定義接口中的成員
3.1 JDK7及以前:只能定義全局常量和靜態(tài)方法 全局常量:public static final的,但是書寫時可以省略不寫 抽象方法:public abstract的
3.2 JDK8:除了定義全局常量和抽象方法之外,還可以定義靜態(tài)方法、默認方法(略
4。接口中不能定義構(gòu)造器的!意味著接口不可以實例化 5、java開發(fā)中,接口通過讓類去實現(xiàn)(implements的方式來使用 如果實現(xiàn)類覆蓋了接口中的所抽象方法,則此實現(xiàn)類就可以實例化 如果實現(xiàn)類沒覆蓋接口中所的抽象方法,則此實現(xiàn)類仍為一個抽象類 6/java類可以實現(xiàn)多個接口--->彌補了java的單繼承性的局限性 格式:class AA extends BB implements CC,DD,EE
7、接口與接口之間可以多繼承
8.接口的具體使用,體現(xiàn)多態(tài)性 9.接口,實際上可以看做是一種規(guī)范
  • 舉例
class Computer{public void transferData(USB usb){//USB usb = new Flash();usb.start();System.out.println("具體傳輸?shù)募毠?jié)");usb.stop();} }interface USB{//常量:定義了長、寬、最大最小的傳輸速度等void start();void stop();}class Flash implements USB{@Overridepublic void start() {System.out.println("U盤開啟工作");}@Overridepublic void stop() {System.out.println("U盤結(jié)束工作");} }class Printer implements USB{@Overridepublic void start() {System.out.println("打印機開啟工作");}@Overridepublic void stop() {System.out.println("打印機結(jié)束工作");} } /*體會: 1.接口的使用上也滿足多態(tài)性 2、接口實際上就是定義了一種規(guī)范 3、開發(fā)中體會面向接口編程 */

Java8中關(guān)于接口的新規(guī)范

//知識點1:接口中定義的靜態(tài)方法,只能通過接口來調(diào)用。//知識點2:通過實現(xiàn)類的對象,可以調(diào)用接口中的默認方法 //如果實現(xiàn)類重寫了接口的默認方法,調(diào)用時仍然調(diào)用重寫的方法//知識點3:如果子類(或?qū)崿F(xiàn)類繼承的父類和實現(xiàn)的接口中聲明了同名參數(shù)的方法, //那么子類在沒重寫此方法的情況下,默認調(diào)用的是父類中同名參數(shù)的方法---->類優(yōu)先原則//知識點4:如果實現(xiàn)類實現(xiàn)類多個接口,而多個接口定義了同名同參數(shù)的方法, //那么在沒重寫此方法的情況下,報錯。--->接口沖突 //折舊需要我們必須在實現(xiàn)類中重寫此方法//知識點5:如何在自樂(或?qū)崿F(xiàn)類的方法中調(diào)用父類、接口中被重寫的方法 public void myMethod(){method3();//自己定義的重寫方法super.method3();//調(diào)用父類的方法//調(diào)用接口中的默認方法CompareA.super.method3();CompareB.super.method3();

面試題:抽象類和接口的異同?

相同點:不能實例化;都可以包含抽象方法的。 不同點: 1、把抽象類和接口(java7,java8,java9)的定義、內(nèi)部結(jié)構(gòu)解釋說明 2、類:單繼承性 接口:多繼承性 類與接口:多實現(xiàn)

代理模式

  • 解決的問題

代理模式是Java開發(fā)中使用較多的一種設(shè)計模式。代理設(shè)計就是為其他對象提供一種代理以控制對這個對象的訪問。

  • 舉例
interface NetWork{public void browse(); }//被代理類 class Server implements NetWork{@Overridepublic void browse() {System.out.println("真是服務(wù)器訪問網(wǎng)絡(luò)");} }//代理類 class ProxyServer implements NetWork{private NetWork work;public ProxyServer(NetWork work){this.work = work;}public void check(){System.out.println("連網(wǎng)之前的檢查工作");}@Overridepublic void browse() {check();work.browse();} }
  • 應(yīng)用場景


類的結(jié)構(gòu)之五:內(nèi)部類

定義

  • java中允許將一個類A聲明在類B中,則類A就是內(nèi)部類,類B稱為外部類

內(nèi)部類的分類

  • 成員內(nèi)部類(靜態(tài)與非靜態(tài)vs局部內(nèi)部類(方法內(nèi)、代碼塊內(nèi)、構(gòu)造器內(nèi)

成員內(nèi)部類的理解

  • 一方面:作為外部類的成員:
調(diào)用外部類的結(jié)構(gòu) 可以被static修飾 可以被四種權(quán)限修飾
  • 另一方面,作為一個類:
類內(nèi)可以定義屬性、方法、構(gòu)造器等 可以被final修飾,表示此類不能被繼承,言外之意,不適用final,就可以被繼承 可以被abstract修飾

成員內(nèi)部類

  • 如何創(chuàng)建成員內(nèi)部類的對象?(靜態(tài)的,非靜態(tài)的)
//創(chuàng)建靜態(tài)的Dog內(nèi)部類的實例(靜態(tài)成員內(nèi)部類): Person.Dog dog = new Person.Dog();//創(chuàng)建非靜態(tài)的Bird實例(非靜態(tài)的成員內(nèi)部類) Person p = new Person(); Person.Bird bird = p.new Bird();
  • 如何在成員內(nèi)部類中調(diào)用外部類的結(jié)構(gòu)?
class Person{String name="小明";int age; //非靜態(tài)成員內(nèi)部類 class Bird{String name="杜鵑";public void display(String name){System.out.println(name);//方法的形參System.out.println(this.name);//內(nèi)部類的屬性System.out.println(Person.this.name);//外部類的屬性} } }
  • 局部內(nèi)部類的使用
//返回一個實現(xiàn)類Comparable接口的類的對象 public Comparable getComparable(){//創(chuàng)建了一個實現(xiàn)了Comparable接口的類//方式一/*class MyComparable implements Comparable{@Overridepublic int compareTo(Object o) {return 0;}}return new MyComparable();*///方式二return new Comparable() {@Overridepublic int compareTo(Object o) {return 0;}}; }
  • 注意點
在局部內(nèi)部類的方法中(比如:show如果調(diào)用局部內(nèi)部類所聲明的方法(比如:method中的局部變量(比如:num的話 要求局部變量聲明為final的。
JDK7及之前的版本:要求此局部變量顯式的聲明為final的 JDK8及其之后的版本:可以省略final的聲明
  • 總結(jié)
成員內(nèi)部類與局部內(nèi)部類在編譯以后都會生成字節(jié)碼文件。 格式:成員內(nèi)部類:外部類$內(nèi)部類名.class 局部內(nèi)部類:外部類$數(shù)字 內(nèi)部類名.class

總結(jié)

以上是生活随笔為你收集整理的对象属性结构赋值_(六)面向对象-下的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。