Java类加载问题:变量初始化顺序
来源:互联网 发布:centos snmpwalk 编辑:程序博客网 时间:2024/05/23 23:46
昨天看到一个简单的问题:父类和子类有同样名称的私有变量,在父类构造器中执行打印变量的方法,同时在子类中覆盖这个方法,这时候打印的变量值不是父类和子类的变量值而是变量的默认初始化值。
public class BaseClass { private int num = 1; public BaseClass() { this.print(); } public void print() { System.out.println(this.getClass().toString() + " , base 's num = " + num); }}
public class ChildClass extends BaseClass { private int num = 999; public ChildClass() { this.print(); } @Override public void print() { System.out.println(this.getClass().toString() + " , child 's num = " + num); } public static void main(String[] args) { BaseClass child = new ChildClass(); }}
输出结果:
class classLoad.ChildClass , child 's num = 0
class classLoad.ChildClass , child 's num = 999
原因是:
在创建一个ChildClass对象实例时,在执行ChildClass的构造方法前,java会先寻找他的父类并执行其父类的构造器(java类加载机制)
然后在父类BaseClass中执行构造方法,同时执行this.print();
重点!此时其实仍是在ChildClass这个对象中执行父类的构造器,所以当父在父类的构造器中执行this.print()时,this指向的其实是ChildClass这个对象(如输出结果中对应的类名)
this.print()打印的num变量应该是ChildClass中的num,然而此时ChildClass还没有实例化,所以此时num还没有被赋值999,所以打印的是int型的默认值 num = 0。
当执行完父类的构造器方法时,才执行ChildClass的构造器方法,此时ClildClass中的num才被赋值,则时候输出的是 num = 999;
0 0
- Java类加载问题:变量初始化顺序
- Java 类加载顺序与成员变量初始化
- java 类加载顺序 静态变量初始化顺序,何时触发类加载
- java类变量初始化顺序
- Java类变量初始化顺序
- java 类加载-初始化顺序
- 关于Java变量初始化顺序问题实践
- java 初始化的加载顺序问题
- java变量初始化顺序
- java变量初始化顺序
- JAVA变量初始化顺序
- JAVA变量初始化顺序
- 【Java】变量初始化顺序
- Java变量初始化顺序
- java变量初始化顺序
- java变量初始化顺序
- Java 变量初始化顺序
- Java 变量初始化顺序
- [LeetCode]260. Single Number III
- java网络编程一:Socket用法,简单模拟一对一聊天
- int和unsigned int 相互转化的问题
- js的try catch
- java网络编程三:基于SMTP的邮件发送客户端
- Java类加载问题:变量初始化顺序
- sql查询
- java网络编程四:InetAddress类、URL类、URLConnection类解析及用法示例
- HTML简单学习笔记(主要来自W3S)
- Android Studio Gradle构建速度优化
- 如何成为一名优秀的iOS开发工程师
- 触摸事件的传递
- Add more Button to Nav Bar xamarin.ios
- CV codes代码分类整理合集