静态成员不能访问非静态成员。
内部类可以访问外部类private成员,反之不成立。
非静态内部类不能拥有静态成员。
接口内部类默认为public static。
子类继承内部类父类,会自动调用非静态内部类构造器,此时子类构造器必须存在一个外部类对象。
interface jiekou{
void shixian1();
}
abstract class chouxiang{
abstract void shixian2();
}
class A{
class B{//非静态内部类
void toPrint1(){
System.out.println("I'm Inner Class B");
}
}
static class C{//静态内部类
void toPrint2(){//非静态成员
System.out.println("I'm Inner Class C");
}
static void toPrint3(){//静态成员
System.out.println("I'm Inner Class C");
}
}
void toPrint0(){
new C().toPrint2();//在外部类中,调用静态内部类非静态成员,需创建内部类实例来调用
C.toPrint3();//在外部类中,调用静态内部类静态成员,可直接通过静态内部类类名直接调用
}
void jbIC(){
class jubuInnerClass{//局部内部类,即存在于方法体内的内部类
}
}
void niminglei1(jiekou J){//实现接口类型的匿名类的方法
J.shixian1();
}
void niminglei2(chouxiang X){//实现抽象类类型的匿名类的方法
X.shixian2();
}
}
class D1 extends A.B{//外部类继承非静态内部类
D1(A a){
a.super();
}
}
class D2 extends A.C{//外部类继承静态内部类
}
public class OutIn{
public static void main(String args[]){
A a=new A();
A.B b1=new A().new B();//在外部类以外的地方,创建非静态内部类对象,方式一
A.B b2=a.new B();//在外部类以外的地方,创建非静态内部类对象,方式二
A.C c=new A.C();//在外部类以外的地方,创建静态内部类对象
b1.toPrint1();//调用非静态内部类方法
b2.toPrint1();//调用非静态内部类方法
a.toPrint0();//调用外部类方法
c.toPrint2();//在外部类以外的地方,使用创建的静态内部类对象调用非静态方法
c.toPrint3();//在外部类以外的地方,使用创建的静态内部类对象调用静态方法
A.C.toPrint3();//在外部类以外的地方,通过 外部类类名.内部类类名 的方式调用静态内部类的静态方法
a.niminglei1(new jiekou(){//接口类型的匿名类
public void shixian1(){
System.out.println("I'm interface");
}
}
);
a.niminglei2(new chouxiang(){//抽象方法类型的匿名类
void shixian2(){
System.out.println("I'm abstract class");
}
}
);
}
}
输出结果:
I'm Inner Class B
I'm Inner Class B
I'm Inner Class C
I'm Inner Class C
I'm Inner Class C
I'm Inner Class C
I'm Inner Class C
I'm interface
I'm abstract class