2014-09-27 47 views
1

我不确定这些问题是否仍然适合被问,因为可能已经有答案。但是当涉及父类和子类关系中的属性时,我仍然不理解继承的概念。请注意下面的例子。Iinherited字段的值不会更改

class Animal{ 
    public int lifeSpan = 50; 

    public String imAn(){ 
     return "I'm an Animal"; 
    } 
} 

class Elephant extends Animal{ 
    public int lifeSpan = 100; 

    public String imAn(){ 
     return "I'm an Elephant"; 
    } 
} 

public class Test{ 
    public static void main(String args[]){ 
    Animal animal = new Elephant(); 
    System.out.println(animal.imAn()+" and i live around "+animal.lifeSpan+" years"); 
    } 
} 

答案将是:我是大象,我生活在50年左右。

我明白这里的虚拟方法调用概念,但是什么使得它不会加载子类的lifeSpan属性。这是否意味着类属性不是多态的?

回答

2

这是否意味着类属性不是多态?

不,字段不是多态。实际上,你已经得到了你的Elephant类领域 - 在Animal声明并在Elephant宣布一个一个,这皮革那个在Animal。那就是问题所在。您应该删除Elephant中的lifeSpan的声明,而是在构造函数中初始化其余字段中的一个

你应该养成了私人领域的习惯 - 最后,如果可能的话。假设你真的想有一个方法来描述名称(而不是字段,这将是更通常的),我会写你的代码为:

class Animal { 
    private final int lifeSpan; 

    public Animal() { 
     // Default to a life-span of 50 
     this(50); 
    } 

    public Animal(int lifeSpan) { 
     this.lifeSpan = lifeSpan; 
    } 

    public String getName(){ 
     return "Animal"; 
    } 

    public int getLifeSpan() { 
     return lifeSpan; 
    } 
} 

class Elephant extends Animal { 
    public Elephant() { 
     // Give every elephant a life-span of 100. 
     super(100); 
    } 

    @Override public String getName() { 
     return "Elephant"; 
    } 
} 

public class Test { 
    public static void main(String args[]){ 
     Animal animal = new Elephant(); 
     System.out.printf("I am an %s and I live around %d years%n", 
      animal.getName(), animal.getLifeSpan()); 
    } 
} 
+0

我可以看到上述问题的更好的实现。谢谢你的解释。但是我完全觉得如果它的隐藏属性的范围是无用的。林不知道,但是,在这种情况下,java应该提供一个编译时错误。我非常欣赏你限制可变私人决赛的方式。 – 2014-09-27 07:19:01

+0

@KumarKailash:它为什么会给编译时错误 - 和*哪里*?请注意,任何具有“Elephant”类型表达式的代码都将使用在“Elephant”中声明的字段,任何具有“Animal”类型表达式的代码都将使用在“Animal”中声明的字段。从根本上说,问题是你有两个领域,但只有一个信息。有时候它可能会使层次结构中的两个类都具有相同名称的字段 - 但是如果你的字段是私有的(因为我相信它们几乎总是),它不会成为一个问题。 – 2014-09-27 07:24:13

+0

非常感谢。非常有说服力。是的,我同意在层次结构中具有相同名称的字段没有任何问题。 – 2014-09-27 07:29:07