一、内部类定义
将一个类的定义放在另一个类的内部,这叫做内部类。
package i;
//Foo是一个外部类
public class Foo {
private int v1;
public Foo(int v1) {//外部类构造器(非默认构造器)
super();
this.v1 = v1;
}
public void fooF(){
//创建内部类的对象,编译器会将this传递给Bar的构造器
//这样内部类的对象就持有外部类对象的引用
Bar bar =new Bar();//内部类的对象
bar.barF();
}
//Bar是一个内部类
public class Bar{//构造器没有另外写,为默认构造器
public void barF(){
//内部类的对象有一个对外部类的对象的引用outer,因此可以访问外部类的数据
//outer无视访问修饰符,outer不是java关键字
System.out.println(v1);//实际为System.out.println(outer.v1);,系统自动加
//内部类访问外部类的属性v1
}
}
public static void main(String[] args) {
Foo foo=new Foo(10);//创建外部类的对象,并把参数传给构造器
//public Foo(int v1),外部属性v1=10
foo.fooF();
//创建内部类对象,必须先有外部类的对象
//使用foo.new Bar(),编译器会将foo参数传递给Bar的构造器
Bar bar=foo.new Bar();
bar.barF();
//bar 和bar2持有同一个外部类对象的引用
Foo.Bar bar2=foo.new Bar();//即Foo.Bar与bar同作用
bar2.barF();
}
}
二、局部内部类
在方法中声明的内部类
作用:局部内部类可以使内部类无法被外部察觉。
三、静态内部类
有时候使用内部类只是为了把一个类隐藏在另一个类的内部,并不需要内部类引用外部类的对象,这种情况可以使用静态内部类。
调用静态内部类
匿名内部类
如果这个对象只需要一个,那么创建一个类去实现接口就太麻烦了。
使用匿名内部类可以解决这个问题。
java单例模式学习