Java内部类

时间:2020-02-23 14:36:39  来源:igfitidea点击:

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内部类实现封装。
    请注意,内部类可以访问外部类的私有成员,同时我们可以对外部世界隐藏内部类。

  • 将小型类保留在顶级类中会使代码更靠近使用位置,并使代码更具可读性和可维护性。