一、为什么要使用内部类
为什么要使用内部类?使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。
在我们程序设计中有时候会存在一些使用接口很难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者抽象的类的能力来解决这些程序设计问题。可以这样说,接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。
二、成员内部类(memberinner)
成员内部类也是最普通的内部类,它是外围类的一个成员,所以他是可以无限制的访问外围类的所有 成员属性和方法,尽管是private的,但是外围类要访问内部类的成员属性和方法则需要通过内部类实例来访问。
在成员内部类中要注意两点,第一:成员内部类中不能存在任何static的变量和方法;第二:成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类。
定义个个类:
public class AllClaa { public void a(){ System.out.println("今晚行动."); } }
定义一个Test类:
public class Test { //定义一个成员内部类 class B{ public void a(){ System.out.println("今晚行动取消.."); } } public void testB(){ B b = new B(); b.a(); } public static void main(String[] args) { new Test().testB(); } }
三、局部内部类(methodinner)
有这样一种内部类,它是嵌套在方法和作用于内的,对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类,局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效。
//定义一个Go类
public class Go { public void go(){ System.out.println("没事了.."); } }
public class Tset { public void show(){ System.err.println("被杀l.."); //继承Go类 class B extends Go{ } B b = new B() ; b.go(); System.out.println("满血复活"); } //进行测试 public static void main(String[] args) { new Tset().show(); } }
三、匿名内部类(anonymousinner)
定义匿名内部类,我们一般分为三步
第一:通过继承一个抽象类来定义。
第二:通过实现一个接口来定义。
第三:通过一个方法得到实现接口的子类。
//定义一个接口 public interface NewStu { public void zuo(); } //定义一个抽象类,并继承NewStu接口 public abstract class Stu implements NewStu{ public void day(){ System.out.println("学习.."); } } //定义一个测试方法 public static void main(String[] args) { StuOne o = new StuOne(); o.day(); o.zuo(); //定义一个抽象类或接口 Stu stuTwo = new Stu(){ //重写方法 public void zuo() { System.out.println("泡吧..."); } }; //测试 stuTwo.day(); stuTwo.zuo(); } //结果 /* 学习.. 约会.. 学习.. 泡吧... */
这里我们就需要看清几个地方
1、 匿名内部类是没有访问修饰符的。
2、 new 匿名内部类,这个类首先是要存在的。
3、 匿名内部类是没有构造方法的。因为它连名字都没有何来构造方法。