为什么父类的实例变量的更改会反映在子类中?

时间:2019-07-18 20:43:50

标签: java inheritance instance-variables

如果我更改父类的实例变量,则这些更改会反映在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对象上。

3 个答案:

答案 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升汽油,父亲将其汽油箱装满,那么当他的儿子下次看到自行车时,也将为他装满汽油。

我希望这有助于理解。