Java基礎語法-第九節-面向物件下
static關鍵字
-
引入:當我們編寫一個類時,其實就是在描述其物件的屬性和行為,而並沒有產生實質上的物件,只有通過new關鍵字才會產生出物件,這時系統才會分配記憶體空間給物件,其方法才可以供外部呼叫。我們有時候希望無論是否產生了物件或無論產生了多少物件的情況下,某些特定的資料在記憶體空間裡只有一份,例如所有的中國人都有個國家名稱,每一箇中國人都共享這個國家名稱,不必在每一箇中國人的例項物件中都單獨分配一個用於代表國家名稱的變數。
-
類屬性作為該類各個物件之間共享的變數。在設計類時,分析哪些屬性不因物件的不同而改變,將這些屬性設定為類屬性。相應的方法設定為類方法。
-
如果方法與呼叫者無關,則這樣的方法通常被宣告為類方法,由於不需要建立物件就可以呼叫類方法,從而簡化了方法的呼叫。
-
使用範圍:
- 在Java類中,可用static修飾屬性、方法、程式碼塊、內部類
- 只能在靜態型別類或頂級型別類中才能宣告靜態方法
-
被修飾後的成員具備以下特點:
- 隨著類的載入而載入
- 優先於物件存在
- 修飾的成員,被所有物件所共享
- 訪問許可權允許時,可不建立物件,直接被類呼叫
-
static修飾屬性:靜態屬性(類屬性)
- 類變數(類屬性)由該類的所有例項共享
- 靜態屬性隨著類的載入而載入,可以通過“類.靜態屬性”的方式進行呼叫
- 可以通過類名呼叫靜態屬性而不能呼叫非靜態屬性,可以通過物件呼叫靜態屬性和非靜態屬性
-
static修飾方法:靜態方法(類方法)
- 沒有物件的例項時,可以用類名.方法名()的形式訪問由static修飾的類方法。在static方法內部只能訪問類的static修飾的屬性或方法,不能訪問類的非static的結構。
- 因為不需要例項就可以訪問static方法,因此static方法內部不能有this和super。
- static修飾的方法不能被重寫
-
main()方法的說明:
- 由於Java虛擬機器需要呼叫類的main()方法,所以該方法的訪問許可權必須是public,又因為Java虛擬機器在執行main()方法時不必建立物件,所以該方法必須是static的,該方法接收一個String型別的陣列引數,該陣列中儲存執行Java命令時傳遞給所執行的類的引數。
- 又因為main() 方法是靜態的,我們不能直接訪問該類中的非靜態成員,必須建立該類的一個例項物件後,才能通過這個物件去訪問類中的非靜態成員,這種情況,我們在之前的例子中多次碰到
類的成員之四:程式碼塊
-
程式碼塊(或初始化塊)的作用: 對Java類或物件進行初始化
-
程式碼塊(或初始化塊)的分類:
- 一個類中程式碼塊若有修飾符,則只能被static修飾,稱為靜態程式碼塊
- 沒有使用static修飾的,為非靜態程式碼塊。
-
static程式碼塊通常用於初始化static的屬性
-
靜態程式碼塊:用static 修飾的程式碼塊
- 可以有輸出語句。
- 可以對類的屬性、類的宣告進行初始化操作。
- 不可以對非靜態的屬性初始化。即:不可以呼叫非靜態的屬性和方法。
- 若有多個靜態的程式碼塊,那麼按照從上到下的順序依次執行。
- 靜態程式碼塊的執行要先於非靜態程式碼塊。
- 靜態程式碼塊隨著類的載入而載入,且只執行一次。
-
非靜態程式碼塊:沒有static修飾的程式碼塊
- 可以有輸出語句。
- 可以對類的屬性、類的宣告進行初始化操作。
- 除了呼叫非靜態的結構外,還可以呼叫靜態的變數或方法。
- 若有多個非靜態的程式碼塊,那麼按照從上到下的順序依次執行。
- 每次建立物件的時候,都會執行一次。且先於構造器執行。
-
程式中成員變數賦值的執行順序
final關鍵字
-
在Java中宣告類、變數和方法時,可使用關鍵字final來修飾,表示“最終的”。
-
final標記的類不能被繼承。提高安全性,提高程式的可讀性。
- 比如:String類、System類、StringBuffer類
-
final標記的方法不能被子類重寫。
- 比如:Object類中的getClass()。
-
final標記的變數(成員變數或區域性變數)即稱為常量。名稱大寫,且只能被賦值一次。
- final標記的成員變數必須在宣告時或在每個構造器中或程式碼塊中顯式賦值,然後才能使用。
-
static final:全域性常量
抽象類和抽象方法
-
隨著繼承層次中一個個新子類的定義,類變得越來越具體,而父類則更一般,更通用。類的設計應該保證父類和子類能夠共享特徵。有時將一個父類設計得非常抽象,以至於它沒有具體的例項,這樣的類叫做抽象類。
-
用abstract關鍵字來修飾一個類,這個類叫做抽象類。
abstract class Person{ }
-
用abstract來修飾一個方法,該方法叫做抽象方法。
- 抽象方法:只有方法的宣告,沒有方法的實現。以分號結束:
public abstract void eat();
-
含有抽象方法的類必須被宣告為抽象類。
-
抽象類不能被例項化。抽象類是用來被繼承的,抽象類的子類必須重寫父類的抽象方法,並提供方法體。若沒有重寫全部的抽象方法,仍為抽象類
-
不能用abstract修飾變數、程式碼塊、構造器;
-
不能用abstract修飾私有方法、靜態方法、final的方法、final的類。
-
抽象類是用來模型化那些父類無法確定全部實現,而是由其子類提供具體實現的物件的類。
-
多型的應用:模板方法設計模式(TemplateMethod)
- 抽象類體現的就是一種模板模式的設計,抽象類作為多個子類的通用模板,子類在抽象類的基礎上進行擴充套件、改造,但子類總體上會保留抽象類的行為方式。
- 解決的問題:
- 當功能內部一部分實現是確定的,一部分實現是不確定的。這時可以把不確定的部分暴露出去,讓子類去實現。
- 換句話說,在軟體開發中實現一個演算法時,整體步驟很固定、通用,這些步驟已經在父類中寫好了。但是某些部分易變,易變部分可以抽象出來,供不同子類實現。這就是一種模板模式
- 模板方法設計模式是程式設計中經常用得到的模式。各個框架、類庫中都有他的影子,比如常見的有:
- 資料庫訪問的封裝
- Junit單元測試
- JavaWeb的Servlet中關於doGet/doPost方法呼叫
- Hibernate中模板程式
- Spring中JDBCTemlate、HibernateTemplate等
-
匿名物件的使用
public class AbstraceTest { public static void main(String[] args) { //非匿名的類(Student)匿名物件 method2(new Student());//吃飯 //非匿名的類(Student)非匿名的物件(s) Student s = new Student(); method1(s);//吃飯 //建立了一個匿名子類的物件p Person p = new Person() { @Override public void eat() { System.out.println("匿名吃飯"); } }; method1(p);//匿名吃飯 //建立匿名子類的匿名物件 method1(new Person() { @Override public void eat() { System.out.println("匿名子類吃飯"); } });//匿名子類吃飯 } public static void method1(Person person) { person.eat(); } public static void method2(Student student) { student.eat(); } } abstract class Person{ public abstract void eat(); } class Student extends Person{ @Override public void eat() { System.out.println("吃飯"); } }
介面(interface)
-
一方面,有時必須從幾個類中派生出一個子類,繼承它們所有的屬性和方法。但是,Java不支援多重繼承。有了介面,就可以得到多重繼承的效果。
-
另一方面,有時必須從幾個類中抽取出一些共同的行為特徵,而它們之間又沒有is-a的關係,僅僅是具有相同的行為特徵而已。
-
介面就是規範,定義的是一組規則,體現了現實世界中“如果你是/要...則必須能...”的思想。繼承是一個"是不是"的關係,而介面實現則是 "能不能"的關係。
-
介面的本質是契約,標準,規範,就像我們的法律一樣。制定好後大家都要遵守。
-
介面(interface)是抽象方法和常量值定義的集合。
-
介面的特點:
- 用interface來定義。
- 介面中的所有成員變數都預設是由public static final修飾的。(JDK7及以前)
- 介面中的所有抽象方法都預設是由public abstract修飾的。 (JDK7及以前)
- 介面中還支援靜態方法和預設方法。(JDK8及以後)
- 介面中沒有構造器。
- 介面採用多繼承機制。
//介面的定義 public interface Person{ //常量 public static final int MAX_NUM = 1; //抽象方法 public abstract void show(); //預設方法 public default void eat() { System.out.println("eat"); } //靜態方法 public static void work() { System.out.println("work"); } }
-
定義Java類的語法格式:先寫extends,後寫implements
例如:class A extends B implements C{ }
-
一個類可以實現多個介面,介面也可以繼承其它介面。
-
實現介面的類中必須提供介面中所有方法的具體實現內容,方可例項化。否則,仍為抽象類。
-
介面的主要用途就是被實現類實現。(面向介面程式設計)
-
與繼承關係類似,介面與實現類之間存在多型性
-
介面和類是並列關係,或者可以理解為一種特殊的類。
-
介面的應用:
- 代理模式:代理模式是Java開發中使用較多的一種設計模式。代理設計就是為其他物件提供一種代理以控制對這個物件的訪問
- 應用場景:
- 安全代理:遮蔽對真實角色的直接訪問。
- 遠端代理:通過代理類處理遠端方法呼叫(RMI)
- 延遲載入:先載入輕量級的代理物件,真正需要再載入真實物件
- 分類
- 靜態代理(靜態定義代理類)
- 動態代理(動態生成代理類)
- 應用場景:
- 工廠模式:實現了建立者與呼叫者的分離,即將建立物件的具體過程遮蔽隔離起來,達到提高靈活性的目的。
- 代理模式:代理模式是Java開發中使用較多的一種設計模式。代理設計就是為其他物件提供一種代理以控制對這個物件的訪問
-
介面與抽象類之間的對比
| No. | 區別點 | 抽象類 | 介面|
| ---- | ---- | ---- | ----|
| 1 |定義 | 包含抽象方法的類 | 主要是抽象方法和全域性常量的集合|
| 2 |組成 |構造方法、抽象方法、普通方法、常量、變數 | 常量、抽象方法、(jdk8.0:預設方法、靜態方法) |
| 3 |使用 |子類繼承抽象類(extends)| 子類實現介面(implements)|
|4 |關係 |抽象類可以實現多個介面 |介面不能繼承抽象類,但允許繼承多個介面|
| 5 |常見設計模式 |模板方法 |簡單工廠、工廠方法、代理模式|
| 6 |物件 |都通過物件的多型性產生例項化物件||
| 7 |侷限| 抽象類有單繼承的侷限 |介面沒有此侷限|
| 8 |實際| 作為一個模板|是作為一個標準或是表示一種能力|
| 9 | 選擇| 如果抽象類和介面都可以使用的話,優先使用介面, |因為避免單繼承的侷限| -
在開發中,常看到一個類不是去繼承一個已經實現好的類,而是要麼繼承抽象類,要麼實現介面。
JDK 8關於介面的改進
- Java 8中,你可以為介面新增靜態方法和預設方法。從技術角度來說,這是完全合法的,只是它看起來違反了介面作為一個抽象定義的理念。
- 靜態方法:使用 static 關鍵字修飾。可以通過介面直接呼叫靜態方法,並執行其方法體。我們經常在相互一起使用的類中使用靜態方法。你可以在標準庫中找到像Collection/Collections或者Path/Paths這樣成對的介面和類。
- 預設方法:預設方法使用 default 關鍵字修飾。可以通過實現類物件來呼叫。我們在已有的介面中提供新方法的同時,還保持了與舊版本程式碼的相容性。
- 比如:java 8 API中對Collection、List、Comparator等介面提供了豐富的預設方法
- 若一個介面中定義了一個預設方法,而另外一個介面中也定義了一個同名同參數的方法(不管此方法是否是預設方法),在實現類同時實現了這兩個介面時,會出現:介面衝突。
- 解決辦法:實現類必須覆蓋介面中同名同參數的方法,來解決衝突。
- 若一個介面中定義了一個預設方法,而父類中也定義了一個同名同參數的非抽象方法,則不會出現衝突問題。因為此時遵守:類優先原則。介面中具有相同名稱和引數的預設方法會被忽略。
類的成員之五:內部類
-
當一個事物的內部,還有一個部分需要一個完整的結構進行描述,而這個內部的完整的結構又只為外部事物提供服務,那麼整個內部的完整結構最好使用內部類。
-
在Java中,允許一個類的定義位於另一個類的內部,前者稱為內部類,後者稱為外部類。
-
內部類一般用在定義它的類或語句塊之內,在外部引用它時必須給出完整的名稱。
- 內部類的名字不能與包含它的外部類類名相同;
-
分類:
- 成員內部類(static成員內部類和非static成員內部類)
- 區域性內部類(不談修飾符)、匿名內部類
-
成員內部類作為類的成員的角色:
- 和外部類不同,內部類還可以宣告為private或protected。
- 可以呼叫外部類的結構
- 內部類可以宣告為static的,但此時就不能再使用外層類的非static的成員變數。
-
成員內部類作為類的角色:
- 可以在內部定義屬性、方法、構造器等結構
- 可以宣告為abstract類 ,因此可以被其它的內部類繼承
- 可以宣告為final的
- 編譯以後生成OuterClass$InnerClass.class位元組碼檔案(也適用於區域性內部類)
-
注意
- 非static的成員內部類中的成員不能宣告為static的,只有在外部類或static的成員內部類中才可宣告static成員。
- 外部類訪問成員內部類的成員,需要“內部類.成員”或“內部類物件.成員”的方式
- 成員內部類可以直接使用外部類的所有成員,包括私有的資料
- 當想要在外部類的靜態成員部分使用內部類時,可以考慮內部類宣告為靜態的
-
如何宣告區域性內部類
class 外部類{ 方法(){ class 區域性內部類{ } } { class 區域性內部類{ } } }
-
如何使用區域性內部類
- 只能在宣告它的方法或程式碼塊中使用,而且是先聲明後使用。除此之外的任何地方都不能使用該類
- 內部類仍然是一個獨立的類,在編譯之後內部類會被編譯成獨立的.class檔案,但是前面冠以外部類的類名和$符號,以及數字編號。
- 只能在宣告它的方法或程式碼塊中使用,而且是先聲明後使用。除此之外的任何地方都不能使用該類。
- 區域性內部類可以使用外部類的成員,包括私有的。 區域性內部類可以使用外部方法的區域性變數,但是必須是final的。由區域性內部類和區域性變數的宣告週期不同所致。
- 區域性內部類和區域性變數地位類似,不能使用public,protected,預設,private
- 區域性內部類不能使用static修飾,因此也不能包含靜態成員
-
匿名內部類不能定義任何靜態成員、方法和類,只能建立匿名內部類的一個例項。一個匿名內部類一定是在new的後面,用其隱含實現一個介面或實現一個類。
-
格式:
new 父類構造器(實參列表)|實現介面(){ //匿名內部類的類體部分 }
-
匿名內部類的特點
-
匿名內部類必須繼承父類或實現介面
-
匿名內部類只能有一個物件
-
匿名內部類物件只能使用多型形式引用
public class AbstraceTest {
public String name;
public int age = 10;
public void eat() {
}
//靜態成員內部類
static class Person{
public String name;
public int age;
public void eat() {
}
}
//非靜態成員內部類
public class Student{
public String name;
public int age;
public void eat() {
AbstraceTest.this.age = 11;
}
public void show() {
//呼叫內部類的屬性
System.out.println(this.name);
//呼叫外部類的屬性
System.out.println(AbstraceTest.this.name);
//呼叫內部類的方法
this.eat();
//呼叫外部類的方法
AbstraceTest.this.eat();
}
}
//開發中的使用
public Comparable getComparable() {
int num ;
class MyComparable implements Comparable{
@Override
public int compareTo(Object o) {
// TODO 自動生成的方法存根
return 0;
}
}
return new MyComparable();
}
}
總結
/**
* static關鍵字的使用
* 1.static:靜態的
* 2.static可以用來修飾:屬性,方法,程式碼塊,內部類
* 3.使用static修飾屬性:靜態變數(類變數)
* 3.1屬性,按是否使用static修飾,屬性分為靜態屬性vs非靜態屬性(例項變數)
* 例項屬性:我們建立了類的多個物件,每個物件都獨立的擁有一套類中的非靜態屬性。
* 當修改其中的一個物件中的 非靜態屬性時,不會導致其他物件中同樣的屬性值的修改
* 靜態屬性:我們建立了類的多個物件,多個物件共享同一個靜態屬性。
* 當通過類或某個物件修改靜態屬性時, 會導致其他物件呼叫此靜態屬性時,值是修改過的。
* 3.2補充說明:
* ①:靜態屬性隨著類的載入而載入,可以通過“類.靜態屬性”的方式進行呼叫
* ②:靜態屬性的載入要早於物件的建立
* ③:由於類只會載入一次,則靜態屬性在記憶體中也只會存在一份(存放在方法區的靜態域中)
* ④:可以通過 類名 呼叫靜態屬性而不能呼叫非靜態屬性
* 可以通過 物件 呼叫靜態屬性和非靜態屬性
* 3.3舉例:System.out Math.PI
* 4.使用static修飾方法:靜態方法
* 4.1隨著類的載入而載入,可以通過“類.靜態方法”的方式進行呼叫
* 4.2靜態方法中只能呼叫靜態的方法和屬性
* 4.3非靜態方法中可以呼叫非靜態的屬性和方法,也可以呼叫靜態的屬性和方法
* 4.4可以通過 類名 呼叫靜態方法而不能呼叫非靜態方法
* 可以通過 物件 呼叫靜態方法和非靜態方法
* 5.static注意點:
* 5.1在靜態的方法內,不能使用this關鍵字,super關鍵字
* 5.2關於靜態屬性和靜態方法的使用,都會從生命週期的角度去理解
* 6.開發中如何確定一個屬性是否要宣告為static的?
* >屬性是可以被多個物件所共享的,不會隨著物件的不同而不同 >類中的常量也經常被設定為static的
* 開發中如何確定一個方法是否要宣告為static的?
* >操作靜態屬性的方法,通常設定為static的
* >工具類中的方法,習慣上宣告為static的。比如:Math,Arrays,Collections
* 7.main()方法的使用說明:
* >main()方法作為程式的入口
* >main()方法也是一個普通的靜態方法
* >mian()方法可以作為我們與控制檯互動的方法
*
* 類的成員之四:程式碼塊
* 1.程式碼塊的作用:初始化類,物件
* 2.程式碼塊的修飾符只能是static
* 3.分類:靜態程式碼塊vs非靜態程式碼塊
* 4.靜態程式碼塊
* >內部可以有輸出語句
* >隨著類的載入而執行,而且只執行一次
* >作用:初始化類的資訊
* >如果一個類中定義了多個靜態程式碼塊,則按照宣告的先後順序執行
* >靜態程式碼塊的執行要有優先於非靜態程式碼塊的執行
* >靜態程式碼塊內只能呼叫靜態屬性,靜態的方法。不能呼叫非靜態的屬性和方法 5.非靜態程式碼塊
* >內部可以有輸出語句
* >隨著物件的建立而執行
* >每次建立一個物件,就執行一次非靜態程式碼塊
* >作用:可以在建立物件時,對物件的屬性等進行初始化
* >如果一個類中定義了多個非靜態程式碼塊,則按照宣告的先後順序執行
* >非靜態程式碼塊內可以呼叫靜態屬性,靜態的方法。也能呼叫非靜態的屬性和方法
*
* 對屬性賦值的位置:
* ①預設初始化
* ②顯式初始化
* ③構造器中初始化
* ④通過“物件.屬性”或“物件.方法”的方式進行復制
* ⑤在程式碼塊中進行初始化
* 順序:① - ②/⑤ - ③ - ④
* 補從與說明:對於只有非靜態程式碼塊和非靜態屬性來說②和⑤誰在類的前面先執行誰。
* 對於靜態程式碼塊和靜態屬性來說來說②和⑤誰在類的前面先執行誰。
* 對於靜態程式碼塊和非靜態程式碼塊和靜態屬性來說。非靜態程式碼塊在最後執行且不受位置的影響
* 關於程式碼塊與構造器的執行順序: 舉例:爺,父,兒三者之間的關係。主函式中呼叫子類的構造器 。
* 輸出順序:爺的靜態程式碼塊 - 父的靜態程式碼塊 - 兒的靜態程式碼塊
* - 爺的非靜態程式碼塊 - 爺的無參構造器 - 父的非靜態程式碼塊
* - 父的無參構造器 - 兒的非靜態程式碼塊 - 兒的構造器
*
* final關鍵字
* 1.final可以用來修飾的結構:類,方法,變數
* 2.final用來修飾一個類:此類不能被其他類繼承。
* 比如:String類,System類
* 3.final用來修飾方法:表明此方法不可以被重寫 比如:Object類中getClass();
* 4.final用來修飾變數:此時的變數就稱為是一個常量
* 4.1 final修飾屬性:可以考慮賦值的位置有:顯式初始化,程式碼塊中初始化,構造器中初始化(屬性不能是靜態的)
* 4.2 final修飾變數:final可以修飾形參和實參,但是一旦被賦值後這個變數可以被使用但不能改變值
* static和final在一起通常修飾和全域性變數
*
* abstract關鍵字
* 1.abstract:抽象的
* 2.abstract可以用來修飾的結構:類,方法
* 3.abstract修飾類:抽象類
* >此類不能被例項化
* >抽象類中一定有構造器,便於子類例項化時呼叫
* >開發中都會提供抽象類的子類,讓子類物件例項化,完成對抽象類的使用
* 4.abstract修飾方法:抽象方法
* >抽象方法只有方法的宣告,沒有方法體
* >包含抽象方法的類,一定是一個抽象類。反之,抽象類中可以沒有抽象的方法
* >若子類重寫了父類中的所有的抽象的方法後,此子類方可例項化
* 若子類沒有重寫父類中的所有抽象方法,則此子類也是一個抽象類,需使用abstract修飾
* 5.注意點
* >abstract不能修飾:屬性,構造器等結構
* >abstract不能修飾私有方法,靜態方法,final的方法,final的類
*
* 介面的使用
* 1.介面使用interface定義
* 2.Java中,介面和類是並列的兩個結構
* 3.如何定義介面:定義介面中的成員
* 3.1 JDK7及以前:只能定義全域性常量和抽象方法
* >全域性常量:public static final修飾的。書寫時可以將修飾符省略不寫
* >抽象方法:public abstract修飾的。書寫時可以將修飾符省略不寫
* 3.2 JDK8及以後:除了定義全域性常量和抽象方法,還可以定義靜態方法,預設方法
* >介面中定義的靜態方法,只能通過此介面來呼叫
* >通過介面的實現類的物件,可以呼叫介面中的預設方法。如果實現類重寫了預設方法,則呼叫的重寫以後的方法
* >如果子類(實現類)繼承的父類和實現的介面中聲明瞭同名同參的方法
* 那麼子類在沒有重寫此方法的情況下,預設呼叫的時父類中同名同參的方法。--->體現了類優先原則
* >如果實現類實現的多個介面中聲明瞭同名同參的方法。
* 實現類在沒有重寫此方法的情況下會報錯(介面衝突)。此時實現類編寫重寫此方法
* >在實現類中呼叫介面中的預設方法 的格式:介面名.super.方法名
* >在實現類中呼叫介面中的靜態方法 的格式:介面名.方法名
* 4.介面中不能定義構造器的!意味著介面不可以例項化
* 5.Java開發中,介面通過讓類去實現(implements)的方式來使用
* 若實現類覆蓋了介面中的所有的抽象方法,則此實現類就可以例項化
* 若實現類沒有覆蓋介面中的所有的抽象方法,則此實現類只能是一個抽象類
* 6.Java類可以實現多個介面 -->彌補了Java單繼承性的侷限性
* 格式:class A extends b implements c,d,e{}
* 7.介面的使用:
* >介面與介面之間可以繼承,而且可以多繼承
* >介面的具體使用,體現多型性
* >介面,實際上可以看做是一種規範
* >介面像多型性一樣有著匿名的使用
* 8.介面的應用:代理模式,工廠模式
*
* 類的內部成員之五:內部類
* 1.Java中允許將一個類A宣告在另一個類B中,則類A就是內部類,類B被成為外部類
* 2.內部類的分類: 成員內部類(靜態的,非靜態的) vs 區域性內部類(方法內,程式碼內,構造器內的類)
* 3.成員內部類:
* 作為外部類的成員:
* >呼叫外部類的結構
* >可以被static修飾
* >可以被4種不同的許可權符修飾
* 作為一個類:
* >類內可以定義屬性,方法名,構造器等
* >可以被final修飾,表示此類不可以被繼承
* >可以被abstract修飾
* 4.內部類的使用
* 4.1 如何例項化成員內部類的物件
* ①對於非靜態內部類:父類名.內部類名 物件名 = new 父類名.內部類的構造方法;
* ②對於靜態內部類:先建立父類的物件:父類名 父物件名 = new 父類的構造方法();
* 然後建立內部類的物件:父類名.內部類名 物件名 = 父物件名.new 內部類的構造方法;
* 4.2 如何在成員內部類種區分呼叫外部類的結構
* ① 當內部類的屬姓名和方法名和外部類的相同時。呼叫格式如下
* 呼叫外部類的屬性和方法:外部類名.this.方法名/屬性
* 呼叫內部類的屬性和方法:this.方法名/屬性
* ② 當內部類的屬姓名和方法名和外部類的不相同時,直接呼叫即可,不用加字首
* 4.3 開發中區域性內部類的使用
* 5.注意點:當在一個方法A中定義一個內部類時,在這個內部類中再定義一個方法B。
* 如果方法A中有一個變數。當方法B中想要使用這個變數時,這個變數不能被修改
* 相當於一個常量。
* JDK 7及以前需要再這個變數前加final才能被方法B使用
* JDK 8及以後則不需要加final
* 原因:內部類的位元組碼檔案是會和外部類平級的,在內部類中呼叫的外部類的方法中的變數是一個副本,副本不能被改變
*