(static修飾的成員屬於整個類,而不屬於單個對象)
定義:將一個類放到另一個類的內部定義,這個在內部定義的類就叫做內部類(也有的成嵌套類),包含內部類的類被稱為外部類(也有的稱宿主類)。
1。非靜態內部類
沒有使用static修飾的內部類就是非靜態內部類。
注意:a。java不允許在非靜態內部類中定義靜態成員
b。當調用非靜態內部類中的實例方法時,必須有一個非靜態成員內部類實例,非靜態內部類實例必須寄生在外部實例內
c。如果外部類成員變量與內部類成員變量與內部類裡的方法的局部變量同名,可通過this,外部類類名.this 作為限定來加以區分。
public class Test {
private String prop = "外部類的實例變量";
public class InClass{
private String prop = "內部類中的實例變量";
public void info(){
String prop = "局部變量";
System.out.println("外部類的實例變量值:"+Test.this.prop);
System.out.println("內部類的實例變量值:" + this.prop);
System.out.println("局部變量:" + prop);
}
}
public void test(){
InClass ic = new InClass();
ic.info();
}
public static void main(String[] args){
/*
* Test ts = new Test();
* ts.test();
* 上下的代碼作用一樣
*/
new Test().test();
}
}
使用非靜態內部類:
在外部類以外的地方定義內部類的語法格式: OuterClass.InnerClass VarName
在外部類以外的地方創建非靜態內部類實例的語法: OuterInstace .new InnerConstructor()
class Out{
class In
{
public In(String msg){
System.out.println(msg);
}
}
}
public class CreateInnerInstance {
public static void main(String[] args){
//OuterClass.InnerClass varName = new OutInstance.new InnearConstructor();
Out.In in = new Out().new In("測試信息");
/*Out.In in;
*Out out = new Out();
*in2 = out.new In("測試信息");
*/
}
}
2.靜態內部類
靜態內部類是用static修飾的內部類,也稱類內部類。
a。靜態內部類不能訪問外部類的實例成員,只能訪問外部類的類成員(同為static 修飾)。
c。外部類依然不能訪問靜態內部類中的成員,但可以使用靜態內部類的類名作為調用者來訪問靜態內部類中的類成員,也可以使用靜態內部類對象作為調用者來訪問靜態內部類中的實例變量。
public class StaticInnerClassTest {
private int prop = 5 ;
private static int prop1 = 6 ;
static class InClass{
public void accessOuterProp(){
private static int prop = 5;
private int prop1 = 6;
//System.out.println(prop); //這句代碼會出錯,靜態內部類無法訪問外部類的非靜態成員
System.out.println(prop1);
}
}
public void accessInnerPro(){
//通過靜態內部類的類名訪問靜態內部類中的類成員
System.out.println(InClass.prop);
//通過靜態內部類對象作為調用者來訪問靜態內部類中的實例變量
SYstem.out.println(new InClass().prop1);
}
}
在外部類以外使用使用靜態內部類:(和使用非靜態比較,相類似)
語法: new OuterClass.InnerConstructor()
class Out{
static class In
{
public In(){
System.out.println("靜態內部類的構造器");
}
}
}
public class CreateStaticInnerInstance {
public static void main(String[] args){
Out.In in = new Out.In();
}
}
3.匿名內部類
如果把一個內部類放到方法中定義,則這個內部類就是一個局部內部類,局部內部類僅在該方法裡有效。
定義匿名內部類的格式:
new 實現接口 | 父類構造器(實參列表)
{
類體部分
}
可以看出,匿名內部類必須繼承一個父類或者實現一個接口。
interface Product{
public Double getPrice();
public String getName();
}
public class AnonymTest {
public void ce(Product p){
System.out.println("購買了一個" + p.getName() + ",花掉了" + p.getPrice());
}
public static void main(String[] args){
AnonymTest at = new AnonymTest();
at.ce(new Product() {
@Override
public Double getPrice() {
return 0.5;
}
@Override
public String getName() {
return "辣條";
}
});
}
}