1、非静态内部类:内部不能有任何静态声明
class outer {//外部类
class Inner{//内部类
int a=10;//不能为静态的
}
}
//外部类的非静态方法中创建内部类对象
//先在外部类的非静态方法中创建内部类的对象,在创建外部类的对象并调用外部类的方法,由此间接地使用内部类对象及其中的方法
class outer{
private int i=10;
public void makeIn() {
Inner in=new Inner();
in.fIn();
System.out.println("outer");
}
class Inner{
public void fIn() {
System.out.println("inner:i "+i);//非静态内部类与外部类处于相同的位置,内部类可以访问外部类的成员变量,即使这个成员变量是private修饰的
}
}
public static void main(String args[]) {
outer out=new outer();
out.makeIn();
}
}
//在外部类的静态方法中创建内部对象 先创建外部类的对象,再创建内部类的对象。注意内部类变量声明和创建内部类对象时的语法
class outer{
private int i=10
class Inner{
public void fIn() {
System.out.println("inner:i "+i);//非静态内部类与外部类处于相同的位置,内部类可以访问外部类的成员变量,即使这个成员变量是private修饰的
}
}
public static void main(String args[]) {
outer out=new outer();
outer.Inner in=out.new Inner();//直接在外部类的静态方法中创建内部类的对象并调用其方法。
in.fIn();
}
}
//当外部类的成员变量、内部类的成员变量以及内部类的局部变量重名时,
//在内部类的方法中使用局部变量可以直接使用变量名,用“this.变量名”表示内部类的成员变量
//用“外部类名.this.变量名”表示外部类的成员变量
class outer{
private int i;
class Inner{
int i;
public void fIn() {
outer.this.i=1;//外部类的成员变量
this.i=2;//内部类的成员变量
int i=3;//内部类的局部变量
System.out.println("inner-fIn:i "+i);
System.out.println("inner:i "+this.i);
System.out.println("outer:i "+outer.this.i);
}
}
public static void main(String args[]) {
outer out=new outer();
outer.Inner in=out.new Inner();
in.fIn();
}
}
2、静态内部类:内部类用static修饰时,就成为静态内部类
创建静态内部类对象时,不用事先创建外部类的对象
静态内部类只能通过直接访问外部类的静态成员,不能直接访问外部类的非静态成员。如果一定要访问,必须通过外部类的对象进行访问
3、方法内部类:把类定义在方法内,作用域与局部变量相同,只能在本方法内访问
4、匿名内部类:没有名字的内部类,它继承了某个类或实现了某个接口。它只有类的主体部分,没有类的声明,类的主体部分紧跟new
interface intf{
public void drive();
}
abstract class car implements intf{
}
class outer{
public static void main(String[] args) {
intf f=new intf() {
public void drive() {
System.out.println("interface");
}
};
f.drive();
car c=new car() {
public void drive() {
System.out.println("abstract");
}
};
c.drive();
}
}//两个匿名类,一个实现了接口intf,一个继承了抽象类car