1. 程式人生 > >Java類的高階用法總結

Java類的高階用法總結

馬上就要進入10月中旬了,距離開學已經過去整整一個半月了,想想大四的學長學姐們的忙碌的生活,我似乎也感受到了他們內心的躁動,但要淡定,學東西就是要沉住氣,今天先來梳理梳理Java類的高階用法

主要內容:

1、final關鍵字
2、抽象方法及抽象類
3、介面
4、物件陣列
5、內部類

final

1、定義基本資料型別時,可在構造塊和構造方法中進行初始化;
2、 當父類不允許子類重寫某個方法時,可將此方法宣告為final型別,如所有object子類都可以繼承toString方法或equals方法,但不允許繼承getClass方法。
3、 final修飾的方法可以被子類繼承,子類雖然不能重寫父類中的final方法,但是可以過載該方法。
4、

不能使用final修飾構造方法;private和static修飾的方法是隱式的final方法。

抽象類與抽象方法(abstract)

1、 Java中的所有物件都是通過類來描繪的,但是並非所有的類都是用來描述物件的。
2、 抽象類可以不含有抽象方法,也可以含有一個或多個抽象方法,若一個類含有抽象方法,這個類必須宣告為抽象類,即抽象類中可以包含抽象方法和非抽象方法,而普通類只能包含非抽象方法。

4、 抽象類可以定義構造方法,子類構造方法隱含super()即先執行父類構造方法,再執行子類構造方法。

5、 抽象類不能呼叫自身構造方法建立物件,必須通過子類繼承後,由子類建立物件,而普通類可以呼叫自身構造方法建立物件。

6、 若一個類繼承了抽象類,那麼子類必須實現所有的抽象方法,才可以宣告子類為非抽象類,否則子類也必須宣告為抽象類。

7、

介面(interface)

1、 介面是由全域性常量和抽象方法組成的,系統會預設將屬性定為public static final ,而將方法預設定義為public abstract
2、 介面和抽象類:繼承(extends)是針對相同型別的,介面可以一對多,但抽象類只能一對一,實現則只能通過子類實現(implements)抽象類或者介面
3、 介面沒有構造方法,繼承介面後必須將介面中的定義的所有抽象方法實現,子類通過implements

實現介面
4、

物件陣列

類名 物件陣列名稱[ ]= new 類名[陣列長度]

class sc{
    private String name;
    public sc(){

    }
    public sc(String name){
        SetName(name);
    }
    public void SetName(String name){
        this.name=name;
    }
    public String getName(){
        return name;
    }

}

public class School {
    public static void main(String []aegs){
        sc schooll[]=new sc[4];          //這裡就是物件陣列的示例
        schooll[0]=new sc("中國人民大學");
        schooll[1]=new sc("TSHing");
        schooll[2]=new sc("HELLO");
        schooll[3]=new sc("AND YOU");
        for (sc s:schooll){
            System.out.print(s.getName()+" \n");
        }
    }
}

內部類

1、 區域性內部類在外部類中所處的位置不同,可將內部類分為區域性內部類和成員內部類、匿名內部類 其中成員內部類可以分為:例項內部類靜態內部類
這裡寫圖片描述

成員內部類:

2、 非靜態內部類(例項內部類)必須有定義它的外部類的物件例項存在的情況下才能建立。
3、 頂級類只有兩種訪問控制權限(public和預設),內部類有4中訪問許可權:public、protected、預設的和private。
4、 對於非靜態內部類(例項內部類) 以上圖為例:在外部類的非靜態方法中可以通過例項內部類(非靜態內部類)例項化後直接訪問內部類的方法,但在外部類的靜態方法中卻要通過建立外部類例項建立內部類例項才能訪問內部類的方法。
5、 在例項內部類中可以訪問外部類的所有成員,包括私有成員;但在外部類中,不能直接訪問內部類的成員,需要通過內部類的例項去訪問。
6、 對於靜態內部類:既可以宣告非靜態成員,也可以宣告靜態成員。(非靜態內部類只能宣告非靜態成員)
7、 靜態內部類可以直接訪問外部類的靜態成員,但需要通過外部類的例項訪問外部類的非靜態成員.
8、 非靜態內部類可以定義在外部類的任何位置(方法裡外均可以,修飾符可以是public 、protected等,但在方法裡則只有預設的class修飾符。)
靜態內部類只能定義在外部類的最外層,即不能出現在方法裡,應和成員屬性同一級,修飾符有public、protected等(static是必須的)。

成員內部類小結:靜態的各自都有聯絡,非靜態的也各自有聯絡,但靜態與非靜態之間則需要追查到頂級類才能確認關係。(涉及類在虛擬機器記憶體中的位置問題)

區域性內部類

區域性內部類是指定義在方法體內的內部類,區域性內部類僅在該方法中有效,故區域性內部類無法被外部類以外的其他類訪問,故區域性內部類不需要訪問控制符和static修飾符的。
1、 區域性內部類不能定義static成員,可以訪問外部類的所有成員包括私有成員。

