整頓java念書筆記十五之java中的外部類。本站提示廣大學習愛好者:(整頓java念書筆記十五之java中的外部類)文章只能為提供參考,不一定能成為您想要的結果。以下是整頓java念書筆記十五之java中的外部類正文
外部類是指在一個內部類的外部再界說一個類。類名不須要和文件夾雷同。
*外部類可所以靜態static的,也可用public,default,protected和private潤飾。(而內部頂級類即類名和文件名雷同的只能應用public和default)。
媒介
Java從JDK1.1的時刻,就開端引入外部類的概念了,那末小編也經由過程這篇博客來分享一下Java中有關外部類的一些特征。
甚麼是外部類?
在許多情形下,類被界說成一個自力的法式單位,然則有時刻也會把一個類放在另外一個類的外部界說,這個界說在其他類外部的類就稱為外部類。
從語法下去看的話,界說外部類和界說內部類的語法年夜致雷同,外部類除須要界說在其他類外面以外,還存在以下兩點差別。
1.外部類比內部類多應用三個潤飾符:private——protected、static——內部類弗成以應用這三個潤飾符。
2.非靜態外部類不克不及具有靜態成員。
除以上兩點以外,其他的處所都與通俗的類雷同,上面來羅列一下罕見的外部類操作。
非靜態外部類
界說外部類也異常簡略,只需把一個類放在另外一個類外部界說便可,乃至都可以放置在辦法的外部。
<span >package com.test; public class Cow { private double weight; // 內部類的兩個重載的結構器 public Cow(){} public Cow(double weight) { this.weight = weight; } // 界說一個非靜態外部類 private class CowLeg { // 非靜態外部類的兩個實例變量 private double length; private String color; // 非靜態外部類的兩個重載的結構器 public CowLeg(){} public CowLeg(double length , String color) { this.length = length; this.color = color; } // 上面省略length、color的setter和getter辦法 public void setLength(double length) { this.length = length; } public double getLength() { return this.length; } public void setColor(String color) { this.color = color; } public String getColor() { return this.color; } // 非靜態外部類的實例辦法 public void info() { System.out.println("以後牛腿色彩是:" + color + ", 高:" + length); // 直接拜訪內部類的private潤飾的成員變量 System.out.println("本牛腿地點奶牛重:" + weight); //① } } public void test() { CowLeg cl = new CowLeg(1.12 , "诟谇相間"); cl.info(); } public static void main(String[] args) { Cow cow = new Cow(378.9); cow.test(); } } </span>
在上述中非靜態外部類的成員可以拜訪內部類的private成員,但反過去就不成立了。非靜態外部類的成員只在非靜態外部類規模內是可知的,其實不能被內部類直接應用。假如內部類須要拜訪非靜態外部類的成員,則必需顯式創立非靜態外部類對象來挪用拜訪其實例成員。
<span >package com.test; public class Outer { private int outProp = 9; class Inner { private int inProp = 5; public void acessOuterProp() { // 非靜態外部類可以直接拜訪內部類的private成員變量 System.out.println("內部類的outProp值:" + outProp); } } public void accessInnerProp() { // 內部類不克不及直接拜訪非靜態外部類的實例變量, // 上面代碼湧現編譯毛病 // System.out.println("外部類的inProp值:" + inProp); // 如需拜訪外部類的實例變量,必需顯式創立外部類對象 System.out.println("外部類的inProp值:" + new Inner().inProp); } public static void main(String[] args) { // 履行上面代碼,只創立了內部類對象,還未創立外部類對象 Outer out = new Outer(); //① out.accessInnerProp(); } } </span>
留意:非靜態外部類中不克不及有靜態辦法、靜態成員變量、靜態初始化塊。
靜態外部類
假如應用static來潤飾一個外部類,則這個外部類就屬於內部類自己,而不屬於內部類的某個對象,是以應用static潤飾的外部類被稱為類外部類,有的處所也稱為靜態外部類。靜態外部類可以包括靜態成員,也能夠包括非靜態成員。依據靜態成員不克不及拜訪非靜態成員的規矩,靜態外部類不克不及拜訪內部類的實例成員,只能拜訪內部類的類成員。
<span >package com.test; public class StaticInnerClassTest { private int prop1 = 5; private static int prop2 = 9; static class StaticInnerClass { // 靜態外部類裡可以包括靜態成員 private static int age; public void accessOuterProp() { // 上面代碼湧現毛病: // 靜態外部類沒法拜訪內部類的實例變量 System.out.println(prop1); // 上面代碼正常 System.out.println(prop2); } } } </span>
匿名外部類
應用匿名外部類可以創立那種只須要一次應用的類,而且創立匿名外部類時會立刻創立一個該類的實例,然則也須要留意一下規矩
1.匿名外部類不克不及是籠統類,由於體系在創立匿名外部類時,會立刻創立匿名外部類的對象,是以不許可將匿名外部類界說成為籠統類
2.匿名外部類不克不及界說結構器,因為匿名外部類沒有類名,所以沒法界說結構器
<span >package com.test; interface Product { public double getPrice(); public String getName(); } public class AnonymousTest { public void test(Product p) { System.out.println("購置了一個" + p.getName() + ",花失落了" + p.getPrice()); } public static void main(String[] args) { AnonymousTest ta = new AnonymousTest(); // 挪用test()辦法時,須要傳入一個Product參數, // 此處傳入其匿名完成類的實例 ta.test(new Product() { public double getPrice() { return 567.8; } public String getName() { return "AGP顯卡"; } }); } } </span>
上面給年夜家總結以下外部類的個性編纂
(1)、外部類依然是一個自力的類,在編譯以後外部類會被編譯成自力的.class文件,然則後面冠之外部類的類名和$符號 。
(2)、外部類不克不及用通俗的方法拜訪。外部類是內部類的一個成員,是以外部類可以自在地拜訪內部類的成員變量,不管能否是private的 。
(3)、外部類聲明成靜態的,就不克不及隨意的拜訪內部類的成員變量了,此時外部類只能拜訪內部類的靜態成員變量 。