访问父类方法和变量

时间:2014-09-12 10:06:54

标签: java inheritance polymorphism

我在同一个包中有以下3个类:

class Machine {

    protected int id;

    public Machine(int i) {
        id = i;
    }

    public void start() {
        System.out.println("Machine " + id + " starting.");
    }
}

class Car extends Machine {

    protected int id;

    public Car(int i) {
        super(i);
        id = i;
    }

    public void start() {
        super.start();
        System.out.println("Car " + id + " starting.");
        System.out.println("I can access parent variable" + super.id);
    }
}

public class Application {

    public static void main(String[] args) {
        Machine machine = new Machine(2);
        Car car = new Car(3);

        car.start();
        machine.start();
        machine = car;
        machine.start();
    }
}

我现在有几个问题。如果我不再有意义,请告诉我,我会尝试改写自己。

  1. 我可以从主类访问car.super方法和变量吗? ?如果是这样的话?
  2. 当我实例化Car对象时,我还必须初始化 机器类的成员通过调用它的构造函数。做这个 意思是当我创建一个新的Car对象时的总内存 使用的是Car对象的大小+ Machine的大小 对象?
  3. 当我有相同的变量' id'在这两个类中访问它 使用Car对象我得到了Car' id',但是当我只有它时 机器类和访问它我得到机器ID#39;。做这个 这意味着我实际上是在重写Machine' id'。我曾是 假设成员变量无法被覆盖, 只有方法可以。

2 个答案:

答案 0 :(得分:1)

1.保护数据成员只能访问购买聚合类。 没有想法。 这是动态绑定的一个例子。这包含opps功能,其中父需要显式转换以指向聚合类。

答案 1 :(得分:0)

2)为操作分配内存时,不存在超类和子类的概念。 Java查看字段和实例所需的内存。它将查看Machine的实例并为int id分配内存,然后查看Car的实例,看到内存已经在父级中分配,并简单地分配价值。

如果您的Car班级有一个标有numberid的字段,那么内存将分配给两个字段。

看看这个家伙:Java memory usage in inheritance