Java内部类是指定义在另一个类里面的类,它可以访问外部类的所有成员属性和方法,包括私有的。内部类可以有多种形式,如静态内部类、成员内部类、匿名内部类、局部内部类。
Java 内部类的作用主要有以下几个方面:
1. 内部类可以直接访问外围对象的所有成员,包括private成员。
2. 内部类可以对同一个包中的其他类隐藏起来。
3. 内部类使得多重继承的解决方案变得更加容易。
4. 内部类允许将不同功能的代码封装在一起,而不必将它们分散到不同文件中。
5. 内部类使得某些特定功能的代码可以重用(如回调函数)。
作为包的成员的类被称为顶级类。
一个类可以在另一个类中声明。这种类型的类称为内部类。
如果在另一个类中声明的类被显式或隐式声明为static,它被称为嵌套类,而不是内部类。
包含内部类的类称为封闭类或外部类。
下面的代码声明一个内部类。
class Outer { public class Inner { // Members of the Inner class go here } // Other members of the Outer class go here }
Outer类是一个顶级类。
Inner类是一个内部类。它是外类的成员。
外层类是Inner类的封闭(外部)类。
内部类可以是另一个内部类的封闭类。内部类的嵌套层次没有限制。
内部类的实例只能存在于其封闭类的实例中。
以下是内部类的一些优点。
下面的代码演示了访问局部内部类中的局部变量的规则。
main()方法声明两个局部变量x和y。这两个变量都是最终的。
变量x在被初始化之后从不改变,变量y不能被改变,因为它被声明为final。
public class Main { public static void main(String... args) { int x = 1; final int y = 2; class LocalInner { void print() { System.out.println("x = " + x); System.out.println("y = " + y); } } // x = 100; LocalInner li = new LocalInner(); li.print(); } }
上面的代码生成以下结果。
内部类可以继承另一个内部类,顶级类或其封闭类。
class A { public class B { } public class C extends B { } public class D extends A { } } class E extends A { public class F extends B { } }
Java中的关键字static使一个构造成为一个顶层结构。
因此,我们不能为内部类声明任何静态成员(字段,方法或初始化器)。
允许在内部类中有作为编译时常量的静态字段。
class A { public class B { public final static int DAYS_IN_A_WEEK = 7; // OK public final String str = new String("Hello"); } }
每个内部类都被编译成一个单独的类文件。
成员内部类和静态内部类的类文件名格式如下:
<outer-class-name>$<member-or-static-inner-class-name>
局部内部类的类文件名的格式如下:
<outer-class-name>$<a-number><local-inner-class-name>
匿名类的类文件名的格式如下:
<outer-class-name>$<a-number>
类文件名中的<a-number>是从1开始顺序生成的数字,以避免任何名称冲突。
我们可以在静态上下文中定义一个内部类,例如静态方法或静态初始化器。
所有静态字段成员都可以访问这样的内部类。
class Outer { static int k = 1; int m = 2; public static void staticMethod() { // Class Inner is defined in a static context class Inner { int j = k; // OK. Referencing static field k // int n = m; // An error. Referencing non-static field m } } }
Java面向对象设计 - Java标准注释Java API定义了许多标准注释类型。以下部分讨论了在java.lang包中定义的四种最常用的标准注释。...
Java面向对象设计 -Java接口什么是接口?Java中的接口定义了一个引用类型来创建抽象概念。接口由类实现以提供概念的实现。在Java...
Java面向对象设计 -Java接口实现实现接口接口指定对象必须提供的协议。类可以提供接口的抽象方法的部分实现,并且在这种情况下,...
Java面向对象设计 -Java异常抛出如果一段代码可能抛出一个已检查的异常,我们有两个选择:使用try-catch块处理已检查的异常。在方...
Java数据类型教程 -Java数据类型包装器Java库在java.lang包中提供了八个类来表示八种基本类型中的每一种。这些类称为包装类,因...