内部类
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(); }