java外部类_Java里什么叫内部类什么叫外部类
展開全部
對普通類(沒有內(nèi)部類的類)來說,62616964757a686964616fe78988e69d8331333337396234內(nèi)部類和外部類都與他無關(guān);對有內(nèi)部類的類來說,它們就是其內(nèi)部類的外部類,外部類是個相對的說法,其實就是有內(nèi)部類的類。
所以,要回答這個問題,只需要講解內(nèi)部類是什么:
Java中的內(nèi)部類共分為四種:
靜態(tài)內(nèi)部類static inner class (also called nested class)
成員內(nèi)部類member inner class
局部內(nèi)部類local inner class
匿名內(nèi)部類anonymous inner class
靜態(tài)內(nèi)部類Static Inner Class
最簡單的內(nèi)部類形式。
類定義時加上static關(guān)鍵字。
不能和外部類有相同的名字。
被編譯成一個完全獨立的.class文件,名稱為OuterClass$InnerClass.class的形式。
只可以訪問外部類的靜態(tài)成員和靜態(tài)方法,包括了私有的靜態(tài)成員和方法。
生成靜態(tài)內(nèi)部類對象的方式為:
OuterClass.InnerClass inner = new OuterClass.InnerClass();
示例代碼:
package com.learnjava.innerclass;
class StaticInner
{
private static int a = 4;
// 靜態(tài)內(nèi)部類
public static class Inner
{
public void test()
{
// 靜態(tài)內(nèi)部類可以訪問外部類的靜態(tài)成員
// 并且它只能訪問靜態(tài)的
System.out.println(a);
}
}
}
public class StaticInnerClassTest
{
public static void main(String[] args)
{
StaticInner.Inner inner = new StaticInner.Inner();
inner.test();
}
}
成員內(nèi)部類Member Inner Class
成員內(nèi)部類也是定義在另一個類中,但是定義時不用static修飾。
成員內(nèi)部類和靜態(tài)內(nèi)部類可以類比為非靜態(tài)的成員變量和靜態(tài)的成員變量。
成員內(nèi)部類就像一個實例變量。
它可以訪問它的外部類的所有成員變量和方法,不管是靜態(tài)的還是非靜態(tài)的都可以。
在外部類里面創(chuàng)建成員內(nèi)部類的實例:
this.new Innerclass();
在外部類之外創(chuàng)建內(nèi)部類的實例:
(new Outerclass()).new Innerclass();
在內(nèi)部類里訪問外部類的成員:
Outerclass.this.member
示例代碼:
package com.learnjava.innerclass;
class MemberInner
{
private int d = 1;
private int a = 2;
// 定義一個成員內(nèi)部類
public class Inner2
{
private int a = 8;
public void doSomething()
{
// 直接訪問外部類對象
System.out.println(d);
System.out.println(a);// 直接訪問a,則訪問的是內(nèi)部類里的a
// 如何訪問到外部類里的a呢?
System.out.println(MemberInner.this.a);
}
}
}
public class MemberInnerClassTest
{
public static void main(String[] args)
{
// 創(chuàng)建成員內(nèi)部類的對象
// 需要先創(chuàng)建外部類的實例
MemberInner.Inner2 inner = new MemberInner().new Inner2();
inner.doSomething();
}
}
局部內(nèi)部類Local Inner Class
局部內(nèi)部類定義在方法中,比方法的范圍還小。是內(nèi)部類中最少用到的一種類型。
像局部變量一樣,不能被public, protected, private和static修飾。
只能訪問方法中定義的final類型的局部變量。
局部內(nèi)部類在方法中定義,所以只能在方法中使用,即只能在方法當(dāng)中生成局部內(nèi)部類的實例并且調(diào)用其方法。
示例代碼:
package com.learnjava.innerclass;
class LocalInner
{
int a = 1;
public void doSomething()
{
int b = 2;
final int c = 3;
// 定義一個局部內(nèi)部類
class Inner3
{
public void test()
{
System.out.println("Hello World");
System.out.println(a);
// 不可以訪問非final的局部變量
// error: Cannot refer to a non-final variable b inside an inner
// class defined in a different method
// System.out.println(b);
// 可以訪問final變量
System.out.println(c);
}
}
// 創(chuàng)建局部內(nèi)部類的實例并調(diào)用方法
new Inner3().test();
}
}
public class LocalInnerClassTest
{
public static void main(String[] args)
{
// 創(chuàng)建外部類對象
LocalInner inner = new LocalInner();
// 調(diào)用外部類的方法
inner.doSomething();
}
}
匿名內(nèi)部類Anonymous Inner Class
匿名內(nèi)部類就是沒有名字的局部內(nèi)部類,不使用關(guān)鍵字class, extends, implements, 沒有構(gòu)造方法。
匿名內(nèi)部類隱式地繼承了一個父類或者實現(xiàn)了一個接口。
匿名內(nèi)部類使用得比較多,通常是作為一個方法參數(shù)。
生成的.class文件中,匿名類會生成OuterClass$1.class文件,數(shù)字根據(jù)是第幾個匿名類而類推。
示例代碼:
package com.learnjava.innerclass;
import java.util.Date;
public class AnonymouseInnerClass
{
@SuppressWarnings("deprecation")
public String getDate(Date date)
{
return date.toLocaleString();
}
public static void main(String[] args)
{
AnonymouseInnerClass test = new AnonymouseInnerClass();
// 打印日期:
String str = test.getDate(new Date());
System.out.println(str);
System.out.println("----------------");
// 使用匿名內(nèi)部類
String str2 = test.getDate(new Date()
{
});// 使用了花括號,但是不填入內(nèi)容,執(zhí)行結(jié)果和上面的完全一致
// 生成了一個繼承了Date類的子類的對象
System.out.println(str2);
System.out.println("----------------");
// 使用匿名內(nèi)部類,并且重寫父類中的方法
String str3 = test.getDate(new Date()
{
// 重寫父類中的方法
@Override
@Deprecated
public String toLocaleString()
{
return "Hello: " + super.toLocaleString();
}
});
System.out.println(str3);
}
}
已贊過
已踩過<
你對這個回答的評價是?
評論
收起
總結(jié)
以上是生活随笔為你收集整理的java外部类_Java里什么叫内部类什么叫外部类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java gc的特性_Java12新特性
- 下一篇: java.io和util的区别_Java