当前位置:编程学习 > JAVA >>

看到一道面试题,答案理解不了,求大神解释

class Father
{
int m=5;
public Father(){this.show();}
void show(){System.out.println("父");}
}
class Child1 extends Father
{
int m=10;

void show(){System.out.println(m);}
}
class Child2 extends Father
{

void show(){System.out.println(m);}
}
class Test
{
public static void main(String args[])
{
Father n=new Child1();

Father n1=new Child2();

}
} --------------------编程问答-------------------- 这道题问的是什么? --------------------编程问答-------------------- 因为child1和child2中均没有自己的构造器,所以创建对象时调用的是父类Father中的构造器。但是由于创建的对象(即new的对象)是子类的对象,所以它虽然构造器调用的是父类中的,但是this.show()却调用的是子类中的show()方法,this表示当前对象(即指子类对象)。child1输出0,child1中声明的属性m覆盖了父类中的属性,故输出的值为0.而child输出5是因为它继承了父类中的m故输出的值为5. --------------------编程问答-------------------- 这就是多态啊   --------------------编程问答-------------------- 1.子类的域可以与父类同名。
  比如:Child1 c1=new Child1();
  c1会有两个int型的域:super.m和m(也就是this.m)。
2.构造子类对象的时候,会先调用父类的构造方法,对继承自父类的域进行初始化,然后再对子类定义的域
  进行初始化。
  可以用下面的代码验证这个过程:
  


public class Test{


public static void main(String args[])
{
//执行Father()==>Child1.show():此时父类的构造方法还未结束,子类的域m还没有初始化
Father n1=new Child1();
Father n2=new Child2();
}
}

class Father{
int m=5;

public Father(){
System.out.println("father constructor start");
this.show();
System.out.println("father constructor end");
}

void show(){
System.out.println("father show");
System.out.println("父");
}
}

class Child1 extends Father{
int m = 6;

public Child1(){
System.out.println("child1 constructor start");
this.show();
System.out.println("child1 constructor end");
}

void show(){
System.out.println("child1 show start");
System.out.println(m);
System.out.println("child1 show end");
}
}

class Child2 extends Father{
void show(){System.out.println(m);}
}
--------------------编程问答-------------------- 这个题目要问什么? --------------------编程问答--------------------
引用 2 楼 sxl200852 的回复:
因为child1和child2中均没有自己的构造器,所以创建对象时调用的是父类Father中的构造器。但是由于创建的对象(即new的对象)是子类的对象,所以它虽然构造器调用的是父类中的,但是this.show()却调用的是子类中的show()方法,this表示当前对象(即指子类对象)。child1输出0,child1中声明的属性m覆盖了父类中的属性,故输出的值为0.而child输出5是因为它继承了父类中的m故输出的值为5.


那为什么第一个输出为0呢,解释一下,不是赋值为10了吗,能不能从内存分配的角度讲讲这个过程。 --------------------编程问答--------------------
引用 6 楼 huoer_gf 的回复:
Quote: 引用 2 楼 sxl200852 的回复:

因为child1和child2中均没有自己的构造器,所以创建对象时调用的是父类Father中的构造器。但是由于创建的对象(即new的对象)是子类的对象,所以它虽然构造器调用的是父类中的,但是this.show()却调用的是子类中的show()方法,this表示当前对象(即指子类对象)。child1输出0,child1中声明的属性m覆盖了父类中的属性,故输出的值为0.而child输出5是因为它继承了父类中的m故输出的值为5.


那为什么第一个输出为0呢,解释一下,不是赋值为10了吗,能不能从内存分配的角度讲讲这个过程。


去看看继承情况下类的初始化过程 --------------------编程问答-------------------- 顶一下,这道题对于我这样的菜鸟来说确实是难以理解!请大神来做个详细的解释呗! --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 4 楼 pashanhuha 的回复:
1.子类的域可以与父类同名。
  比如:Child1 c1=new Child1();
  c1会有两个int型的域:super.m和m(也就是this.m)。
2.构造子类对象的时候,会先调用父类的构造方法,对继承自父类的域进行初始化,然后再对子类定义的域
  进行初始化。
  可以用下面的代码验证这个过程:
  


public class Test{


public static void main(String args[])
{
//执行Father()==>Child1.show():此时父类的构造方法还未结束,子类的域m还没有初始化
Father n1=new Child1();
Father n2=new Child2();
}
}

class Father{
int m=5;

public Father(){
System.out.println("father constructor start");
this.show();
System.out.println("father constructor end");
}

void show(){
System.out.println("father show");
System.out.println("父");
}
}

class Child1 extends Father{
int m = 6;

public Child1(){
System.out.println("child1 constructor start");
this.show();
System.out.println("child1 constructor end");
}

void show(){
System.out.println("child1 show start");
System.out.println(m);
System.out.println("child1 show end");
}
}

