对象属性结构赋值_(六)面向对象-下
(六)面向對象-下
關鍵字:static
static
- 可以用來修飾的結構:主要用來修飾類的內部結構
- 屬性、方法、代碼塊、內部類
- static修飾屬性:靜態變量(類變量
屬性,是否使用static修飾,又分為:靜態屬性vs非靜態屬性(實例變量
實例變量:
我們創建了類的多個對象,每個對象獨立擁一套類中的非靜態屬性。當修改其中一個對象中的靜態屬性 時 不會導致其他對象中同樣的屬性值的修改。
靜態變量:
我們創建了類的多個對象,多個對象共享同一個靜態變量。當通過某一個對象修改靜態變量時會導致其他對象調用此靜態變量時,是修改過的
static修飾屬性的其它說明:
1、靜態變量隨著類的加載而加載
2、靜態變量加載早于對象的創建??梢酝ㄟ^"類.靜態變量"的方式進行調用
3、由于類智慧加載一次,則靜態變量的內存中也只會存在一份:存在方法區的靜態域
?靜態屬性舉例:System.out; Math.PI
- 靜態變量內存解析
- static修飾方法:靜態方法
隨著類的加載而加載,可以通過“類.靜態方法”的方式進行調用
靜態方法中,只能調用靜態的方法或屬性
非靜態方法中,既可以調用靜態的方法或屬性,也可以調用靜態的方法或屬性
- static的注意點 在靜態的方法內,不能使用this關鍵字、super關鍵字 關于靜態屬性和靜態方法的使用,大家都從生命周期的角度去理解
- 如何判定屬性和方法應該使用static關鍵字
關于屬性
屬性可以被多個對象所共享的,不會隨著對象的不同而不同 類中的常量也常常聲明為靜態變量
關于方法
操作靜態屬性的方法通常設置為靜態的 工具類的方法,通常聲明為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;//記錄圓創建的個數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;} }單例模式
- 設計模式的說明
理解:設計模式是在大量的實踐中總結和理論化之后優的代碼結構、編程風格、以及解決問題的思考方式
常用設計模式:23種經典的設計模式
- 單例模式
要解決的問題:所謂 類的單例設計模式,就是采取一定的方法保證在整個的軟件系統中,對某個類只能存在一個對象實例 ,并且該類只提供一個取得其對象實例的方法。
具體代碼的實現:
//餓漢式 class Bank{ //1、私化類的構造器 private Bank(){ }//2、內部創建類的對象//4、提要求對象也為staticprivate static Bank instance = new Bank();//3、提供公共方法,返回類的對象public static Bank getInstance(){return instance;} }//懶漢式 class Order{ //1、私化類的構造器 private Order(){ }//2、聲明當前類的對象//4、此對象聲明為staticprivate static Order instance = null;//3、聲明public的static返回當前類對象的方法public static Order getInstance(){if (instance==null){instance=new Order();}return instance;} }兩種方式的對比:
餓漢式:壞處:對象加載時間過長
好處:餓漢式是線程安全的
懶漢式:好處:延遲對象創建
壞處:線程不安全。---->到多線程內容,在修改
main()的使用說明
main()方法使用說明
- main方法作為程序的入口
- main()方法也是普通的靜態方法
- main()方法可以作為我們與控制臺交互的入口(之前使用Scanner)
- 如何將控制臺獲取的數據傳給形參:String[] args? 運行時:java類名 "tom" "jerry" "123" "true"
sout(args[0]);//tom
public static void main(String[] args)權限修飾符:private 缺省 protected public---->封裝性 修飾符:static final abstract native 可以用來修飾方法 返回類型:無返回值/有返回值--->return 需要滿足標識符命名規范 形參列表:重載vs重寫;參數的值傳遞機制;體現對象的多態性 方法體:來體現方法的功能
類的結構之四:代碼塊
代碼塊
- 代碼塊的作用:用來初始化類、對象的信息
- 分類:代碼塊要是使用修飾符,只能使用static
- 靜態代碼塊
- 非靜態代碼塊
非靜態代碼塊內都可以調用靜態和非靜態的結構
- 實例化子類對象時,涉及到父類、子類中靜態代碼塊、非靜態代碼塊、構造器的加載順序
由父及子,靜態先行。
屬性的賦值順序
- 對屬性可以賦值的位置
關鍵字:final
- 可以用來修飾:類、方法、變量
具體使用說明
- final可以用來修飾的結構:類,方法,變量
- final用來修飾一個類:此類不能被其它類所繼承。比如:String類、System類、StringBuffer類
- final用來修飾方法:表明此方法不可以被重寫,比如:Object類中的getClass();
- final用來修飾變量:此時的“變量”稱為一個常量
- final修飾屬性:可以考慮賦值的位置:顯示初始化、代碼塊中初始化、構造器中
尤其是使用final來修飾形參時,表明該形參是一個常量。當調用此方法時,給常量形參賦一個實參,一旦賦值以后,就只能在方法體內使用此形參,但不能重新賦值。
- static final:用來修飾屬性:全局常量
關鍵字:abstract
- 可以用來修飾:類、方法
具體使用說明
- abstract修飾類、抽象類
- abstract修飾方法、抽象方法
- 注意點
abstract不能用來修飾私方法、靜態方法、final的方法、final的類
- abstract的應用舉例
舉例一
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。在其內部 定義了抽象的read()、write()方法。
模板方法的設計模式
- 解決的問題
換句話說,在軟件開發中實現一個算法時,整體步驟很固定、通用,這些步驟已經在父類中寫好了。但是某些部分易變,易變部分可以抽象出來,供不同子類實現。這就是一種模板模式。
- 舉例
應用場景
關鍵字:interface
- 使用說明
3.1 JDK7及以前:只能定義全局常量和靜態方法 全局常量:public static final的,但是書寫時可以省略不寫 抽象方法:public abstract的
3.2 JDK8:除了定義全局常量和抽象方法之外,還可以定義靜態方法、默認方法(略
4。接口中不能定義構造器的!意味著接口不可以實例化 5、java開發中,接口通過讓類去實現(implements的方式來使用 如果實現類覆蓋了接口中的所抽象方法,則此實現類就可以實例化 如果實現類沒覆蓋接口中所的抽象方法,則此實現類仍為一個抽象類 6/java類可以實現多個接口--->彌補了java的單繼承性的局限性 格式:class AA extends BB implements CC,DD,EE
7、接口與接口之間可以多繼承
8.接口的具體使用,體現多態性 9.接口,實際上可以看做是一種規范
- 舉例
Java8中關于接口的新規范
//知識點1:接口中定義的靜態方法,只能通過接口來調用。//知識點2:通過實現類的對象,可以調用接口中的默認方法 //如果實現類重寫了接口的默認方法,調用時仍然調用重寫的方法//知識點3:如果子類(或實現類繼承的父類和實現的接口中聲明了同名參數的方法, //那么子類在沒重寫此方法的情況下,默認調用的是父類中同名參數的方法---->類優先原則//知識點4:如果實現類實現類多個接口,而多個接口定義了同名同參數的方法, //那么在沒重寫此方法的情況下,報錯。--->接口沖突 //折舊需要我們必須在實現類中重寫此方法//知識點5:如何在自樂(或實現類的方法中調用父類、接口中被重寫的方法 public void myMethod(){method3();//自己定義的重寫方法super.method3();//調用父類的方法//調用接口中的默認方法CompareA.super.method3();CompareB.super.method3();面試題:抽象類和接口的異同?
相同點:不能實例化;都可以包含抽象方法的。 不同點: 1、把抽象類和接口(java7,java8,java9)的定義、內部結構解釋說明 2、類:單繼承性 接口:多繼承性 類與接口:多實現代理模式
- 解決的問題
代理模式是Java開發中使用較多的一種設計模式。代理設計就是為其他對象提供一種代理以控制對這個對象的訪問。
- 舉例
- 應用場景
類的結構之五:內部類
定義
- java中允許將一個類A聲明在類B中,則類A就是內部類,類B稱為外部類
內部類的分類
- 成員內部類(靜態與非靜態vs局部內部類(方法內、代碼塊內、構造器內
成員內部類的理解
- 一方面:作為外部類的成員:
- 另一方面,作為一個類:
成員內部類
- 如何創建成員內部類的對象?(靜態的,非靜態的)
- 如何在成員內部類中調用外部類的結構?
- 局部內部類的使用
- 注意點
JDK7及之前的版本:要求此局部變量顯式的聲明為final的 JDK8及其之后的版本:可以省略final的聲明
- 總結
總結
以上是生活随笔為你收集整理的对象属性结构赋值_(六)面向对象-下的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 插入加锁_MySQL 是怎么
- 下一篇: 安装erlang没有bin文件夹_Cen