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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

面向对象3(final、static、instanceof、向上/向下转型、初始化次序)

發布時間:2024/10/14 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面向对象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 關鍵字。

重要用途:實現單例模式。

單例模式的特點:該類只有一個實例。需要求:

  • 隱藏類的構造函數(構造函數聲明為private);
  • 提供一個創建對象的方法,通過該類的方法來獲取類的對象(將這個方法聲明為static)。
  • public class Singleton {private static Singleton instance = null;private Singleton(){};public static Singleton getInstance(){if(instance == null){instance = new Singleton();}return instance;} }

    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;//false

    instanceof通過返回一個布爾值來指出,這個對象是否是:

  • 這個特定類或者
  • 它的子類的一個實例或
  • 當前接口的實現類
  • 的實例。

    注意:如果對象A為null,則返回false。

    4. 向上轉型

    自動

    將子類對象賦給一個父類引用(多態)

    提高了代碼的擴展性

    只使用父類共性的內容,無法使用子類特有的功能,要不編譯不通過。

    5. 向下轉型

    強制

    一個已經向上轉型的子類對象可以使用強制類型轉換的格式,將父類引用專為子類引用。

    在需使用子類特有功能時

    易發生ClassCastException異常,所以轉換前需要進行類型判斷

    if(! a? instanceof Dog){...}

    Person p=new Student();

    Student stu=(Student) p;

    如果是直接創建的父類對象,無法向下轉型

    6. 初始化

    原則:

  • 靜態對象(變量)優先于非靜態對象(變量)初始化,其中靜態對象(變量)只初始化一次,非靜態對象(變量)可能初始化很多次;
  • 父類有限域子類進行初始化;
  • 按照成員變量的定義順序進行初始化,即使變量定義散布于方法定義之中,它們依然在任何方法(包括構造函數)被調用之前先初始化
  • 初始化執行順序:

    • 父類靜態變量
    • 父類靜態代碼塊
    • 子類靜態變量
    • 子類靜態代碼塊
    • 父類非靜態變量
    • 父類非靜態代碼塊
    • 父類構造函數
    • 子類非靜態變量
    • 子類非靜態代碼塊
    • 子類構造函數

    ?

    總結

    以上是生活随笔為你收集整理的面向对象3(final、static、instanceof、向上/向下转型、初始化次序)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。