什么是java内部类(java内部类概念)
在生活中,很多人可能想了解和弄清楚Java核心技术知识点笔记—内部类的相关问题?那么关于什么是java内部类的答案我来给大家详细解答下。
前言:Java内部类的对象有一个隐式引用,它引用了实例化该内部对象的外围类的对象。通过这个指针,可以访问外围类对象的全部状态。static内部类没有这种附加指针。
1、概念:内部类是定义在另一个类中的类。使用内部类,主要是因为三点:
(1)内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据;
(2)内部类可以对同一个包中的其他类隐藏;
(3)当想要定义一个回调函数且不想编写大量代码时,使用匿名(anonymous)内部类比较便捷。
2、内部类定义
public class TestInternalA { private String outA; public TestInternalA(String outA) { this.outA = outA; } public void testFunA() { System.out.print(outA); } private class InnerB { private String innerB; public void testFunB() { System.out.print(outA); } }}
如上,在类TestInternalA中定义了一个内部类InnerB。
3、内部类特殊语法规则
3.1、定义了内部类,并不意味着每个TestInternalA类实例都有一个InnerB实例域,InnerB对象是由TestInternalA类的方法构造的。
3.2、内部类InnerB中访问了外围类TestInternalA的outA域,说明了内部类可以访问创建它的外围类对象的数据域。
3.3、内部类InnerB声明为了private私有的,这样就能控制只有外围类TestInternalA可以构造InnerB的对象。只有内部类可以声明为private,常规类只能声明public或包可见(不加访问修饰符)。
3.4、就上述示例而言
(1)如果将域innerB声明为static,编译器将会出现错误提示(需要JDK 16+(如果所使用的JDK版本在16以下))。但是,可以将innerB声明为static final,此时需要对innerB初始化。
private static final String innerB=&34;;
(2)如果将方法testFunB声明为static,也会出现和(1)同样的错误提示(需要JDK 16+(如果所使用的JDK版本在16以下))。同时,对外围类的域outA的引用也会报错(无法从 static 上下文引用非 static 字段 &39;)。
4、静态内部类:有时,只是为了把一个类隐藏在另一个类内部,而无需内部类引用外围类对象,此时,可以将内部类声明为static。静态内部类可以有静态域和方法,但由于取消了对外围类对象的引用权,因此,它也无法再引用到外围类的非静态域或方法。如下,在内部类InnerB中对outA的引用将会使编译器报错(无法从 static 上下文引用非 static 字段 &39;)。
注意:声明在接口中的内部类会自动成为static和public。
public class TestInternalA { private String outA; public TestInternalA(String outA) { this.outA = outA; } public void testFunA() { System.out.print(outA); } private static class InnerB { private static String innerB; public static void testFunB() { System.out.print(outA); } }}
5、局部内部类
可以在一个方法中定义局部类。局部类不能用public或private修饰,它的作用范围限定在声明这个局部类的块中。局部类具有对外部世界完全隐藏的优势,除了定义它所在的范围,其他地方的代码都不能访问它。
public class TestInternalA { private String outA; public TestInternalA(String outA) { this.outA = outA; } public void testFunA(String test) { class InnerB { public void testFunB() { System.out.print(test); } } InnerB innerB = new InnerB(); innerB.testFunB(); }}
如上,类InnerB只有在方法testFunA中可以访问到,在类TestInternalA的其他地方都无法访问到它。
温馨提示:通过以上关于Java核心技术知识点笔记—内部类内容介绍后,相信大家有新的了解,更希望可以对你有所帮助。