java中子类与父类成员变量重名的问题

class Animal {
protected String name= "mimi";

public String getName() { return name;}
}

class Cat extends Animal{
String name;

Cat(String name) {
this.name = name;
}

}

public class Test3 {
public static void main(String[] args) {
Cat c1 = new Cat("pipi");
System.out.println(c1.getName()); // 返回“mimi”
System.out.println(c1.name); // 返回“pipi”
Animal c2 = (Animal)c1;
System.out.println(c2.name); // 返回“mimi”
}
}

谁能解释一下。。。

Cat c1 = new Cat("pipi");
System.out.println(c1.getName()); // 返回“mimi”
因为,有继承关系的两个类是这样的,最终new出来的子类的对象的内部会有一个父类对象,在这里也就是说,这Cat对象的内部包含有一个Animal对象,而且Cat类中并没有定义getName()方法,换句话说就是没有重写父类Animal的getName()方法,所以c1.getName(),表面上看,我们总是说此方法是继承下来的
,所以在Cat类中没有定义,但是可以使用,这只是表面上这么理解,实际上内存中是什么样?就是我上面说的那样,Cat对象的内部还有一个Animal对象,所以c1.getName()的时候,实际上是调用的它里面的那个父类Animal对象的getName()方法,而Animal类中定义的getName()是return name;注意,return的这个name指的是自己Animal的name,对吧,所以打印出mimi
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-03-11
cat类继承了animal,在cat中只有构造方法,没有get方法。所以System.out.println(c1.getName()); // 返回“mimi” 调用了父类的方法
而System.out.println(c1.name); // 返回“pipi”,直接调用的是cat的构造方法。
Animal c2 = (Animal)c1;
System.out.println(c2.name); c2是animal类,所以只能用animal类的属性。父类不能用子类的属性,子类可以继承父类的属性。本回答被网友采纳
第2个回答  2017-09-10
class Animal {
protected String name= "mimi";
public String getName() { return name;}
}
class Cat extends Animal{
// String name; ///////////////这
Cat(String name) {
this.name = name;
}
}
public class Test3 {
public static void main(String[] args) {
Cat c1 = new Cat("pipi");

System.out.println(c1.getName()); // 返回“mimi”
System.out.println(c1.name); // 返回“pipi”

Animal c2 = (Animal)c1;
System.out.println(c2.name); // 返回“mimi”
}
}
第3个回答  2013-07-27
子类拥有除父类的private的方法和成员变量。
当子类的对象调用继承父类的方法时,用的是父类的对象;当调用自己的方法时,用的是自己的方法。
第4个回答  2013-07-27
我跟上面的看法有些不同。
因为new出一个之类的对象时,内存中会保存一个父类的对象。所以父类对象中有共有的属性,而之类中也有子类自己的属性。

如果改成下面这样就全行了。
class Animal
{
protected String name= "mimi";
public Animal(String name)
{
this.name=name;
}
public String getName()
{
return this.name;
}
}
class Cat extends Animal
{
String name;
Cat(String name)
{
super(name);
this.name = name;
}
}
public class Test3
{
public static void main(String[] args)
{
Cat c1 = new Cat("pipi");
System.out.println(c1.getName()); // 返回“pipi”
System.out.println(c1.name); // 返回“pipi”
Animal c2 = (Animal)c1;
System.out.println(c2.name); // 返回“pipi”
}
}