关于Java中子类覆盖父类方法调用情况

买菜做饭 2016-02-27 03:38:23
今天在看一个关于覆盖的总结文档 里面有一个程序是这样的
class Base {

private String name = "base";

public Base() {
tellName();
printName();
}
public void tellName() {
System.out.println("Base tell name: " + name);
}

public void printName() {
System.out.println("Base print name: " + name);
}
}
class Dervied extends Base {

private String name = "dervied";

public Dervied() {
tellName();
printName();
}

public void tellName() {
System.out.println("Dervied tell name: " + name);
}

public void printName() {
System.out.println("Dervied print name: " + name);
}
}

public class OverrideTest {

public static void main(String[] args) {
new Dervied();
}
}

程序运行结果是这样的:
Dervied tell name: null
Dervied print name: null
Dervied tell name: dervied
Dervied print name: dervied

看网上解答说,是子类覆盖了父类的tell name() 和 print name()方法 所以在父类的构造函数中调用的是子类的tell name() 和 print name()方法。
既然是子类了覆盖了父类中的方法 ,那为什么我直接创建父类对象时调用的又是父类自己的tell name() 和 print name()方法呢
public class OverrideTest {

public static void main(String[] args) {

// new Dervied();

new Base();

}

}

程序运行结果是:
Base tell name: base
Base print name: base

不理解 求大神指教!!!!!
...全文
512 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
李大白白 2019-02-12
  • 打赏
  • 举报
回复
引用 7 楼 qq_42479443 的回复:
[quote=引用 3 楼 李大白白 的回复:]
如果你创建子类的对象 , 子类的方法构造方法默认调用父类构造函数, 所以父类和子类的构造方法是一起调用的.

而你创建父类的对象时, 并不会调用子类的构造方法, 所以只有父类的构造方法生效 , .
虽然说子类覆盖了父类的方法, 但是在这个过程中并没有创建过子类的对象 ,
所以说子类的方法是不会生效的

除非你的这样
public class Test {
public static void main(String[] args) {
//用父类new一个子类的对象 ,
Base base = new Dervied();
}
}
class Base {

private String name = "base";

public Base() {
tellName();
printName();
}
public void tellName() {
System.out.println("Base tell name: " + name);
}

public void printName() {
System.out.println("Base print name: " + name);
}
}
class Dervied extends Base {

private String name = "dervied";

public Dervied() {
tellName();
printName();
}

public void tellName() {
System.out.println("Dervied tell name: " + name);
}

public void printName() {
System.out.println("Dervied print name: " + name);
}
}


那么控制台就会打印
Dervied tell name: null
Dervied print name: null
Dervied tell name: dervied
Dervied print name: dervied

这里输出的为什么是null啊,父类和子类都有初始化,不应该输出值吗?求大神指教[/quote]

这里不该用同一个方法名,因为同一个名字就相当于重写了父类方法,所以父类加载的时候,调用的是子类的方法,而此时子类的成员变量还没有初始化,所以就是null了。
其实把子类的方法名改下即可了
1174375244 2019-01-21
  • 打赏
  • 举报
回复
引用 3 楼 李大白白 的回复:
如果你创建子类的对象 , 子类的方法构造方法默认调用父类构造函数, 所以父类和子类的构造方法是一起调用的. 而你创建父类的对象时, 并不会调用子类的构造方法, 所以只有父类的构造方法生效 , . 虽然说子类覆盖了父类的方法, 但是在这个过程中并没有创建过子类的对象 , 所以说子类的方法是不会生效的 除非你的这样
public class Test {
	public static void main(String[] args) {
		//用父类new一个子类的对象 , 
		Base base = new Dervied();
	}
}
class Base {
    
    private String name = "base";
 
    public Base() {
        tellName();
        printName();
    }
    public void tellName() {
        System.out.println("Base tell name: " + name);
    }
     
    public void printName() {
        System.out.println("Base print name: " + name);
    }
}
class Dervied extends Base {
 
    private String name = "dervied";
 
    public Dervied() {
        tellName();
        printName();
    }
     
    public void tellName() {
        System.out.println("Dervied tell name: " + name);
    }
     
    public void printName() {
        System.out.println("Dervied print name: " + name);
    }  
}
那么控制台就会打印 Dervied tell name: null Dervied print name: null Dervied tell name: dervied Dervied print name: dervied
这里输出的为什么是null啊,父类和子类都有初始化,不应该输出值吗?求大神指教
1174375244 2019-01-21
  • 打赏
  • 举报
回复
引用 2 楼 shallynever 的回复:
这个我知道 我问的不是这个意思 我是想问既然说覆盖了父类中的方法 那为什么在直接创建父类对象时(也会调用父类的构造函数),此时调用的方法为什么又不是子类覆盖的方法。
这是因为java中有多态的缘故,能点出来什么看类型,调用的是哪一个方法看new的对象
买菜做饭 2016-02-29
  • 打赏
  • 举报
回复
可以楼上说的例子就是创建了一个子类对象的,跟我给出的例子似乎是一样的 这两天看了一下JAVA虚拟机运行机制好像懂了一点,不过还是谢谢大家!
go___Java 2016-02-29
  • 打赏
  • 举报
回复
楼上正解,看你创建谁,
李大白白 2016-02-27
  • 打赏
  • 举报
回复
如果你创建子类的对象 , 子类的方法构造方法默认调用父类构造函数, 所以父类和子类的构造方法是一起调用的. 而你创建父类的对象时, 并不会调用子类的构造方法, 所以只有父类的构造方法生效 , . 虽然说子类覆盖了父类的方法, 但是在这个过程中并没有创建过子类的对象 , 所以说子类的方法是不会生效的 除非你的这样
public class Test {
	public static void main(String[] args) {
		//用父类new一个子类的对象 , 
		Base base = new Dervied();
	}
}
class Base {
    
    private String name = "base";
 
    public Base() {
        tellName();
        printName();
    }
    public void tellName() {
        System.out.println("Base tell name: " + name);
    }
     
    public void printName() {
        System.out.println("Base print name: " + name);
    }
}
class Dervied extends Base {
 
    private String name = "dervied";
 
    public Dervied() {
        tellName();
        printName();
    }
     
    public void tellName() {
        System.out.println("Dervied tell name: " + name);
    }
     
    public void printName() {
        System.out.println("Dervied print name: " + name);
    }  
}
那么控制台就会打印 Dervied tell name: null Dervied print name: null Dervied tell name: dervied Dervied print name: dervied
买菜做饭 2016-02-27
  • 打赏
  • 举报
回复
这个我知道 我问的不是这个意思 我是想问既然说覆盖了父类中的方法 那为什么在直接创建父类对象时(也会调用父类的构造函数),此时调用的方法为什么又不是子类覆盖的方法。
A_finder 2016-02-27
  • 打赏
  • 举报
回复
你在创建子类是,会默认调用父类的构造函数。
public Dervied() {
        tellName();
        printName();
    }
 public Dervied() {
    	super();
        tellName();
        printName();
    }
是相同的,只不过,只不过在代码中没有显示写出来。

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