Java内部类
Java内部类是在另一个类的主体内定义的。
Java内部类可以声明为私有,公共,受保护或者具有默认访问权限,而外部类只能具有公共或者默认访问权限。
Java嵌套类分为两种类型。
静态嵌套类如果嵌套类是静态的,则称为静态嵌套类。
静态嵌套类只能访问外部类的静态成员。
静态嵌套类与任何其他顶级类相同,并且仅为了包装的方便而嵌套。
可以使用以下语句创建静态类对象。Java内部类
在Java中,任何非静态嵌套类都称为内部类。
Java内部类与该类的对象相关联,它们可以访问外部类的所有变量和方法。
由于内部类与实例相关联,因此我们不能其中包含任何静态变量。
类是外部类对象的一部分,并且要创建内部类的实例,我们首先需要创建外部类的实例。
Java内部类可以像这样实例化;
有两种特殊的Java内部类。
本地内部类如果在方法主体中定义了一个类,则称为本地内部类。
由于本地内部类未与Object关联,因此我们无法对其使用私有,公共或者受保护的访问修饰符。
唯一允许使用的修饰符是abstract或者final。
本地内部类可以访问封闭类的所有成员以及定义的作用域中的local final变量。
此外,它也可以访问定义该方法的方法的非最终局部变量,但不能修改它们。
因此,如果您尝试打印非最终局部变量的值,则将允许使用该变量,但如果尝试从内部方法本地内部类中更改其值,则会得到编译时错误。
本地内部类可以定义为:
我们也可以在任何块(例如静态块,if-else块等)内定义局部内部类。
但是,在这种情况下,类的范围将非常有限。匿名内部类没有名称的本地内部类称为匿名内部类。
匿名类是在单个语句中定义和实例化的。
匿名内部类总是扩展类或者实现接口。
由于匿名类没有名称,因此无法为匿名类定义构造函数。
匿名内部类只能在定义点访问。
定义如何创建匿名内部类有点困难,我们将在下面的测试程序中看到它的实时用法。
这是一个Java类,显示了如何定义Java内部类,静态嵌套类,局部内部类和匿名内部类。
OuterClass.java
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
这是测试程序,显示了如何在Java中实例化和使用内部类。
InnerClassTest.java
OuterClass outerObject = new OuterClass(); OuterClass.InnerClass innerObject = outerObject.new InnerClass();
这是上面的Java内部类示例程序的输出。
package com.theitroad.comnerclasses; public class MainClass { private String s_main_class; public void print() { String s_print_method = ""; //local inner class inside the method class Logger { //able to access enclosing class variables String name = s_main_class; //able to access non-final method variables String name1 = s_print_method; public void foo() { String name1 = s_print_method; //Below code will throw compile time error: //Local variable s_print_method defined in an enclosing scope must be final or effectively final //s_print_method= ":"; } } //instantiate local inner class in the method to use Logger logger = new Logger(); } }
请注意,编译OuterClass时,将为内部类,本地内部类和静态嵌套类创建单独的类文件。
Java内部类的好处
如果一个类仅对一个类有用,那么将其嵌套在一起就很有意义。
它有助于类的包装。Java内部类实现封装。
请注意,内部类可以访问外部类的私有成员,同时我们可以对外部世界隐藏内部类。将小型类保留在顶级类中会使代码更靠近使用位置,并使代码更具可读性和可维护性。