package test;
class people{
private String name="people";
public void speak() {
System.out.println(this.getClass().toString()+"    name="+name);
}
}
class man extends people{
String name="man";
}
class baby extends man{
String name="baby";}public class test {
public static void main(String[] args) {
people p=new people();
man m=new man();
baby b=new baby();
p.speak();
m.speak();
b.speak();
}
}
运行结果:
class test.people    name=people
class test.man    name=people
class test.baby    name=peopleJava中的继承不是子类拥有父类非private的属性和方法么,为什么子类中输出的还是父类name定义的“people”呢?

解决方案 »

  1.   

    https://blog.csdn.net/zhanghan18333611647
      

  2.   

    name属性是私有的,子类不能继承父类私有属性或方法,但父类自己却可以使用自己的私有属性和方法,所以此处如果不重写父类的speak()方法,默认调用的是父类的方法,父类的属性,你可以去看看重写的概念。当子类覆盖父类的成员变量时,父类方法使用的是父类的成员变量,子类方法使用的是子类的成员变量
      

  3.   

    private的东西也能继承,但是子类中不能访问,可以通过调用父类的方法访问package question.one;class people {
    private String name = "people"; public void speak() {
    System.out.println(this.getClass().toString() + "    name=" + this.name);
    }
    }class man extends people {
    public void speak() {
    super.speak();
    }
    }class baby extends man {
    public void speak() {
    super.speak();
    }}public class test {
    public static void main(String[] args) {
    people p = new people();
    man m = new man();
    baby b = new baby();
    p.speak();
    m.speak();
    b.speak();
    }
    }
      

  4.   

    没错,子类是继承了父类的方法,但那依然是父类的方法,子类只是获得了使用的权力,想要输出子类的自己的name,就得把speak方法变成是子类自己的,所以需要覆盖speak方法来变成子类自己的
    class People{
    private String name = "people";
    public void speak() {
    System.out.println(this.getClass().toString()+"  name = "+name);
    }
    }
    class Man extends People{
    String name = "man";
    public void speak() {
    System.out.println(this.getClass().toString()+"  name = "+name);
    }
    }
    class Baby extends People{
    String name = "baby";
    public void speak() {
    System.out.println(this.getClass().toString()+"  name = "+name);
    }
    }
    public class Test { public static void main(String[] args) {
    People p = new People();
    Man m = new Man();
    Baby b = new Baby();
    p.speak();
    m.speak();
    b.speak(); }}
    输出结果:
    class limoxin.People  name = people
    class limoxin.Man  name = man
    class limoxin.Baby  name = baby
      

  5.   

    子类是继承了父类的方法,但那依然是父类的方法,子类只是获得了使用的权力,想要输出子类的自己的name,就得把speak方法变成是子类自己的,所以需要覆盖speak方法来变成子类自己的
      

  6.   

    调用的是父类对象中的speak方法,父类对象是访问不到子类的name属性的,所以其实访问的还是子类继承父类的name属性,相当于super.name,super.name还是people
      

  7.   

    super.speak();是调用的父类自己的方法
      

  8.   

    我觉得你这个是java里面的就近原则,因为你是在父类中定义输出方法的,而且你是直接+name输出的
      

  9.   

    方法和变量都是父类的,子类不能访问private,调用speak就是调用父类的方法。
      

  10.   

    你这里虽然子类对父类的name属性覆盖了,但是speak()方法没有覆盖,这样就造成你通过子类对象调用父类的speak()方法,父类的方法中输出的name属性便是父类的name属性。你需要在子类中重写speak()方法才能有你想要的结果。
    如下代码:
    package com.lin.helloworld;class people{
    private String name="people";
    public void speak() {
    System.out.println(this.getClass().toString()+"    name="+name);
    }
    }
    class man extends people{
    String name="man";
    public void speak() {
    System.out.println(this.getClass().toString()+"    name="+name);
    }
    }
    class baby extends man{
    String name="baby";
    public void speak() {
    System.out.println(this.getClass().toString()+"    name="+name);
    }}public class Test {
    public static void main(String[] args) {
    people p=new people();
    man m=new man();
    baby b=new baby();
    p.speak();
    m.speak();
    b.speak();
    }
    }
      

  11.   

    简单地说,因为你没有重写父类中的speak方法,所以子类对象调用父类方法时,还是会使用父类的私有成员
      

  12.   

    Quote: 引用 6 楼 limoxin_ 的回复:

    没错,子类是继承了父类的方法,但那依然是父类的方法,子类只是获得了使用的权力,想要输出子类的自己的name,就得把speak方法变成是子类自己的,所以需要覆盖speak方法来变成子类自己的
    class People{
    private String name = "people";
    public void speak() {
    System.out.println(this.getClass().toString()+"  name = "+name);
    }
    }
    class Man extends People{
    String name = "man";
    public void speak() {
    System.out.println(this.getClass().toString()+"  name = "+name);
    }
    }
    class Baby extends People{
    String name = "baby";
    public void speak() {
    System.out.println(this.getClass().toString()+"  name = "+name);
    }
    }
    public class Test { public static void main(String[] args) {
    People p = new People();
    Man m = new Man();
    Baby b = new Baby();
    p.speak();
    m.speak();
    b.speak(); }}
    输出结果:
    [code=java]class limoxin.People  name = people
    class limoxin.Man  name = man
    class limoxin.Baby  name = baby
      

  13.   

    java虚拟机的方法表中存储该类所具有的所有方法,包括继承来的方法。
    每个方法有一个指向方法数据的指针,也就是父类的方法则指向父类的数据。所以实际调用的方法是该类拥有的方法(包括继承来的方法),但方法访问的数据则是该方法指向的数据(继承来的方法指向继承来的数据)