class Base
{ protected int a;
Base() {
a = 1;
}
} class Child1 extends Base
{
Child1(){
a = 2;
System.out.println(a);
}
public int getBaseA() {
return super.a;
}
} class Child2 extends Base
{
Child2() {
a = 3;
System.out.println(a);
} public int getBaseA() {
return super.a;
}
} public class Test
{
public static void main(String[] args)
{
Child1 ch1 = new Child1();
Child2 ch2 = new Child2();
System.out.println(ch2.getBaseA()); // child1与child2有同1个父类,这里的 super.a 为3,
System.out.println(ch1.getBaseA()); // 而为什么这里的 super.a 又为 2 ?
}
} 输出结果为 2,3,3,2 哪位能解释清楚为什么输出结果如此即可,谢谢 ? 我主要困惑在于继承之后,子类究竟是在自己的内存中新建1个变量a 还是包含1个指向父类的指针,从这程序来看,貌似两种情况都不是.
{ protected int a;
Base() {
a = 1;
}
} class Child1 extends Base
{
Child1(){
a = 2;
System.out.println(a);
}
public int getBaseA() {
return super.a;
}
} class Child2 extends Base
{
Child2() {
a = 3;
System.out.println(a);
} public int getBaseA() {
return super.a;
}
} public class Test
{
public static void main(String[] args)
{
Child1 ch1 = new Child1();
Child2 ch2 = new Child2();
System.out.println(ch2.getBaseA()); // child1与child2有同1个父类,这里的 super.a 为3,
System.out.println(ch1.getBaseA()); // 而为什么这里的 super.a 又为 2 ?
}
} 输出结果为 2,3,3,2 哪位能解释清楚为什么输出结果如此即可,谢谢 ? 我主要困惑在于继承之后,子类究竟是在自己的内存中新建1个变量a 还是包含1个指向父类的指针,从这程序来看,貌似两种情况都不是.
那么就继承了他的非私有的成员
Child2 ch2 = new Child2(); 在构造器中打印了a=3,这个a是ch2的a;
System.out.println(ch2.getBaseA());打印ch2中的a=3;
System.out.println(ch1.getBaseA());打印ch1中的a=2;
子类是在自己的内存中新建1个变量a。子类new时,是先调父类的构造器的。也就是说父类也new了。
不苟同红色部分的.在初始化时,是先进行父类初始化再进行子类的.所以当然是先让a = 1,进而再进行赋值为2或赋值为3的操作(这也就是最后再输出3,2的原因).会调用父类的构造函数,但是不是new一个父类.调用父类的构造函数只是为初始化工作服务的,因为子类有从父类那里继承来的属性,这些属性通过父类的构造函数进行初始赋值.
至始至终,都没有父类被构建.super调用的可以说只是调用了存储在子类里面的父类属性,而这些信息说到底还是子类的.简单地说:不能说你继承自你父亲高挺的鼻子就断定你的鼻子就是你父亲的了.
子类new的话,子类的对象数据放到那里?
new子类的时候,可仅仅是有一个指针啊。
大侠们回答下。
你可以想象成这样的内存布局, Child1和Child2没有自己再定义变量,
所以继承了Base的a成员变量,Protected只是告诉编译器,我希望可以在
Child1和Child2内也可以修改这个变量,当你生成Child1,Child2的实例时,
它们存在于各自的内存块内,各自独立变化,当然不会相互影响了。struct Base
{
int a;
}struct Child1
{
int a;
}struct Child2
{
int a;
}
public A(){
i=1;
}
public A(int i){
this();
this.i=i;
}
这里的this()也算new 了一个实例?内存里有空间吗?
那我再new A(5) 算是new了一个实例吧,那this()的实例放到那里去了?new A(5)的空间呢,放到那里去了?
Base ch3 = new Child2();
System.out.println(ch3.getBaseA());
是吗、
{
public static void main(String[] args)
{
Child1 ch1 = new Child1(); //ch1实例化的时候先调用了super.(),然后给变量a赋值为2,所以最后一句打印2
Child2 ch2 = new Child2(); //ch2实例化的时候先调用了super.(),然后给变量a赋值为3,所以下一句打印3
System.out.println(ch2.getBaseA()); // child1与child2有同1个父类,这里的 super.a 为3,
System.out.println(ch1.getBaseA()); // 而为什么这里的 super.a 又为 2 ?
}
}
34楼说的好。
如果要很深入的话 就是 heap,stack,codedegment,constant pool了!!!!!
建议你感觉程序可以看懂的话,,,,就可以看看内存分析了 看了以后 你会感觉柳暗花明的!~~~~~~~~~~~
我就是那样过来的
首先在构造子类函数时,同时也构造了父类函数,即
Child1(){
super();
a = 2;
System.out.println(a);
}
所以你若问子类是在自己的内存中新建1个变量a ?当然是,只不过是在构造父类时创建变量a的。其次child2在构造函数时,也构造了父类函数。
Child2() {
super();
a = 3;
System.out.println(a);
}
两个super()都是new父类,即各自给父类分配了不同的地址,因此,两个子类的父类是毫无瓜葛的。
abstract class abs {
int i=0;
public abs(){}
public abs(int i){
this.i=i;
}
public int geTI(){
return i;
}
public abstract String getI();
}
public class abc extends abs{
public abc(int i){
super(i);
}
public String getI(){
return "nihao" ;
}
public static void main(String[] args){
abs abc=new abc(5);
System.out.println(abc.geTI());
System.out.println(abc.getI());
}
}
Child2 ch2 = new Child2(); 创建对象ch2,构造父类2ch1在创建时通过:Child1(){ a = 2; }; 把父类1的a变为2;
ch2在创建时通过:Child2(){ a = 3; }; 把父类2的a变为3;Child1 ch1 = new Child1(); 输出父类1的a:2
Child2 ch2 = new Child2(); 输出父类2的a:3
System.out.println(ch2.getBaseA()); 输出父类2的a:3
System.out.println(ch1.getBaseA()); 输出父类1的a:2对象ch1和ch2共用同一个父类,那是在定义的时候。
但创建对象时,对象ch1和ch2都有自己的“父对象”(不知道这样说对不对,先这样叫吧),两个不同的对象!所以结果如此。