java基礎第九篇之final和內部類等

final關鍵字:final:最終,終極java

 

final:做用:修飾類,變量,方法、成員變量的訪問ide

1.final修飾變量:操作系統

    final修飾局部變量:對象

把這個局部變量 變成一個廠裏,這個廠裏只能被賦值一次繼承

final修飾成員變量:接口

要求這個成員變量 在建立對象以前必須初始化生命週期

因此final修飾的成員變量 第一直覺賦值 第二構造方法賦值內存

可是也只能賦值一次作用域

 

2.final修飾的類:(太監類) ,不能被子類繼承(String)開發

    final修飾的方法:(子類不能重寫)

 

靜態代碼塊:一般寫到成員位置

 *   static {代碼}

靜態成員變量優先於靜態代碼塊執行,優先於構造方法執行,優先於main方法執行

 *

 * 特色1.在同一個類中 靜態代碼塊是優先於構造方法執行,靜態代碼塊優先於main方法

 * 並且只會執行一次,第一次使用到(多是建立對象,也多是調用對象的靜態成員)這個類就是會執行

 

 在jdk1.7版本中局部內部類訪問局部變量必須用final修飾.

由於當調用這個方法時,局部變量若是沒有用final修飾,他的生命週期和方法的生命週期是同樣的,當方法彈棧,這個局部變量也會消失,那麼若是局部內部類對象尚未立刻消失

想用這個局部變量,就沒有了,若是用final修飾會在類的加載的時候進入常量池,即便方法彈棧,常量池的常量還在,也能夠繼續使用.

 

可是在jdk1.8取消了這個事情,因此我認爲是個bug;

 

Student s = new Student()

 

作了哪些事情

1.Student.class加載進內存.

2.聲明一個Student類型引用.

3.在堆內存建立對象.

4.給對象中屬性默認初始化值

5.屬性進行顯示初始化

6.構造方法進棧,對對象中的屬性賦值,構造方法彈棧

7.將對象的地址值賦值給s

 

 

class Fu {

static {

syso("A");

}

 

{

syso("B")

}

 

public Fu() {

syso("C")

}

 

 

}

class Zi extends Fu{

static {

syso("AA");

}

 

{

syso("BB")

}

 

public Zu() {

syso("CC")

}

 

}

class Test {

main {

Zi z = new Zi();

}

}

 

1.Jvm調用了main方法,main進棧

2.遇到Zi z = new Zi();會將Fu.class和zi.class分別加載進內存,再建立對象,當Fu.class加載進內存

父類的靜態代碼塊會隨着u.class一塊兒加載,當Zi.class加載進內存,子類的靜態代碼塊會隨着Zi.class一塊兒加載

第一輸出父類靜態,第二輸出子類靜態

3.走Zi類的構造方法,由於java中分層初始化,先初始化父類,在初始化子類,全部先走父類構造,可是在執行

父類構造時,發現父類有構造代碼塊,構造代碼塊就優先於構造方法執行,因此abstract不能和private,

第三個輸出構造代碼塊Fu,第四個構造方法Fu

4.Fu類初始化結束,子類進行初始化,第五個輸出構造代碼塊zI,構造方法Zi

 

 

1.包:就是文件夾,管理.java文件的,管理.class文件。

 

2.包:以"."分割每個單純,每個單純表明一個文件夾

實際開發中:包的寫法通常是公司的域名倒過來寫

 

3.全限定類名: 包名.類名

    例如:cn.baidu.demo03.PackageDemo

 

4.導包的關鍵字 import

4.1先導包 import java.util.Scanner;

4.2Scanner sc = new Scanner(System.in);

 

在java中有四種權限修飾符:

 

權限從大到小 以此爲:

    public(公共的) protected(受保護的) default(默認的) private(私有的)

 

1.public修飾 在哪裏均可以用(在本包中或者在其餘包中均可以用)

2.private修飾 只能在本包中的本類中可使用

 

protected(受保護的) default(默認的)

 

共同點:這兩個修飾的成員只能在本包中使用

不一樣點:protected修飾的成員的,不一樣包的子類中也可使用

 

內部類:

    在第一個類的內部 再定義第二個類,那麼第二個類稱爲內部類 第一個類稱爲外部類

 

根據內部類定義的位置不一樣

那麼能夠分紅:

 

局部內部類:定義類在方法的裏面,開發歷來不用.

成員內部類:定義類的外部類的成員位置

建立成員內部類對象的格式:

外部類名.內部類名 變量名 = new 外部類().new 內部類();

 

成員內部類的做用:

成員內部類能夠無條件訪問外部類的任何成員.

 

