为什么java非静态内部类可以有static final的数据成员?
黄舟
黄舟 2017-04-17 11:09:20
[Java讨论组]

根据java的语法,非静态内部类不可以有静态成员的声明,如

class Laptop {
    // non-static inner class
    class Battery {
        private static String vendor = "Lenovo";
    }
}

是不能编译通过的。

但是如果声明 Battery 的成员 vendor 为 final, 如:

class Laptop {
    // non-static inner class
    class Battery {
        private static final String vendor = "Lenovo";
    }
}

就可以编译通过,为什么呢?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(1)
PHPz

每一个非静态内部类,必须维持一个对其外部类实例的应用,这就表明了非静态内部类的作用域是实例级别;而static关键字显式指定某个属性、方法或内部类的作用域是属于类级别。既然二者在语言层面要求的作用域不同,自然无法编译通过。
为什么添加final就可以了呢。final关键字的字面语义就是指明不可变,用在属性上,表示属性一旦赋值后即不可改变。与static关键字合用即表示定义一个常量,从这个角度看有点类似c++中的const。一旦作为常量,其作用域自然不再是实例级别了,而是全局级别了,只是java语言里面没有全局级别的作用域这个概念,类级别作用域其实就只是加了一个访问权限修饰的全局作用域而已。所以编译自然OK。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号