面向对象3(final、static、instanceof、向上/向下转型、初始化次序)
1. final
- 對于基本類型,final 使數值不變;
- 對于引用類型,final 使引用不變,也就不能引用其它對象,但是被引用的對象本身是可以修改的。
可用來修飾類、類的成員、局部變量:
- final修飾的類——不可以被繼承,但可以繼承其他類
- final修飾的方法——不可以被重寫。但若父類中沒有final修飾的方法,子類重寫后,可加final修飾
- private 方法隱式地被指定為 final
- final修飾的變量——成為常量,只可被賦值一次。
- 變量為:引用類型——變量值為對象的地址,地址值不可更改,但是地址內的對象屬性值可以更改
- 變量為:成員變量——需在創建的時候賦值,否則報錯。(當未顯式賦值時,多個構造方法內部均需為其賦值)。
2. static
一般用來修飾類中的成員。
被static修飾的成員屬于這個類,不屬于這個類的某個實例對象,可通過類名直接訪問。
多個對象共享一個static成員變量。
(實例變量:每創建一個實例就會產生一個實例變量,它與該實例同生共死。)
靜態內容優先于對象存在,只能訪問靜態,不能使用this/super(沒有對象,則無this)。
同一個類中,靜態成員只能訪問靜態成員方法/變量。
main()為靜態方法,僅僅為程序入口,它不屬于任何一個對象,可以定義在任何類中。
2.1 靜態變量
又稱為類變量,也就是說這個變量屬于類的。
靜態變量屬于類,只要靜態變量所在的類被加載,這個靜態變量就會被分配空間,在內存中只有一份,所有對象共享這個靜態變量。
實例變量屬于對象,只有對象被創建之后,實例變量才會被分配空間,才能被使用,它在內存中有多個復制。
使用有二種方式:?一個是類名.靜態變量,還有一種是對象.靜態變量。
特別注意:Java中不能在方法體中定義靜態變量(無論該方法是靜態的或是非靜態的)。
2.2 靜態方法
靜態方法在類加載的時候就存在了,它不依賴于任何實例。
靜態方法必須有實現,也就是說它不能是抽象方法(abstract) 。
只能訪問所屬類的靜態字段和靜態方法,方法中不能有 this 和 super 關鍵字。
重要用途:實現單例模式。
單例模式的特點:該類只有一個實例。需要求:
2.3 靜態常量
public static final 修飾
此變量名全部用大寫,多個單詞使用下劃線連接
public static final COMPANY_NAME="HH"。
引用:類名.COMPANY_NAME;
(接口中的成員變量時靜態常量,可用接口名直接訪問)
工具類中的方法大多是靜態的。
2.4 靜態語句塊
靜態語句塊在類初始化時運行一次。
public class A {static {System.out.println("123");} public static void main(String[] args) {A a1 = new A();A a2 = new A();} }2.5 靜態內部類
只有內部類才能被定義為static。
非靜態內部類依賴于外部類的實例,而靜態內部類不需要。
靜態內部類不能訪問外部類的非靜態的變量和方法
public class OuterClass {class InnerClass {public void print(){System.out.println("innerClass");}}static class StaticInnerClass {public void print(){System.out.println("staticInnerClass");}}public static void main(String[] args) {//InnerClass innerClass = new InnerClass(); // ERROR:'OuterClass.this' cannot be referenced from a static contextOuterClass outerClass = new OuterClass();InnerClass innerClass = outerClass.new InnerClass();innerClass.print();StaticInnerClass staticInnerClass = new StaticInnerClass();//OuterClass.StaticInnerClass in = new OuterClass.StaticInnerClass();//OKstaticInnerClass.print();} }輸出:
innerClass
staticInnerClass
2.6 優點:
對對象的共享數據提供單份存儲,節省空間
可直接由類名調用,不用在堆內創建對象。
2.7 缺點
訪問出現局限性(只可訪問靜態)。
3. instanceof
用法:boolean b=對象 instanceof? 數據類型;
Person p1=new Student(); boolean flag1=p1 instanceof Student;//true boolean falg2=p1 instanceof Person;//falseinstanceof通過返回一個布爾值來指出,這個對象是否是:
的實例。
注意:如果對象A為null,則返回false。
4. 向上轉型
自動
將子類對象賦給一個父類引用(多態)
提高了代碼的擴展性
只使用父類共性的內容,無法使用子類特有的功能,要不編譯不通過。
5. 向下轉型
強制
一個已經向上轉型的子類對象可以使用強制類型轉換的格式,將父類引用專為子類引用。
在需使用子類特有功能時
易發生ClassCastException異常,所以轉換前需要進行類型判斷
if(! a? instanceof Dog){...}
Person p=new Student();
Student stu=(Student) p;
如果是直接創建的父類對象,無法向下轉型
6. 初始化
原則:
初始化執行順序:
- 父類靜態變量
- 父類靜態代碼塊
- 子類靜態變量
- 子類靜態代碼塊
- 父類非靜態變量
- 父類非靜態代碼塊
- 父類構造函數
- 子類非靜態變量
- 子類非靜態代碼塊
- 子類構造函數
?
總結
以上是生活随笔為你收集整理的面向对象3(final、static、instanceof、向上/向下转型、初始化次序)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面向对象2(构造方法、抽象类、接口)
- 下一篇: 面向对象4(匿名对象、内部类、包、修饰符