匿名內部類: 一種語法格式,用來快速建立抽象類的子類或者接口的實現類對象

 *

 * 1.建立一個抽象類

 * 2.用一個子類繼承抽象類

 * 3.建立子類的對象

 

  //dd.eat();

//匿名內部類的第一種寫法

new Animal(){

@Override

public void eat() {

// TODO Auto-generated method stub

System.out.println("未知的動物在吃shi");

}

};

//匿名內部類的第二種格式

Animal an = new Animal(){

@Override

public void eat() {

System.out.println("未知的動物在吃shi");

}

};

//匿名內部類的第三種格式

new Animal(){

@Override

public void eat() {

System.out.println("未知的動物在吃粑粑");

}

}.eat();

//用匿名內部類建立接口的實現類對象

NYInterface nvyou = new NYInterface(){

 

@Override

public void cook() {

// TODO Auto-generated method stub

System.out.println("未知的女朋友在給你作飯");

}

 

 

};

 

nvyou.cook();

 

1.類能夠做爲方法的參數和返回值,咱們須要是這個類的對象

 *

 * 2.抽象類也能夠做爲方法的參數和返回值,咱們須要的抽象類子類的對象

 *

 * 3.接口也能夠做爲方法的參數和返回值,咱們須要的接口的實現類對象

 

 2. static 方法與普通方法有什麼區別?

static 方法在內存中只有一份,普通方法在每一個被調用中維持一份拷貝,

static方法屬於類方法隨着類的加載而加載!普通方法屬於對象隨着對象

的建立而存在隨着對象的消失而消失。

 

3.是否能夠在static環境中訪問非static變量?

答:static變量在java中是屬於類的,它在全部實例中的值都是同樣的。

當java虛擬機載入的時候會對static變量進行初始化。若是你的代碼嘗

試不用實例來訪問非static的變量,編譯器會報錯,由於這些變量還沒

有被建立出來,尚未和任何實例關聯上。

 

4.使用final關鍵字修飾一個變量時,是引用不能變,仍是引用的對象不能變?

使用final關鍵字修飾一個變量時,是指引用變量不能變,引用變量所指向的對象中的內容仍是能夠改變的。

請說出做用域public,private,protected,以及不寫時的區別?

這四個做用域的可見範圍以下表所示。

說明:若是在修飾的元素上面沒有寫任何訪問修飾符,則表示空的(default)。

做用域 當前類同一package子孫類其餘package

public √ √ √ √

protected √ √ √ ×

default√ √ × ×

private √ × × ×

 

建立內部類的時候先建立了外部類對象而後才建立內部類對象

 

抽象類要讓子類繼承並重寫抽象方法,使用private修飾便不能被繼承和重寫,使用final修飾也不能被重寫,

使用static修飾,能夠類名直接調用方法,但抽象方法沒有主體調用無心義,因此abstract不能和private,

final,static共用

 

修飾類只能使用public、final、abstract關鍵字,A、B錯;

(2)abstract不能與private、static、final共用,C、D錯;

(3)接口中只有常量和抽象方法,常量修飾符爲public static  final,F錯。

本題主要考查對不一樣修飾符的理解以及它們之間互相組合來使用的注意事項。

 

 

abstract不能和那些關鍵字共存:

 

1:private:由於一個abstract方法須要被重寫,因此不能修飾爲private;

 

2:final:由於一個abstract方法須要被重寫.被final修飾的方法不能被重寫的,因此不能同final共存;

 

3:static:由於一個abstract方法沒有方法體.靜態方法須要對方法體執行內容分配空間,因此不能同static共存;

(abstract是沒有實現的,不能產生對象,而是static是屬於類的,類自己是已經存在的對象)

 

4:synchronized:是同步的,然而同步須要具體的操做才能同步,但,abstract是隻有聲明沒有實現的(既,使用synchronized關鍵字的是須要有具體的實現

同步的操做的,可是使用abstract時只有聲明而沒有實現的,這樣就產生了衝突)

 

5:native:他們自己的定義就是衝突的,native聲明的方法時移交本地操做系統實現的,而abstract是移交子類對象實現的,同時修飾的話,致使不知道誰實現聲明的方法.

 

爲何構造方法不能被繼承?

    能夠這樣理解構造器,構造器就是用來創造對象誕生的。說的形象的就是,你爸和你媽有一個構造器,纔會形成你的出現。你爺和你奶也有個構造器,纔會形成你爸的出現

。 要是構造器能繼承的話,那你爸和你媽能夠沒有本身的構造器。那這樣你就能夠直接從你爺爺和你奶奶的構造器出來了。這不就形成你和你爸,的誕生沒有次序了嘛?

ClassCastException:  類型轉換錯誤

相關文章
相關標籤/搜索