Java类继承变量和方法

时间:2014-12-17 21:39:53

标签: java class

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的变量类型,它是{{的超类1}}。

现在,由于我正在创建Camera Object,我希望方法Camera能够打印13,但是此代码会打印7,如超类{{ 1}}。我意识到变量类型的Machine赋予方法show()引用变量Machine,但是由于Object本身是combo的实例,因此不应返回值13。提前感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

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

在子类中声明的变量Machine被认为隐藏了父类中声明的变量,如section 8.3 of the JLS中所述:

  

如果类声明了具有特定名称的字段,那么该字段的声明将被称为 hide 任何和所有可访问的超类中具有相同名称的字段的声明,以及该类的超接口

答案 1 :(得分:2)

info1中的Camera变量并未超载info1中的Machine变量,而是hiding it.

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

如果您希望能够更改子类中的值,则需要在构造函数中设置它,如下所示:

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

在这种情况下,您明确引用info1中的Machine并更改其值。

答案 2 :(得分:1)

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

class Machine {
    int info1 = 7;

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

class Camera extends Machine {

    public Camera() {
        info1 = 13;
    }

}