对象属性结构赋值_(六)面向对象-下
(六)面向?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)存解析
- 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)代碼塊
- 非靜態(tài)代碼塊
非靜態(tài)代碼塊內(nèi)都可以調(diào)用靜態(tài)和非靜態(tài)的結(jié)構(gòu)
- 實例化子類對象時,涉及到父類、子類中靜態(tài)代碼塊、非靜態(tài)代碼塊、構(gòu)造器的加載順序
由父及子,靜態(tài)先行。
屬性的賦值順序
- 對屬性可以賦值的位置
關(guān)鍵字:final
- 可以用來修飾:類、方法、變量
具體使用說明
- final可以用來修飾的結(jié)構(gòu):類,方法,變量
- final用來修飾一個類:此類不能被其它類所繼承。比如:String類、System類、StringBuffer類
- final用來修飾方法:表明此方法不可以被重寫,比如:Object類中的getClass();
- final用來修飾變量:此時的“變量”稱為一個常量
- final修飾屬性:可以考慮賦值的位置:顯示初始化、代碼塊中初始化、構(gòu)造器中
尤其是使用final來修飾形參時,表明該形參是一個常量。當(dāng)調(diào)用此方法時,給常量形參賦一個實參,一旦賦值以后,就只能在方法體內(nèi)使用此形參,但不能重新賦值。
- static final:用來修飾屬性:全局常量
關(guān)鍵字:abstract
- 可以用來修飾:類、方法
具體使用說明
- abstract修飾類、抽象類
- abstract修飾方法、抽象方法
- 注意點
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)。這就是一種模板模式。
- 舉例
應(yīng)用場景
關(guān)鍵字:interface
- 使用說明
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ī)范
- 舉例
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è)計就是為其他對象提供一種代理以控制對這個對象的訪問。
- 舉例
- 應(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)部類的理解
- 一方面:作為外部類的成員:
- 另一方面,作為一個類:
成員內(nèi)部類
- 如何創(chuàng)建成員內(nèi)部類的對象?(靜態(tài)的,非靜態(tài)的)
- 如何在成員內(nèi)部類中調(diào)用外部類的結(jié)構(gòu)?
- 局部內(nèi)部類的使用
- 注意點
JDK7及之前的版本:要求此局部變量顯式的聲明為final的 JDK8及其之后的版本:可以省略final的聲明
- 總結(jié)
總結(jié)
以上是生活随笔為你收集整理的对象属性结构赋值_(六)面向对象-下的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 插入加锁_MySQL 是怎么
- 下一篇: 家装强电弱电布线图_强弱电布线注意事项,