资讯专栏INFORMATION COLUMN

内部类和静态嵌套类

hsluoyz / 2429人阅读

摘要:嵌套类增加了封装性内部类和静态嵌套类的不同根源来自于,最大区别在于访问外部类成员的权限。静态嵌套类修饰符使得嵌套类对象成为外部类的静态成员,与外部类直接关联。

术语规范:按照官方文档,定义在外部类(封装类)内部的类称之为nested class,根据是否被static关键字修饰又分为两类:static nested classes 和 inner classes。

class OuterClass {

    static class StaticNestedClass {}
    class InnerClass {}
}

使用嵌套类的好处在于:

当某个类为旁类专用时,将其写成嵌套类能使得代码结构更紧凑。

嵌套类增加了封装性

内部类和静态嵌套类的不同根源来自于static,最大区别在于访问外部类成员的权限。

1.静态嵌套类

static修饰符使得嵌套类对象成为外部类的静态成员,与外部类直接关联。

这样静态嵌套类作为一个静态成员,仅能访问外部类的静态成员,因为外部类中的非静态成员与外部类对象相关,静态嵌套类就不能访问他们,这使得静态嵌套类的功能变的很弱,可用之处很少。

另外因为静态嵌套类是依附于外部类而非外部类对象的,所以不同的外部类对象共享一个静态嵌套类,这一点与内部类不同,可以用来包装main方法。

静态嵌套类的声明示例:

OuterClass.StaticNestedClass nestedObject =
     new OuterClass.StaticNestedClass();
2.内部类

没有static修饰意味着一个内部类是和外部类对象关联的,也可以说一个内部类对象存在于外部类对象中,是外部类对象的一个成员,因此内部类对象可以访问外部类对象的全部成员,包括私有成员。

因为内部类依赖于外部类对象而存在,所以不能定义任何静态成员。

内部类对象可以访问外部类的所有成员变量,包括私有成员,这是Java闭包的原理;

因为内部类隐含对外部类的引用,所以外部类就不能被JVM的垃圾回收机制自动垃圾回收。

不同的外部类对象之间没有公共的内部类对象成员。

内部类的声明示例:

OuterClass.InnerClass innerObject = new OuterObject().new InnerClass();
3.变量遮蔽Shadowing

嵌套类和封装类以及局部方法区的变量作用域有重叠,如果有同名变量将发生变量遮蔽。

public class ShadowTest {

    public int x = 0;

    class FirstLevel {

        public int x = 1;

        void methodInFirstLevel(int x) {
            System.out.println("x = " + x);
            System.out.println("this.x = " + this.x);
            System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);
        }
    }

    public static void main(String... args) {
        ShadowTest st = new ShadowTest();
        ShadowTest.FirstLevel fl = st.new FirstLevel();
        fl.methodInFirstLevel(23);
    }
}

注意这里对3种不同变量的引用方式,结果如下

x = 23                  //1.  局部变量
this.x = 1              //2.内部类变量
ShadowTest.this.x = 0   //3.外部类变量

内部类中this指针指向内部类自己,ShadowTest.this则指向外部类对象;

不加修饰的变量,将执行就近匹配原则;如果名称相同将发生变量遮蔽效应;为了防止隐患,内部类引用外部类对象时应使用第三种方法。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64740.html

相关文章

  • Java™ 教程(嵌套

    嵌套类 Java编程语言允许你在另一个类中定义类,这样的类称为嵌套类,如下所示: class OuterClass { ... class NestedClass { ... } } 术语:嵌套类分为两类:静态和非静态,声明为static的嵌套类称为静态嵌套类,非静态嵌套类称为内部类。 class OuterClass { ... stati...

    Cheng_Gang 评论0 收藏0
  • java内部总结

    摘要:每个内部类都能独立地继承一个接口,而无论外部类是否已经继承了某个接口。因此,内部类使多重继承的解决方案变得更加完整。内部类中的与其他类一样是指的本身。但是静态内部类却没有。 问题:内部类、静态内部类区别、使用场景? 1.静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。 2.静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有...

    xiaodao 评论0 收藏0
  • Java进阶3 —— 接口设计原则

    摘要:首当其冲的便是接口中的每个声明必须是即便不指定也是,并且不能设置为非,详细规则可参考可见性部分介绍。函数式接口有着不同的场景,并被认为是对编程语言的一种强大的扩展。抽象类与中的接口有些类似,与中支持默认方法的接口更为相像。 原文链接:http://www.javacodegeeks.com/2015/09/how-to-design-classes-and-interfaces.htm...

    lauren_liuling 评论0 收藏0
  • Java知识点总结(三个步骤)

    摘要:对于一个名为的外围类和一个的内部类,在编译成功后,会出现这样两个文件和。 Java知识点总结(三个步骤) @(Java知识点总结)[Java, Java面向对象] [toc] 1-定义类 修饰符 访问修饰符: public protected default private 其他修饰符 abstract:抽象类不能实例化,专门用于继承的类final:最终类不能被继承 类名(驼峰命名...

    syoya 评论0 收藏0
  • Java内部(Inner Class)小记

    摘要:要注意的是,成员内部类不能含有的变量和方法。匿名内部类是唯一一种没有构造器的类。静态嵌套类又叫静态局部类嵌套内部类,就是修饰为的内部类。以上是对内部类的一些学习和总结,纰漏之处希望各位小伙伴友情指点,共同进步。 内部类(inner class)是定义在另一个类中的类,类名不需要和文件夹相同。但为什么要使用内部类呢?其主要原因有以下三点:  1.内部类方法可以访问该类定义所在的作用域中的...

    jackzou 评论0 收藏0

发表评论

0条评论

hsluoyz

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<