内部类
1.内部类可以共享外部类的属性和方法
2.外部类封装了内部类3.当内部类与外部类属性或方法重名时,在内部类中使用外部类属性或方法时必须加前缀:外部类.this.
4.在方法体外面定义的内部类的访问类型可以是public,protecte,默认的,private等4种类型,这就好像类中定义的成员变量有4种访问类型一样它们决定这个内部类的定义对其他类是否可见;此时,我们也可以在外面创建内部类的实例对象创建内部类的实例对象时,一定要先创建外部类的实例对象,然后用这个外部类的实例对象去创建内部类的实例对象
public class Inner {
public static void main(String[] args) {
Outer outer = new Outer(5,10);
outer.test(); //6,11
System.out.println("Inner.times1 = "+outer.inner.times1);
//创建内部类对象(此处的inner是一个新的对象,而不是外部类中的成员变量inner)
Outer.Inner inner = outer.new Inner();
inner.timesInc();
System.out.println("Inner.times1 = "+inner.times1);
}//main
}
//外部类
class Outer {
private int times;
private int times1;
Inner inner; //内部类通常只在外部类内部使用
//构造方法
public Outer(int times,int times1){
this.times = times;
this.times1 = times1;
inner = new Inner(); //创建内部类对象
inner.timesInc(); //方法调用,实现times加1
}
//显示私有属性的方法
public void test(){
System.out.println("Outer.times = "+times);
System.out.println("Outer.times1 = "+times1);
}
//内部类
class Inner{
int times1 = 1;
public void timesInc(){
times++; //内部类可以共享外部类的属性和方法
times1++; //内部类中的times1加了1
Outer.this.times1++; //外部类中的times1加了1
}
}
}
匿名内部类
1.必须有父类
2.匿名内部类是声明子类的同时创建了子类对象
3.语法简洁,使用方法便new 父类型() {};
调用构造方法 子类类体
4.用于简洁的继承抽象类,或者实现接口
5.匿名内部类共享外部方法中的局部变量时,这个局部变量必须为final修饰
public class NoInner {
public static void main(String[] args) {
final int a = 10;
Yoo yoo = new Yoo(){}; //创建匿名内部类---得到的是子类对象,子类没有名字
Yoo yoo1 = new Yoo(); //创建Yoo对象---的到的是父类对象
Xoo xoo = new Xoo(){}; //创建匿名内部类---得到的是实现类对象,实现类没有名字
Goo goo = new Goo(){
public void test(){
System.out.println("test, a="+a);
}
};
goo.test();
}//main
}
class Yoo{}
interface Xoo{}
interface Goo{
void test();
}