class Base { private int val;
public Base(){
val = lookup();
}
public int lookup(){
return 5;
}
public int getVal(){
return val;
}
}
public class Derived extends Base{
public int num =10 ;
public int lookup(){
return num;
}
public static void main(String[] args){
Derived d = new Derived();
System.out.println("From main() d.getVal() returns "+d.getVal());
}
}运行结果:From main() d.getVal() returns 0
为什么是结果是0呢?
请赐教。
d.getVal()调用的是继承自父类的方法,val你没有初始化所以默认就是0啊
Derived d = new Derived();
//会执行父类的无参数的构造函数,
//而且Derived类覆盖父类的lookup()
//所以当执行父类的的无参构造方法时val = lookup();
//lookup()其实是调用的子类Derived的方法
public int lookup(){
return num;
}
//而这时候num还未初始化所以默认0
//因此val=0
public int lookup(){
return num;
}
num还没有初始化呢,即 num =10 ;还没有被执行,只是为num分配了空间,它的值初始值为0。
正解!!!是子类中num没有赋值,只是初始化为0,然后lookup返回的就是0。你可以研究一下初始化顺序的。class P {
static String ps1 = "ps1";
String ps2 = "ps11";
{
System.out.println(ps1);
ps1= "ps1--";
}
public P() {
System.out.println(ps1);
System.out.println("p--"+getPs());
System.out.println("p--"+getPss());
} public String getPs() {
return ps1;
}
public String getPss() {
return ps2;
}
}class C extends P {
static String ps1 = "ps2";
String ps2 = "ps22";
{
System.out.println(ps1);
ps1 = "ps2--";
}
public String getPs() {
System.out.println("zhixing");
return ps1;
}
public String getPss() {
System.out.println("zhixing-sss");
return ps2;
}
public C() {
System.out.println(ps1);
}
}
// new P();
//output:~
/*
ps1
ps1--
zhixing
p--ps2
zhixing-sss
p--null
ps2
ps2--
*/
public Base(){
val = lookup();
System.out.println("Base constructor ! val:"+val);
}
public int lookup(){
System.out.println("Base lookup!");
return 5;
}
public int getVal(){
return val;
}
}
public class Derived extends Base{
public int num =10 ; public Derived() {
System.out.println("Derived constructor! num:"+num);
} public int lookup(){
System.out.println("Derived lookup! num: " + num);
return num;
}
public static void main(String[] args){
Derived d = new Derived();
System.out.println("From main() d.getVal() returns :"+d.getVal());
}
}运行结果:
Derived lookup! num: 0
Base constructor ! val:0
Derived constructor! num:10
From main() d.getVal() returns :0结果分析:
因为Derived 类继承了Base类,所以在实例化Derived类时会先实例化Base类。
在调用Base类无参构造方法时,调用了子类的lookup()方法,由于Derived 类还没有被实例化,所以num的默认值就是0。
执行完Base类的构造方式时,Base类的val也就有了值0;
当Base类实例化完成之后会调用子类的无参的构造方法,这时候Derived类被实例化num被赋值为10;
最后输出的时候调用的是父类的getVal()方法,所以输出的值也就是0了;
同意这个,楼主不如debug一下吧,设置断电看数值
class Base {
private int val;
public Base(){
val = lookup();
}
public int lookup(){
return 5;
}
public int getVal(){
return val;
}
}public class Derived extends Base{
public int lookup(){
return 10;
}
public static void main(String[] args){
Base d = new Derived();
System.out.println(d.getVal());
}
}
package study;public class Base { private int val;
public Base(){
val = lookup();
}
public int lookup(){
return 5;
}
public int getVal(){
return val;
}
public static void main(String[] args){
Xa d = new Xa();
System.out.println("From main() d.getVal() returns "+d.getVal());
}
}
class Xa extends Base{
public int num =10 ;
public int lookup(){
return num;
}
}