2、 若區域性內部類定義在靜態方法體中,區域性內部類不能直接(但可通過外部類例項)訪問外部類的非靜態成員,但可以直接訪問外部類的靜態成員,也可以訪問靜態方法中的區域性變數,類似於靜態內部類卻又沒有static修飾符。

3、 區域性內部類只能訪問所在方法的final型別的引數或變數。就算方法撤銷了,內部類仍可訪問final型別的變數

一、為什麼匿名內部類引數必須為final型別 ?

​ 從程式設計語言的理論上:區域性內部類(即:定義在方法中的內部類),由於本身就是在方法內部(可出現在形式引數定義處或者方法體處),因而訪問方法中的區域性變數(形式引數或區域性變數)是天經地義的.是很自然的。

​二、 困難在何處?到底難在哪兒?

​主要是考慮到區域性變數的生命週期與區域性內部類的物件的生命週期的不一致性! ​
設方法f()被呼叫,從而在它的呼叫棧中生成了變數i,此時產生了一個區域性內部類物件inner_object,它訪問了該區域性變數i
.當方法f()執行結束後,區域性變數i就已死亡了,不存在了.但是區域性內部類物件inner_object還可能
一直存在(只能沒有人再引用該物件時,它才會死亡),它不會隨著方法f()執行結束死亡.這時就會出現了一個”荒唐”結果:區域性內部類物件inner_object要訪問一個已不存在的區域性變數i!

​三、 如何才能實現呢?

當變數是final時,通過將final區域性變數”複製(copy)”一份,複製品直接作為區域性內部中的資料成員.這樣,當局部內部類訪問區域性變數時,其實真正訪問的是這個區域性變數的”複製品”(即:這個複製品就代表了那個區域性變數).因此:當執行棧中的真正的區域性變數死亡時,區域性內部類物件仍可以訪問區域性變數(其實訪問的是”複製品”),給人的感覺:好像是區域性變數的”生命期”延長了.

四、​那麼,現在的核心的問題是: 怎麼才能使得訪問”複製品”與訪問真正的原始的區域性變數,其語義效果是一樣的呢?

1、當變數是final時,若是基本資料型別,由於其值不變,因而:其複製品與原始的量是一樣.語義效果相同.(若:不是final,就無法保證:複製品與原始變數保持一致了,因為:在方法中改的是原始變數,而區域性內部類中改的是複製品)。
2、​當變數是final時,若是引用型別,由於其引用值不變(即:永遠指向同一個物件),因而,其複製品與原始的引用變數一樣,永遠指向同一個物件(由於是final,從而保 證了它只能指向這個物件,再不能指向其它物件),達到了區域性內部類中訪問的複製品與方法程式碼中訪問的原始物件,永遠都是同一個,即:語義效果是一樣的.否則,當方法中改原始變數,而區域性內部類中改複製品時,就無法保證複製品與原始變數保持一致了(因此,它們原本就應該是同一個變數.)。

匿名內部類

1、 匿名內部類沒有構造方法,但是可以呼叫父類的構造方法。
2、 匿名內部類可以訪問外部類的所有成員,但匿名內部類定義在方法之中時,只能訪問方法中的final型別的引數或區域性變數。

內部類編譯後生成位元組碼(.class)的命名規則

一個原始檔可以包含多個類,在編譯時,JVM將會對所有的類生成獨立的位元組碼檔案,但在內部類中時,一個類中可以包含多個類或是多類之間的巢狀關係,那麼生成的類名也是有規律的,
成員內部類的位元組碼命名格式:
外部類名$內部類名.class
其中外部類名指的是成員內部類所在的外部類編譯後的完整命名。

區域性內部類的位元組碼命名格式:
外部類名$n區域性內部類名.class
其中的n表示此區域性內部類名稱第幾次出現,從1開始編號。

匿名內部類位元組碼命名格式
外部類名$n.class
其中的n表示此匿名內部類名稱第幾次出現,從1開始編號。

小結
寫部落格的感覺就像是在生產一樣工藝品似的,不知不覺時間就這麼流逝了,青春莫等閒,鐵杵磨成針。唔到一個道理:先解決到手上的東西,再去擴充套件,又學到了一點點。

相關推薦

Java高階用法總結

馬上就要進入10月中旬了,距離開學已經過去整整一個半月了,想想大四的學長學姐們的忙碌的生活,我似乎也感受到了他們內心的躁動,但要淡定,學東西就是要沉住氣,今天先來梳理梳理Java類的高階用法 主要內容

Python高階用法總結--元

