内部类
public class InnerDemo { class Inner{ public void innerMethod(){ System.out.println("this is inner method"); } } public Inner getInnerInstance(){ return this.new Inner(); } public static void main(String[] args) { //获取内部对象,这是第一种 InnerDemo innerDemo = new InnerDemo(); Inner inner = innerDemo.new Inner(); //获取内部对象,这是第二种 InnerDemo innerDemo1 = new InnerDemo(); Inner inner1 = new InnerDemo().getInnerInstance(); }
成员内部类
定义了成员内部类后必须使用外部类对象来创建内部类对象,而不能世界去new 一个内部类对象,即
内部类 对象名 = 外部类对象.new 内部类()
一般来说,编译内部类后生成的类文件是以“外部类名称$内部类名称.class” 这种形式命名的,但在Java语言中,只要存在$,就应将其替换为 “ . ” 。
public class InnerDemo{ class Inner{ } }
成员内部类,只要外部这个类还在内存当中,这个成员内部类就会驻留在内存。
局部内部类
public class InnerDemo1 { public void call(){ //这是一个方法 class Inner{ //这是一个方法里的局部内部类 } } }
局部内部类随着方法的弹栈而被销毁。
匿名内部类
定义匿名内部类的时候,必须要有接口或抽象类。这个匿名内部类还得写成一个局部的匿名内部类。
这个是非匿名内部类实现一个接口的代码:
interface Inner{ void call(); } public class InnerDemo1 { public void say(){ class InnerImpl implements Inner{ @Override public void call() { } } } }
静态内部类
public class InnerDemo { static String name; //InnerDemo.name static class Inner{ //获取到该静态内部类构造器InnerDemo.Inner(),构造器获取实例对象new InnerDemo.Inner(); public void function(){ System.out.println("this is inner method"); } } }
class Outer{ //定义外部类
String info="Welcome,everybody"; //定义外部类的私有属性
class Inner{ //定义内部类
public void print(){ //定义内部类的方法
System.out.println(info); //直接访问外部类的方法
}
}
public void fun(){ //定义外部类的方法
new Inner().print(); //通过内部类的匿名对象调用内部类的print()方法
}
}
public class OuterInner {
public static void main(String[] args) {
// TODO Auto-generated method stub
Outer out = new Outer();
Outer.Inner in = out.new Inner();
in.print();
}
}