package Test;
/**
* Java中内部类主要分成:
* 成员内部类(非静态内部类、静态内部类)、匿名内部类、局部内部类
* 成员内部类(可以使用private/default/protected/public任意进行修饰。类文件:外部类$内部类.class)
*
* 非静态内部类(外部类里使用非静态内部类和平时使用其他类没什么不同)
* 1.非静态内部类必须寄存在一个外部类对象里。因此,如果有一个非静态内部类对象那么一定存在对应的外部类对象。非静态内部类对象单独属于外部类的某个对象。
* 2.非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部类成员。
* 3.非静态内部类不能有静态方法、静态属性和静态初始化块。
* 4.外部类的静态方法、静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量、创建实例。
*
* 成员变量访问要点:
* 1.内部类里方法的局部变量:变量名。
* 2.内部类属性:this.变量名。
* 3.外部类属性:外部类名.this.变量名。
*
* 创建非静态内部类对象
* typeName.typeName name=new typeName().new typeName();
*
* 创建静态内部类对象
* typeName.typeName name=new typeName.typeName();
*
* 匿名内部类
* new 父类构造器(实参列表)\实现接口(){
* 匿名内部类类体
* }
*
* 局部内部类
* 作用域仅限于本方法,称为局部内部类
*
* @author pmc
*
*/
public class Inner {
public static void main(String[] args){
Outer o=new Outer();
Outer.Inner ine=new Outer().new Inner();//非静态内部类
ine.show();
o.testOuter();
Outer.Inners ines=new Outer.Inners();//静态内部类
ines.as();
Outer.Inners.ab();
Inner.test01(new Tnm(){//匿名内部类
public void aa() {
System.out.println("匿名内部类");
}
});
new Inner().show();//调用局部(方法)内部类
}
public static void test01(Tnm a){
System.out.println("普通方法");
a.aa();
}
/**
* 局部(方法)内部类使用方法
*/
public void show(){
class temp{
public void pr(){
System.out.println("局部内部类");
}
}
new temp().pr();
}
}
class Outer{
private int age=10;
public void testOuter(){
System.out.println("Outer.class");
Outer.Inner ine=new Outer().new Inner();
ine.show();
}
class Inner{
int age=20;
public void show(){//非静态内部类
int age=30;
System.out.println("外部类成员变量age:"+Outer.this.age);
System.out.println("内部类成员变量age:"+this.age);
System.out.println("内部类局部变量age:"+age);
}
}
static class Inners{//静态内部类
void as(){
System.out.println("静态内部类方法");
}
static void ab(){
System.out.println("静态内部类静态方法");
}
}
}
interface Tnm{
void aa();
}