各种内部类 方法内部类:(短暂性的 )
内部类可以定义为: 接口 , 抽象类
部类的命名不允许与外部类 重名,内部类可以继承同级的内部类,也可继承其它类(除内部类和外部类)
成员内部类 (高度内聚(不为外面知道))
package memberinner; //成员内部类 public class Out{ public int i = 23; //一个内部类 //它可以访问所有方法,字段和外部类本身的引用 class Inner{ public void say(){ System.out.println("内部类可以引用所有字段的引用:"+i); mehtod1(); System.out.println("本身内部类的自身引用:"+this); System.out.println("外部类的引用:"+Out.this); } } //内部方法 public void mehtod1(){ System.out.println("这是一个方法"); } //调用 public static void main(String[] args) { Out o = new Out(); //创建内部类的 实例 Inner i = o.new Inner(); i.say(); } public String toString() { return "Out [i=" + i + "]"; } }
输出为:
字段的引用:23
这是一个方法
本身内部类的引用:memberinner.Out$Inner@2a139a55
外部类的引用:Out [i=23]
方法内的内部类不能加范围限定(protected public private)
方法内的内部类不能加static修饰符
方法内的内部类只能在方法内构建其实例
方法内的内部类如果访问方法局部变量,则此局部变量必须使用final修饰
package memberinner; public class MothedInner { public void methodInn(){ //方法内部类 调用这个方法时才是有效(短暂性) //类内部 自己调用 class inn { public void method() { System.out.println("这里是方法内部类"); } } inn i = new inn(); i.method(); } public static void main(String[] args) { new MothedInner().methodInn(); } }
运行的结果为:
这里是方法内部类
匿名内部类:
匿名内部类也就是没有名字的内部类
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
package memberinner; //定义一个接口 interface Person{ public abstract void eat(); } public class AnonyousClass { //使用接口 public static void fun1(){ //通过匿名 内部类来实现 接口中方法 Person p = new Person(){ public void eat(){ System.out.println("人是可以吃饭的! 通过接口"); } }; //调用 内部类的 方法; p.eat(); } //使用 Thread 线程 public static void fun2(){ Thread t = new Thread(){ public void run() { System.out.println("通过继承thread 实现里面的方法"); } }; t.run(); } //使用 Runnable 线程 public static void fun3(){ Runnable t = new Runnable(){ public void run() { System.out.println("通过实现 Runnable 接口 实现里面方法"); } }; t.run(); } public static void main(String[] args) { fun1(); System.out.println("============"); fun2(); System.out.println("============"); fun3(); } }
运行的结果为:
人是可以吃饭的! 通过接口
============
通过继承thread 实现里面的方法
============
通过实现 Runnable 接口 实现里面方法