區域內部類
- 區域內部類定義在區域位置比如(方法內),就內部類有類名
- 可以直接訪問外部類的所有成員,包括私有的
- 不能添加訪問修飾符,因為他的位置就是一個區域變數,區域變數是不能用訪問修飾符的,但是可以用final修飾,因為區域變數可以用final
- 記住:只能方法中或代碼塊中,它的本質還是一個類
- 區域內部類---訪問----外部類:直接訪問
- 外部類---訪問----區域內部類:需要先創建區域內部類的物件在訪問,注意注意必須要作用域內創建物件
- 外部其他類不能訪問區域內部類
- 如果外部類和內部內部類的方法重名時,則遵循就近原則,如果想訪問外部類的成員則使用,外部類物件.this.成員去訪問
匿名內部類(重要!!!)
- 需求:假如有一個介面需要創建物件,則寫一個類,實作該介面,并創建物件,但是只需要這個實作類使用一次后面不在使用
- 本質還是 一個類,內部類,該類沒有名字(其實底層會給這個類分配名字),該類的本質其實還是一個物件
- 匿名內部類是定義在外部類的區域位置,比如方法中,并沒有類名
- 語法:new 類或介面(引數串列){ 類體 }
- interface A{ }
- 其實匿名內部類是有類名的,只在底層可以看到, A a = new A(){ 重寫介面的方法),A是一個介面,介面是不能被實體化的,但是其實他的底層,編譯型別是介面,這個運行型別是一個匿名內部類
- 最底層,他會有一個類去實作了這個A介面,他的底層分配的類名是:外部類$1,這個類名是底層給我們分配的
- A a = new A(){ 重寫介面的方法 },解釋:new A() 其實 是創建了一個匿名內部類實作了A介面,類名是外部類$1,創建完以后立馬就new了,創建了匿名內部類的實體,并且把這個匿名內部類的實體回傳給了 參考名a
- 可以直接訪問外部類的所有成員,包括私有的
- 不能添加訪問修飾符因為他的地位就是一個區域變數
- 應用實踐
- 方式一:當做實參直接傳遞,簡潔高效
public class ad {
public static void main(String[] args) {
//匿名內部類
a(new Tiger() {
@Override
public void tiger() {
System.out.println("老虎正在叫,,,,,");
}
});
}
////靜態方法,形參是介面型別
public static void a(Tiger tiger){
tiger.tiger();
}
}
//介面
interface Tiger{
void tiger();
}
對比:以下方式不推薦屬于是 硬編碼,推薦用上面的
public static void main(String[] args) {
a(new Animal());
}
////靜態方法,形參是介面型別
public static void a(Tiger tiger){
tiger.tiger();
}
}
//介面
interface Tiger{
void tiger();
}
class Animal implements Tiger{
@Override
public void tiger() {
System.out.println("老虎正在叫,,,");
}
}
- 在舉例
public class Phone { public static void main(String[] args) { oppo oppo = new oppo(); oppo.iA(new A() { @Override public void fun() { System.out.println("我的電話"); } }); oppo.iA(new A() { @Override public void fun() { System.out.println("我的手機"); } }); } } interface A{ void fun(); } class oppo{ public void iA(A a){ a.fun(); } }
成員內部類
- 成員內部類是定義在外部類的成員位置,并沒有static
- 可以訪問外部類的所有成員,包括私有的
- 可以訪問修飾符,因為他的地位就是一個成員
- 作用域:和外部類其他成員一樣,在外部類的成員方法中需要創建內部類的物件,在呼叫
- 成員內部類---訪問----外部類:直接訪問
- 外部類---訪問----成員內部類:需要創建物件,在訪問
- 如果外部類和成員內部類的方法重名時,則遵循就近原則,如果想訪問外部類的成員則使用,外部類物件.this.成員去訪問
靜態內部類
- 靜態內部類定義在外部類的成員位置,并且有static
- 可以外部類所有訪問靜態成員,包括私有的,但不能訪問非靜態的
- 可以訪問修飾符,因為他的地位就是一個成員
- 作用域:和外部類其他成員一樣,在外部類的成員方法中需要創建內部類的物件,在呼叫
- 靜態內部類---訪問----外部類:可以直接訪問外部類的所有靜態成員
- 外部類---訪問----成員內部類:需要創建物件,在訪問
-
public class gsg {
public static void main(String[] args) {
num.da();
}
}
class num{
private static String name = "yc";
public static void sun(){
System.out.println("hello");
}
static class dad{
public void fun(){
System.out.println("fun....."+name);//可以直接訪問外部類的靜態變數
sun();//直接可以訪問外部類的靜態方法
}
}
public static void da(){//外部類訪問 靜態內部類 需要創建物件
dad dad = new dad();
dad.fun();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/438000.html
標籤:Java
上一篇:外部開發人員訪問EC2服務器
