内部類
内部類分為:成員内部類、靜态内部類、局部内部類、匿名内部類
1、成員内部類: 成員内部類類似于成員變量,定義在類中,和屬性|方法對齊。
//外部類類名.内部類類名 内部類對象名 = 外部類對象名.new 内部類類名();
class Inner{
private String inner_field = "内部類的成員變量";
int a = 100;//内部類成員變量
//static int c;//成員内部類中不能定義靜态成員
public void inner_method() {
int a = 10;//局部變量
System.out.println(a);//局部變量
System.out.println(this.a);//内部類的同名成員變量
System.out.println(Outer.this.a);//外部類的同名成員變量
System.out.println("内部類的成員方法");
System.out.println(inner_field);//内部類成員變量
System.out.println(outer_field);//外部類的私有成員變量
}
}
Outer outer = new Outer();
outer.out_method();
//建立成員内部類對象必須借助于外部類對象名
Outer.Inner inner = outer.new Inner();
inner.inner_method();
2、靜态内部類: 類似于靜态屬性,定義在類中,方法的外面,被static修飾
//文法
//外部類類名.靜态内部類類名.靜态屬性;
//外部類類名.靜态内部類類名.靜态方法();
//靜态内部類
static class Inner{
int m = 2;
static int n = 20;
//m3()對外時 相當于加上了static 就不能直接通路外部類的普通成員
public void m3() {
//a屬性為成員變量
StaticOuter so = new StaticOuter();
System.out.println(so.a);
//靜态内部類中普通方法 但是相當于給其加了static
}
public static void m4() {
//System.out.println(m);//靜态内部類的靜态方法不能直接通路内部類的普通成員
System.out.println("内部類的靜态方法");
System.out.println(n);
}
}
//通路靜态内部類的靜态成員 不需要建立内部類對象
//建立靜态内部類對象不需要依賴于外部類對象
3、靜态内部類: 類似于局部變量,定義在方法中,類似于局部變量,定義在方法中。
注意:局部内部類建立對象隻能在定義它的方法中。(局部内部類可以通路外部類的局部變量,但是必須加上final(JDK8.0中,在内部類中通路為外部類的局部變量預設加上final)。)
public void m1() {
final int x = 10;//局部變量 作用範圍(定義位置開始到所在代碼塊結束)
System.out.println("外部類的普通方法");
System.out.println(x);//10
//局部内部類
class Inner{
int y;
public void m2() {
System.out.println("x="+x);
System.out.println("局部内部類的方法");
System.out.println(a);//通路外部類的私有成員 不破壞封裝
}
}
Inner inner = new Inner();
System.out.println(inner.y);//0
inner.m2();
}
4、匿名内部類: 特殊的局部内部類,局部内部類的一切特征,匿名内部類都存在(繼承一個類或者實作一個接口)。
interface IA{
void m1();
}
class IAImpl implements IA{//1
public void m1() {
System.out.println("IAImpl m1()...");
}
}
main{
IA i1 = new IAImpl();//2
//建立的是接口的實作類對象 因為隐藏了實作類類名 是以稱之為匿名内部類
//實作類的定義與實作類對象的建立二者結合為一
IA ia = new IA() {//這一種寫法完全等價于1+2
public void m1() {
System.out.println("IAimpl m1...");
}
};
}