看到一道面试题,答案理解不了,求大神解释
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);}
}
那为什么第一个输出为0呢,解释一下,不是赋值为10了吗,能不能从内存分配的角度讲讲这个过程。 --------------------编程问答--------------------
去看看继承情况下类的初始化过程 --------------------编程问答-------------------- 顶一下,这道题对于我这样的菜鸟来说确实是难以理解!请大神来做个详细的解释呗! --------------------编程问答-------------------- 除 --------------------编程问答--------------------
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.子类的域可以与父类同名。
比如: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楼很详细了。 --------------------编程问答--------------------
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);}
}
这个回答已经很棒了, --------------------编程问答--------------------
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);}
}
本类中的方法调用属性会先考虑调用自己的,如果没有就去继承父类中找,父类中在没有就会报错了!!!
补充:Java , Java SE