如果我更改父类的实例变量,则这些更改会反映在Child类中,即使它们具有不同的identityHashCodes。为什么会这样?
我尝试创建孩子自己的实例变量,由于引用类型调用,该实例变量不反映更改。另外,我首先调用了打印实例变量的子方法,然后调用了进行一些更改然后打印的父方法。这证明了更改是动态完成的,而不是在编译时完成的。我尝试使用两个构造函数,这些构造函数对我的问题没有太大影响。
class Library{
int count = 500;
int years = 70;
Library(){
System.out.println(" Constructor library ");
}
Library(int count,int years){
this.count = count;
this.years = years;
System.out.println(" Constructor library ");
}
void libraryInfo(){
count++;
System.out.println(System.identityHashCode(count));
System.out.println(" Years " + years);
System.out.println(" Count " + count);
}
}
class Book extends Library{
//int count = 500;
//int years = 70;
Book(){
super(700,80);
// super();
}
void libraryInfo(){
super.libraryInfo();
System.out.println(System.identityHashCode(count));
System.out.println(" Years " + years);
System.out.println(" Count " + count);
//super.libraryInfo();
}
public static void main(String args[]){
Book b = new Book();
b.libraryInfo();
}
}
预期结果是,更改仅限于父类。 实际结果表明更改也反映在Child对象上。
答案 0 :(得分:2)
没有“父对象”和“子对象”。只有一个“对象”。
一个类(或多或少)只是用于创建对象的蓝图。通过继承,某些蓝图被写入父级,而某些蓝图被写入子级。
在您的情况下,您的对象是一本书。该书恰好具有它从图书馆继承的某些特征,但仍然是一本书。没有一本书和一本图书馆作为不同的对象。 (这是一个非常奇怪的继承模型:图书馆与书籍几乎没有共同点)
答案 1 :(得分:1)
我认为您的主要困惑在于对System.identityHashCode的理解,正如注释中所述:
Returns the same hash code for the given object as
would be returned by the default method hashCode(),
whether or not the given object's class overrides
hashCode().
如果从count到this的更改参数,它们将返回相同的值。您可以在Book类中定义计数以覆盖父类(如果您希望将它们分开)。
答案 2 :(得分:1)
我将尝试通过一个奇怪的例子来更简单地解释它,但这可能有助于理解这个概念。
假设父亲为儿子购买了一辆自行车,那么他的儿子可以说这是他的自行车(因为他是从父亲那里继承来的),他可以随时骑自行车。
现在说自行车中只剩下1升汽油,父亲将其汽油箱装满,那么当他的儿子下次看到自行车时,也将为他装满汽油。
我希望这有助于理解。