搜索
写经验 领红包

什么是java内部类(java内部类概念)

在生活中,很多人可能想了解和弄清楚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核心技术知识点笔记—内部类内容介绍后,相信大家有新的了解,更希望可以对你有所帮助。