前言
该文将会介绍匿名内部类、静态内部类的使用,补充完毕java中的内部类。补充内容为向上转型为接口、使用this关键字获取引用、内部类的继承。
一、匿名内部类
定义:没有名称的内部类。
语法:
return new A(){ //匿名内部类 //该匿名内部类的外部类为:A }
或者为:
ParentClass obj = new ParentClass(){ //创建了一个以ParentClass为外部类的匿名内部类 //实现代码 };
注:该匿名内部类的外部类为 A。在实例化该外部类时,同时实例化了该匿名内部类。
实例:
public class Demo3 { public OutInterface2 action(){ //实例化接口OutInterface2 return new OutInterface2() { /*在 return 语句中编写一个返回值为实例化的一个外部类 OutInterface2, *java中最常用的内部类 创建了一个匿名内部类,由于该内部类没有名字,所以被称为"匿名" */ private int i =0; public int getValue() { return i; //匿名内部类的成员变量和成员方法 } }; //匿名内部类{}结尾需要一个 ; 符号 } }
规则1:在匿名内部类定义结束后,需要加分号 ; 加以标识,这个分号并不表示内部类的结束,而是代表匿名内部类的创建。
规则2:匿名内部类的外部类为,return new 语句中的实例化的类。
规则3: 匿名内部类没有名字。
二、静态内部类
定义: 在内部类前添加 static 关键字修饰。
语法:
class OuterClass { // 外部类的成员和方法 static class StaticInnerClass { // 静态内部类的成员和方法 } }
规则1:如果创建静态内部类的对象,不需要其外部类的对象,直接在其中声明 static成员即可。
public class Demo4 { static class innerClass4{ //创建了一个静态内部类 } static innerClass4 n = new innerClass4(); //在外部类中创建了一个静态内部类的对象 }
规则2:不能从静态内部类的对象中访问非静态外部类的对象。不可以使用外部类的非静态成员。(因为静态区不能调用非静态区)
规则3:maain静态方法可以在静态内部类中使用。与在主方法中使用的main静态方法,实现效果一致。例如,system.out.println 语句输出内容,都会在控制台输出。
public class Demo4 { static class innerClass4{ //这里是一个静态内部类 public static void main(String[] args) { //静态方法中使用println System.out.println("我是静态内部类"); } } }
输出结果:
问题: 进行程序测试时,如果每一个Java文件中都设置一个主方法,将出现很多额外代码,而程序本身不需要这些主方法,该怎么做呢?
解决方法:将多个主方法写入几个静态内部类,主要作用是,方便进行调试。
三、内部类的继承
内部类的继承
语法:class 子类 extends 外部类.内部类
class OutputInnerClass extends ClassA.ClassB{ //OutputInnerClass 继承了ClassA的内部类ClassB public OutputInnerClass(ClassA a){ a.super(); } //类继承内部类必写的一个构造方法 }
注:在某个类继承内部类时,必须硬性创建这个子类一个带参数的构造方法,并且该构造方法的参数为需要继承的内部类的外部类的引用,同时在构造方法体中通过该参数,使用 super() 方法。调用了这个外部类,才能继承其中的内部类。
问题:匿名内部类没有名字,那么其他类该怎么继承该内部类呢?
解决方法:定义一个实现了某个接口的匿名内部类,通过内部类覆写接口的抽象方法,然后在其他类中继承这个匿名内部类。
实例:
interface MyInterface { void doSomething(); } class MyClass { MyInterface myInterface = new MyInterface() { public void doSomething() { System.out.println("Doing something in anonymous inner class."); } }; } class MySubClass extends MyClass { // 可以使用 myInterface 对象调用 doSomething 方法 }
总结
本文简单介绍了匿名内部类、静态内部类,以及内部类的继承。补充完整了内部类的使用。如果读者对文章所提到的内容有什么疑问或补充,欢迎在评论区中评论,博主会及时进行反馈的。