繁体   English   中英

Java类的变量和方法的继承

[英]Java class inheritance of variables and methods

class Machine {
    int info1 = 7;      
    public void show(){
        System.out.println(info1);
    }
}

class Camera extends Machine {
     int info1 = 13;
}

public class Application{
    public static void main(String[] args) {
        Machine combo = new Camera();
        combo.show();
    }
}

从我的理解,我创建了一个名为对象combo初始化类的Camera ,但现在用的变量类型的Machine ,这是超类Camera

现在,由于我正在创建Camera Object ,所以我希望方法show()可以打印13,但是此代码可以打印7,这是超类Machine声明的。 我意识到Machine的变量类型通过show()方法combo了参考变量,但是该值不应该返回13,因为Object本身是Camera的实例? 预先感谢您的帮助!

在这种情况下,有两个称为info1的变量-子类中的变量不会覆盖超类中的变量,它将show方法打印属于Machine的变量。

子类中声明的变量info1被认为隐藏了父类中声明的变量,如JLS的8.3节所述

如果类声明了具有特定名称的字段,则称该字段的声明隐藏了超类和该类的超接口中所有相同名称的字段的所有可访问声明。

info1变量Camera不超载info1变量Machine ,而是隐藏它。

在这种情况下, show()方法只能看到在其自己的类中声明的info1 Machine方法无法访问子类中存在的字段。

如果希望能够在子类中更改值,则需要在构造器中进行设置,如下所示:

class Camera extends Machine {
    public Camera() {
        super.info1 = 13;
    }
}

在这种情况下,您将在Machine中显式引用info1并更改其值。

正如@manouti提到的, info1是每个类中的两个不同变量(它们不会被覆盖)。 但是,您可以实现“必需”功能,而无需通过更改如下的Camera类来引入新变量:

class Machine {
    int info1 = 7;

    public void show(){
        System.out.println(info1);
    }
}

class Camera extends Machine {

    public Camera() {
        info1 = 13;
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM