关于Java内部类字段和方法不能使用static修饰的原因
时间:2022-06-04
本文章向大家介绍关于Java内部类字段和方法不能使用static修饰的原因,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
昨天的文章中,遗留了一个问题就是,为什么Java内部类字段和方法不能使用static修饰。
先下下面一段代码:
class OuterClass {
public int age=20;
class InnerClass {
static int i = 100; // compile error
static void f() { } // compile error
}
}
上面的内部类的成员变量和方法,只要加上了static修饰,就会出现编译错误。
原因:
简单的来说,内部类是外部类的实例,与外部类的的成员变量是一样的,每个实例化出来的对象,它的成员变量赋值都是独立的不会相互影响。
看下面一个例子:
class Employee {
public String name;
}
上面是一个成员变量,现在我们创建两个实例并赋值:
Employee a = new Employee();
a.name = "Oscar";
Employee b = new Employee();
b.name = "jcyang";
上面的代码是没问题的。
ok,现在继续看,假如我们允许内部类出现静态成员,会出现什么情况:
class Employee {
public String name;
class InnerData {
public static count; // ??? count of which ? a or b?
}
}
这个时候,我们给内部类实例的静态字段count赋值,就会发生混乱:
Employee a = new Employee();
a.name = "Oscar";
a.new InnerData().count=3
Employee b = new Employee();
b.name = "jcyang";
b.new InnerData().count=4
现在已经分不清到底是修改类count字段,逻辑上来说成员变量是对象各自独立的属性读写都是不依赖的,但如果上面的场景成立,就会自相矛盾。所以这就是为什么内部类里面不允许存在静态成员的原因。
其实归根结底,还是类与对象的区别,静态属性不依赖于对象,因为它保存在jvm的静态区,所以访问修改的时候不需要依赖当前有没有存活的对象,在虚拟机加载的时候也是优先于实例生成的。而实例对象则是保存在jvm的堆内存中,想要访问内部类,必须先实例化外部类,然后通过外部类才能访问内部类。内部类其实也可以认为是外部类的一个成员变量,只要是成员变量,各个对象都是不依赖的,静态属性的出现破坏了这一逻辑,所以java语言在语义层面不允许我们那么做,这其实不是技术问题,是一个语言的逻辑和语义问题。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 使用 HanLP 统计二元语法中的频次
- 算法集锦(13)|自然语言处理| Python代码的语义搜索引擎创建
- 特征锦囊:彻底了解一下WOE和IV
- Nginx专辑|05 -如何使用Nginx配置正向代理
- 详解 SIGHAN05 的目录结构
- 工业数据分析之数据归一化 | 冰水数据智能专题 | 2nd
- python写的小程序
- 不求甚解之 Spanning Tree
- C语言常用的一些转换工具函数收集
- OpenAI Gym入门级导游 | 附PDF手册下载 | 山人刷强化 | 4th
- python中常见关于Excel表格读写操作
- 2行代码搞定一个定时器!
- python算法题练习---二分法
- 局部加权线性回归 | 冰水数据智能专题 | 3rd
- 一文探讨 RPC 框架中的服务线程隔离