JVM将为类的instance和static变量赋上缺省值(默认值),包括数组array中的每一个元素--而不用再写初始化赋值语句。
切记:局部变量是没有缺省值的,必须手动初始化!并且这一缺省赋值过程是在对象的构造函数调用之前完成的。
我们看下边的程序:
public class Test {
public static void main(String[] args){
SubClass subClass = new SubClass();
System.out.println(subClass.getObj());
}
}
class SuperClass {
public SuperClass() {
init();
}
protected void init() {
}
}
class SubClass extends SuperClass {
private Object obj;// 如果换成obj = null 呢?
protected void init() {
obj = "abcdefg";
}
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
}
这个的输出为abcdefg,而换成obj=null则输出为null。
这个子类覆盖了父类的init()方法。
其实在子类运行构造函数的时候就使用了super()调用父类的构造函数,而在父类的构造函数中调用了init()方法,而此时子类已经有init()方法覆盖了父类的init()方法,所以此时调用的实际上是子类的init()方法.(这也告诉我们,一般不要再构造方法中调用可能被重写的方法,这可能会给程序带来很多问题。)
而修改后却输出null,追寻这个的原因又引出了一个Java初始化顺序的问题:
新建一java对象(上面main方法中new SubClass())时,它的内部初始化顺序为:
1. 父类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
2. 子类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
3. 父类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
4. 父类构造方法
5. 子类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
6. 子类构造方法
我们分析一下:
那么在private Object obj;中,依次执行了3(无操作)、4(赋值abcdefg)、5(无操作)、6(无操作)=>输出为abcdefg
那么在private Object obj=null;中,依次执行了3(无操作)、4(赋值abcdefg)、5(修改引用为null)、6(无操作)=>输出为null
这就是add()方法的多态性体现。要是将add()方法的权限修改为private,则两个程序的输出都是null,因为类中所有的private方法都隐式地指定是final的。
分享到:
相关推荐
11.java基础拾遗--匿名内部类语法详解.mp4
09.java基础拾遗--类的加载和对象的构造过程.mp4
10.java基础拾遗--匿名内部类的应用--实现scala中的集合map方法.mp4
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
Java开发中的三大框架——Struts、Hibernate和Spring,都是为了解决传统Java Web应用程序中存在的一系列问题而诞生的。...随着技术的不断发展,Java开发者需要持续学习和掌握这些框架,以适应日新月异的开发需求。
Java开发中的三大框架,即Struts、Hibernate和Spring,各自解决了传统Java Web应用程序中的不同问题,提升了开发效率和代码质量。下面将详细讲解这三个框架的技术起源及其核心功能。 首先,Struts框架诞生于解决JSP...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
综上所述,《路边拾遗》不仅仅是一本简单的摄影画册,它还是一次关于摄影艺术及其深层意义的探索。通过这本书,我们可以更加深刻地理解摄影作为一种艺术形式的魅力所在,同时也能够认识到摄影对于个人成长和社会进步...
Java语言拾遗 │ │ └─util 工具类 │ └─mq 消息队列 │ └─kafka └─resources 消息队列源码会作专题研究 关于消息队列使用参考另一个库:https://github.com/GitJavaProgramming/springboot_mybatis 参考...
java回顾、知识整理、拾遗、面试_java-review
Java知识拾遗:三大框架的技术起源 本篇文章主要讲述了Java开发中三大框架的技术起源,即Struts、Hibernate和Spring框架。这些框架是我们Java开发中的常用的框架,它们分别针对不同的应用场景给出最合适的解决方案...
读书笔记:算法 并发 函数式编程 java语言拾遗 手写设计模式
#### 1. 线性代数 (Linear Algebra) 线性代数是现代数学的重要组成部分,它研究向量空间(或更一般地,模)及其线性变换。本书中介绍了线性代数的基本概念,如向量、矩阵、行列式、线性方程组、特征值和特征向量等...
**Java JDK 6.0 学习笔记** Java JDK(Java Development Kit)是Java编程语言的核心组件,包含Java运行环境、编译器、类库以及各种工具,是开发者进行Java程序开发的基础。Java JDK 6.0是Oracle公司发布的一个重要...
NULL 博文链接:https://langyu.iteye.com/blog/1167581
在"Java基础"部分,你可以学习到如何声明和初始化变量,如整型(int)、浮点型(float)、字符型(char)和布尔型(boolean)等基本数据类型。此外,还有运算符的使用规则,例如算术运算符(+, -, *, /, %)、关系运算符(==, !...