java - java内部类中静态成员的使用
问题描述
我开始知道 java 中的内部类不能有静态成员,除非它们被声明为 final 。但是理论上不应该在本地类中声明静态成员吗?
例如。
public class OuterClass
{
class innerClass
{
public static int i = 1;
// inner class code goes here
}
}
我知道内部类的标准初始化是这样发生的:
OuterClass outerClass = new OuterClass();
OuterClass.innerClass innerclassInstance = outerClass.new innerClass();
但是为什么不这样呢??
OuterClass outerClass = new OuterClass();
outerClass.innerClass innerclassInstance = new outerClass.innerClass();
每当创建 OuterClass 的实例时,它还包含一个 innerClass 的副本。因此,如果允许 static(只是 static 但不是 final )成员出现在 innerClass 中,那么它们应该(或可以)以这种方式访问
outerClassInstance.innerClass.member
我想错了方向吗?内部类的设计方式有什么特别的原因吗?
希望我清楚。对不起我的英语不好。
解决方案
但是理论上不应该在本地类中声明静态成员吗?
内部类与其外部类的对象隐式关联,因此 InnerClass 类的存在完全取决于 OuterClass 类的每个封闭对象。
让我们想象一下,您没有将“i”声明为 final,而是创建了 OuterClass 类的实例 a 和 b,这两个实例相互独立。我们可以设置:
OuterClass a = new OuterClass();
OuterClass.InnerClass a1 = a.new InnerClass();
a1.i = 9;
OuterClass b = new OuterClass();
OuterClass.InnerClass b1 = b.new InnerClass();
b1.i = 18;
嗯,两个不同值的静态变量,并行存在,相互独立(因为a和b是相互独立的)。
它不会发生,因为静态变量本质上是全局变量。InnerClass 类的所有实例必须共享同一个静态变量。
但是为什么不这样呢??
OuterClass outer = new OuterClass(); //I modified the variable name to avoid confusion
outer.InnerClass innerclassInstance = new outer.InnerClass();
按照惯例,
Type name = new Type();
,所以外部(名称)无法解析为类型。
你可以这样做:
OuterClass.InnerClass innerclassInstance = new OuterClass().new InnerClass();
希望我的回答可以帮到你。
推荐阅读
- git - 通过变基编辑提交后如何将其应用到原始分支?
- python - Python - 指针和对象的 id
- reactjs - 使用道具作为状态的组件的替代方案
- php - 未定义的属性:Illuminate\Database\Eloquent\Relations\BelongsTo::$status。Laravel 5.5 关系
- javascript - 捆绑多个 JavaScript 文件并访问 bundle 中定义的类:使用什么技术,以及如何使用?
- sql - 使用正则表达式返回特定内容
- sql - 为什么你可以按“as”语句排序,但不能按“as”语句分组
- javascript - Chart.js - 根据用户输入设置 x 轴
- redis - 如何使用 redis-cluster 配置具有 2 个节点的主从
- asp.net-core - 为什么会话在 .net core 3.0 中的 ASP.NET Core Web api 中为空?