this代表什么呢?代表当前类的某个对象?请看下面这段代码:
package cn.com.wg.task01; public class CallOrder { class Base { private int i = 2; public Base() { System.out.println(this); this.display(); } public void display() { System.out.println("Base " +this.i); } } class Child extends Base { private int i = 22; public Child() { System.out.println(this); i = 222; } public void display() { System.out.println("Child " + i); } } public void init() { new Child(); } public static void main(String[] args) { new CallOrder().init(); } }
输出结果是什么呢?
cn.com.wg.task01.CallOrder$Child@d0da1d8
Child 0
cn.com.wg.task01.CallOrder$Child@d0da1d8
此时,子类和父类构造函数的this代表同一个对象!!!this理解为代表调用该方法的那个对象更合适。
我们知道子类的构造函数会调用父类的构造函数(如果没有显示的调用,默认隐式调用无参的构造函数),所以在该程序中,父类的无参构造函数会在子类的构造函数中调用。因此,子类和父类构造函数的this代表同一个对象。
那么,输出的“Child 0”怎么解释呢?这里就牵涉到JVM的内存分配了。下面简单介绍。
当JVM遇到new关键字时,就会开始在内存中给对象分配空间。一个简单的java对象的在内存中包括三个部分:对象头、变量、填充区域。new结束后,变量域是初始化后的值(即boolean为false,char为'\0',其他基本类型为0,对象为null)。当遇到new后的类名是才开始执行我们代码中的构造函数。
这是用javap看到的class文件中Child的构造函数内容:
这是Base类的构造函数:
在Base类的构造函数中调用display方法,显然是调用在Child里写的display方法,i也是Child里的i。但是Child中,i的初始化是在调用display之前完成的,所以此时i=0;
如果我们把Child里的display去除,会输出什么呢?“Base 2”。此时调用的display肯定是Base里的了,而且i的初始化在调用display之前,而且这个i是在Base中声明的。那么,问题来了,Child对象中有几个i变量呢?“2个”。
这些问题全是由子类中覆盖了父类的成员变量造成的,所以不要轻易覆盖父类的成员变量,而且很少一定要这么做。
相关推荐
详细了解成员变量的覆盖问题,代码详细介绍,还有注释,易懂
另外静态方法不能覆盖父类的实例方法,而静态变量却可以隐藏父类的一个同名实例变量,同样,实例方法不能覆盖父类的同名静态方法,而变量却可以隐藏父类的同名变量成员,不论父类的这个变量成员是类变量或者是实例...
调用父类构造函数,对应文件:ClassElement2,文章:https://blog.csdn.net/yysyangyangyangshan/article/details/84311848
如果一个类继承一个父类,那么子类会拥有父类所规定的所以成员 子类还可以拥有父类没有的独有成员 父类可以完成的任务,子类对象也可以完成 子类可以调用父类Person p= new student(); 声明父类变量,实例化子类...
构造函数顺序:父类、类成员变量、子类 析构正好反过来
75.java成员变量与局部变量.zip75.java成员变量与局部变量.zip75.java成员变量与局部变量.zip75.java成员变量与局部变量.zip75.java成员变量与局部变量.zip75.java成员变量与局部变量.zip75.java成员变量与局部变量....
Unity3D教程:成员变量和全局变量在函数外面定义的变量叫做成员变量,它们能够通过Unity的检查器进行访问,存储在成员变量中的值将自动地保存在项目中。}使用
成员变量:在类中方法外 局部变量:在方法内或者方法声明处 在内存中的位置不同 成员变量:在堆内存中 局部变量:在栈内存中 初始化值不同 成员变量:有默认的初始化值 局部变量:没有初始化值,必须手动...
java 使用类作为成员变量 java 使用类作为成员变量
Java 面向对象中的两类 变量 : 成员变量和局部变量
ios demo,自定义一个类,实例变量instance和成员变量的实现
Java中的变量的详细介绍 。介绍成员变量和局部变量的区别。成员变量中的实例变量和静态变量的区变。
成员变量和局部变量的区别
本文章是关于final部分知识所作的自我总结,内容为final对成员变量和局部变量修饰的简要解答,除了对自我java学习的一个小结,也希望能够帮助到在java路上对该内容疑惑的同行
在A中定义有全局变量X(或类的静态成员变量),则在动态库B中访问的X,与可执行程序C中访问的X是同一个变量还是两个不同的变量? 答案:是两个不同的变量。 2. 工程中包含动态库A,动态库B,可执行程序C。C依赖于A和...
高手笔记 结构成员变量偏移量的两个应用 高手笔记 结构成员变量偏移量的两个应用 高手笔记 结构成员变量偏移量的两个应用 高手笔记 结构成员变量偏移量的两个应用
价值上万的Java精品网课教程\第07天(面向对象)
使用成员变量时,我们需要先创建一个类,并在类中定义成员变量。然后,我们可以创建类的对象,并使用对象访问和操作成员变量。以下是一个示例代码,演示了如何在C++中使用成员变量。 我们定义了一个名为MyClass的类...
类中静态成员变量和普通变量的区别——实例代码(VS2010),已测试,没有问题。
3种类的成员访问限制符//public 表示全局,公共,类内部外部子类都可以访问; //private表示私有的,只有本类内部可以使用; //protected表示受保护的,只有本类或子类或父类中可以访问;