type() 動態語言和靜態語言最大的不同,就是函式和類的定義,不是編譯時定義,而是執行時動態建立的。 比方說我們要定義一個 Hello 的 class ,就寫一個hello.py 模組: class Hello(object): def hello(self, name='wor

Android中Calendar用法總結

jsb ews 寫法 需要 key data- minute bar 來講 Calendar是Android開發中需要獲取時間時必不可少的一個工具類,通過這個類可以獲得的時間信息還是很豐富的,下面做一個總結,以後使用的時候就不用總是去翻書或者查資料了。 在獲取時間之前要先獲

標準C++中的string用法總結

也有 www. empty capacity 技術 第一個 stream 一次 jpg 相信使用過MFC編程的朋友對CString這個類的印象應該非常深刻吧?的確,MFC中的CString類使用起來真的非常的方便好用。但是如果離開了MFC框架,還有沒有這樣使用起來非常方便

標準C++中的string用法總結(轉)

spa 大小 它的 world 包括 文本 語法 ner append() 轉自:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html 相信使用過MFC編程的朋友對CString這個類的印象應該

JAVA的全面總結

java是面向物件: 下面解釋什麼面向物件 JAVA操作都是類中操作如上圖Cat類,例項化可以在main函式中 那麼java本身就是類操作,為什麼還要學習繼承多型介面包? 官方回答:可讀性強,安全性高,程式碼簡化,維護性高,方便查詢錯誤等 下面我要從現實生活的角度

《隨筆十九》—— C++中的 “ 標準 C++ 中的 string 用法總結

目錄 string 類的建構函式 string 類的字元操作 string的特性描述 string類的輸入輸出操作 string的賦值 string的連線 string的比較 string的子串 string的交換 string類的查詢函式 strin

java中this用法總結

1,當局部變數和成員變數重名的時候,在方法中使用this表示成員變數以示區分。 class Demo{ String str = "這是成員變數"; void fun(String str){ System.out.println(str);

對於Java的思路總結1

Java是面向物件的程式設計語言。類用於描述客觀客觀世界某一類物件的共同特徵,而物件則是具體存在。可以把類當作一種自定義型別,可以使用類來定義變數,這種變數統稱為引用變數(引用變數儲存的是堆記憶體中的一塊地址,相當於C語言中的指標),也就是說,所有類都是引用型別。 1定義一個普通類(不包括內

標準C++中的string用法總結[轉載]

原文地址 相信使用過MFC程式設計的朋友對CString這個類的印象應該非常深刻吧?的確,MFC中的CString類使用起來真的非常的方便好用。但是如果離開了MFC框架,還有沒有這樣使用起來非常方便的類呢?答案是肯定的。也許有人會說,即使不用MFC框架,也可以想辦法使用MFC中的API,

java佇列(Queue)用法總結

1.佇列的特點 佇列是一種比較特殊的線性結構。它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。 佇列中最先插入的元素也將最先被刪除,對應的最後插入的元素將最後被刪除。因此佇列又稱為“先進先出”(F

Java中Scanner用法總結

最近在做OJ類問題的時候,經常由於Scanner的使用造成一些細節問題導致程式不通過(最慘的就是網易筆試,由於sc死迴圈了也沒發現,導致AC程式碼也不能通過。。。),因此對Scanner進行了一些總結整理。(我的github:https://github.com

QDir及其用法總結

使用方法 dot 連接 排序。 cep 指向 例如 enable tab 簡介 QDir類提供了訪問系統目錄結構及其內容的與平臺無關的方式。 頭文件:#include <qdir.h> QDir類用來操作路徑名及底層文件系統,獲取關於目錄路徑及文件的相關信息,也

C語言巨集定義高階用法總結

1、巨集定義函式頭 或字串連結   #define Function(name) void Func##name(void) 使用舉例  Function(mytest) { } 編譯器回編譯成 void Funcmytest(void) { } 2、多行巨集定義並在巨集定

Java之抽象(abstract)、介面(interface)的用法總結

導讀: 1、什麼是抽象類(abstract)? 2、如何定義抽象類(abstract)? 3、抽象類(abstract)的作用? 4、何為介面?介面和類的區別? 5、怎麼區分抽象類和介面? 1、抽象類的定義:         Java中宣告一個類時,可以不給出該類的所有

JavaSE(一) IO層次關系和各種IO流的用法總結

思想 單位 out 9.png 什麽 輸入流 謝謝 混亂 體系       今天把IO流的這一知點進行一下總結,因為在之前使用io流的時候,就只知道幾個重點常用的IO類,比如FileInputStream,BufferedInputStream(緩沖流)等等,但是不知道它處

Java中static關鍵字用法總結

副本 大括號 跟著 rac clas main 靜態成員變量 abstract 全局變量 1. 靜態方法 通常,在一個類中定義一個方法為static,那就是說,無需本類的對象即可調用此方法 聲明為static的方法有以下幾條限制: · 它們僅能調用其他的sta

java的加載與初始化總結

name 重復 構造器 存儲空間 iii 成員變量 垃圾處理 創建 遞歸 1、觸發類加載的原因(主動調用與被動調用):     六種主動調用:       1)、創建類的實例(new操作、反射、cloning、反序列化)       2)、調用類的靜態方法       3)

Java總結之二

iter return lib 標準 value next() private 叠代 方法 1)Map接口 關系:Map(接口) HashMap(非抽象子類)、TreeMap(非抽象子類) 在開發中,Map集合的內容多用來查詢,全部輸出的操作較少;而Collection接口