class Child2 extends Father{
void show(){System.out.println(m);}
}
求大神详细解释一下! --------------------编程问答--------------------
看看这顺序,在父类构造方法没完成时 子类m=10其实还同有执行到,也就是给值也没有用,打印出来的应该是int的默认值0 --------------------编程问答-------------------- 这不是一个继承类吗?不知道要问什么问题啊 --------------------编程问答--------------------
引用 1 楼 aftermisak 的回复:
这道题问的是什么?
就是问输出 --------------------编程问答--------------------
引用 10 楼 cykabc 的回复:
Quote: 引用 4 楼 pashanhuha 的回复:

1.子类的域可以与父类同名。
  比如:Child1 c1=new Child1();
  c1会有两个int型的域:super.m和m(也就是this.m)。
2.构造子类对象的时候,会先调用父类的构造方法,对继承自父类的域进行初始化,然后再对子类定义的域
  进行初始化。
  可以用下面的代码验证这个过程:
  


public class Test{


public static void main(String args[])
{
//执行Father()==>Child1.show():此时父类的构造方法还未结束,子类的域m还没有初始化
Father n1=new Child1();
Father n2=new Child2();
}
}

class Father{
int m=5;

public Father(){
System.out.println("father constructor start");
this.show();
System.out.println("father constructor end");
}

void show(){
System.out.println("father show");
System.out.println("父");
}
}

class Child1 extends Father{
int m = 6;

public Child1(){
System.out.println("child1 constructor start");
this.show();
System.out.println("child1 constructor end");
}

void show(){
System.out.println("child1 show start");
System.out.println(m);
System.out.println("child1 show end");
}
}

class Child2 extends Father{
void show(){System.out.println(m);}
}
求大神详细解释一下!

11楼很详细了。 --------------------编程问答--------------------
引用 4 楼 pashanhuha 的回复:
1.子类的域可以与父类同名。
  比如:Child1 c1=new Child1();
  c1会有两个int型的域:super.m和m(也就是this.m)。
2.构造子类对象的时候,会先调用父类的构造方法,对继承自父类的域进行初始化,然后再对子类定义的域
  进行初始化。
  可以用下面的代码验证这个过程:
  


public class Test{


public static void main(String args[])
{
//执行Father()==>Child1.show():此时父类的构造方法还未结束,子类的域m还没有初始化
Father n1=new Child1();
Father n2=new Child2();
}
}

class Father{
int m=5;

public Father(){
System.out.println("father constructor start");
this.show();
System.out.println("father constructor end");
}

void show(){
System.out.println("father show");
System.out.println("父");
}
}

class Child1 extends Father{
int m = 6;

public Child1(){
System.out.println("child1 constructor start");
this.show();
System.out.println("child1 constructor end");
}

void show(){
System.out.println("child1 show start");
System.out.println(m);
System.out.println("child1 show end");
}
}

class Child2 extends Father{
void show(){System.out.println(m);}
}


这个回答已经很棒了, --------------------编程问答--------------------
引用 4 楼 pashanhuha 的回复:
1.子类的域可以与父类同名。
  比如:Child1 c1=new Child1();
  c1会有两个int型的域:super.m和m(也就是this.m)。
2.构造子类对象的时候,会先调用父类的构造方法,对继承自父类的域进行初始化,然后再对子类定义的域
  进行初始化。
  可以用下面的代码验证这个过程:
  


public class Test{


public static void main(String args[])
{
//执行Father()==>Child1.show():此时父类的构造方法还未结束,子类的域m还没有初始化
Father n1=new Child1();
Father n2=new Child2();
}
}

class Father{
int m=5;

public Father(){
System.out.println("father constructor start");
this.show();
System.out.println("father constructor end");
}

void show(){
System.out.println("father show");
System.out.println("父");
}
}

class Child1 extends Father{
int m = 6;

public Child1(){
System.out.println("child1 constructor start");
this.show();
System.out.println("child1 constructor end");
}

void show(){
System.out.println("child1 show start");
System.out.println(m);
System.out.println("child1 show end");
}
}

class Child2 extends Father{
void show(){System.out.println(m);}
}
小妹小问的是在父类的构造器中调用this.show();怎么执行的是子类的show方法呢?小妹新手,请大神解释一下! --------------------编程问答-------------------- 实例的初始化及方法的多态 --------------------编程问答-------------------- 自己debug一下,看看程序运行的顺序,立马清晰了很多 --------------------编程问答-------------------- 属性不存在多态
本类中的方法调用属性会先考虑调用自己的,如果没有就去继承父类中找,父类中在没有就会报错了!!!
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,