內(nèi)部類又稱為嵌套類。可以把內(nèi)部類理解為外部類的一個(gè)普通成員。
內(nèi)部類訪問(wèn)外部類
里面的可以自由訪問(wèn)外面的,規(guī)則和static一樣。(訪問(wèn)非靜態(tài)時(shí)必須先創(chuàng)建對(duì)象)
具體如下:
非靜態(tài)內(nèi)部類的非靜態(tài)方法
直接訪問(wèn)
public class Outter {
int i = 5;
static String string = "Hello";
class Inner1{
void Test1 () {
System.out.println(i);
System.out.println(string);
}
}
}
靜態(tài)內(nèi)部類的非靜態(tài)方法
因?yàn)殪o態(tài)方法訪問(wèn)非靜態(tài)外部成員需先創(chuàng)建實(shí)例,所以訪問(wèn)i時(shí)必須先new外部類
public class Outter {
int i = 5;
static String string = "Hello";
static class Inner2{
void Test1 () {
System.out.println(new Outter().i);
System.out.println(string);
}
}
}
靜態(tài)內(nèi)部類的靜態(tài)方法
規(guī)則如上
public class Outter {
int i = 5;
static String string = "Hello";
static class Inner2{
static void Test2 () {
System.out.println(new Outter().i);
System.out.println(string);
}
}
}
外部類訪問(wèn)內(nèi)部類
大方向:因?yàn)閷?nèi)部類理解為外部類的一個(gè)普通成員,所以外部的訪問(wèn)里面的需先new一個(gè)對(duì)象。
非靜態(tài)方法訪問(wèn)非靜態(tài)內(nèi)部類的成員:
new 內(nèi)部類對(duì)象
public class Outter {
static void Test2() {
System.out.println(new Outter().new Inner1().i);
}
class Inner1{
int i = 5;
// static String string = "Hello"; 定義錯(cuò)誤!
}
}
靜態(tài)方法訪問(wèn)非靜態(tài)內(nèi)部類的成員
靜態(tài)方法Test2訪問(wèn)非靜態(tài)Inner1需先new外部類;
繼續(xù)訪問(wèn)非靜態(tài)成員i需先new 內(nèi)部類
所以訪問(wèn)規(guī)則為:new Outter().new Inner1().i。
public class Outter {
static void Test2(){
System.out.println(new Outter().new Inner1().i);
}
class Inner1{
int i = 5;
// static String string = "Hello"; 定義錯(cuò)誤!
}
}
非靜態(tài)方法訪問(wèn)靜態(tài)內(nèi)部類的成員
先“外部類.內(nèi)部類”訪問(wèn)至內(nèi)部類。
若訪問(wèn)非靜態(tài)成員,則需先new再訪問(wèn);若訪問(wèn)靜態(tài)成員,則可直接訪問(wèn)。
public class Outter {
void Test2() {
Outter.Inner2 inner2 = new Outter.Inner2();
System.out.println(inner2.i);
System.out.println(inner2.string);
System.out.println(Outter.Inner2.string);
}
static class Inner2{
int i = 5;
static String string = "Hello"; // 定義錯(cuò)誤!
}
}
非靜態(tài)方法訪問(wèn)非靜態(tài)內(nèi)部類的成員
先“外部類.內(nèi)部類”訪問(wèn)至內(nèi)部類,再new即可訪問(wèn)靜態(tài)成員。
public class Outter {
void Test1(){
Outter.Inner1 inner2 = new Outter.Inner1();
System.out.println(inner2.i);
}
class Inner1{
int i = 5;
// static String string = "Hello"; 定義錯(cuò)誤!
}
}
匿名內(nèi)部類
匿名內(nèi)部類訪問(wèn)外部成員變量時(shí),成員變量前應(yīng)加final關(guān)鍵字。
final int k = 6;
((Button)findViewById(R.id.button2)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
System.out.println(k);
}
});