整頓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)、外部類聲明成靜態的,就不克不及隨意的拜訪內部類的成員變量了,此時外部類只能拜訪內部類的靜態成員變量 。