继承不起作用

时间:2012-10-19 16:49:58

标签: java inheritance

嘿,我刚刚练习继承,我遇到了一个问题。我在我的汽车类(子类)中得到错误,车辆(父)中的变量不可见。我没有做任何改变这一点,我甚至不知道如何让它隐形。任何人都可以帮助我。

public class Vehicle 
{
    private String make, model, colour;
    private int registrationNumber;

    public Vehicle()
    {
        this.make = "";
        this.model = "";
        this.colour = "";
        this.registrationNumber = 0;


    }


    public Vehicle(String make, String model, String colour,
            int registrationNumber) 
    {
        this.make = make;
        this.model = model;
        this.colour = colour;
        this.registrationNumber = registrationNumber;
    }


    public String getMake() 
    {
        return make;
    }


    public void setMake(String make) 
    {
        this.make = make;
    }


    public String getModel() 
    {
        return model;
    }


    public void setModel(String model) 
    {
        this.model = model;
    }


    public String getColour() 
    {
        return colour;
    }


    public void setColour(String colour) 
    {
        this.colour = colour;
    }


    public int getRegistrationNumber() 
    {
        return registrationNumber;
    }


    public void setRegistrationNumber(int registrationNumber) 
    {
        this.registrationNumber = registrationNumber;
    }



    public String toString() 
    {
        return "Vehicle [make=" + make + ", model=" + model + ", colour="
                + colour + ", registrationNumber=" + registrationNumber + "]";
    }






}

public class Car extends Vehicle
{
private int doors;
private String shape;

public Car()
{
    super();
    this.doors = 0;
    this.shape = "";
}

public Car(String make, String model, String colour, int registrationNumber) 
{
    super(make, model, colour, registrationNumber);
    this.make = make;
    this.model = model;
    this.colour = colour;
    this.registrationNumber = registrationNumber;


}






}

错误消息:

Description Resource    Path    Location    Type
The field Vehicle.make is not visible   Car.java    /VehicleApp/src line 19 Java Problem
The field Vehicle.model is not visible  Car.java    /VehicleApp/src line 20 Java Problem
The field Vehicle.colour is not visible Car.java    /VehicleApp/src line 21 Java Problem
The field Vehicle.registrationNumber is not visible Car.java    /VehicleApp/src line 22 Java Problem

5 个答案:

答案 0 :(得分:7)

“问题”是变量是private,因此子类不可用。大概是你试图在Car内直接访问它们(由于你没有包括来源,很难说)。

可以使它们成为受保护的变量 - 但我强烈建议你将它们保留为private,而是使用子类中的属性(get和set方法)。字段是一个实现细节 - 您应该考虑向子类以及其他代码公开的 API

有关Java中访问控制的更多详细信息,请参阅JLS section 6.6。例如:

  

否则,如果成员或构造函数声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问。

答案 1 :(得分:5)

private个变量将不可见。它们仅限于它们所定义的类。protected变量(和函数)对于子类是可见的。

变化:

private String make, model, colour;
private int registrationNumber;

protected String make, model, colour;
protected int registrationNumber;

我建议不要将它们保密,因为这意味着Car不会从Vehicle继承这些变量。强制Car调用它自己的父级的getter和setter会导致CarVehicle之间的差距。它说Car没有颜色,品牌,型号或注册号,但它必须转到一个单独的类(Vehicle)并向类询问它的颜色,品牌,型号和注册号。

答案 2 :(得分:2)

您的Vehicle成员私有。因此除了Vehicle类之外,任何人都看不到它们。有关详细信息,请参阅here

答案 3 :(得分:2)

当您使用超级构造函数时,您不需要也不应该设置父字段,因为super(...)构造函数调用将为您执行此操作。

public Car(String make, String model, String colour, int registrationNumber) 
{
    super(make, model, colour, registrationNumber);

    // get rid of these:
    // this.make = make;
    // this.model = model;
    // this.colour = colour;
    // this.registrationNumber = registrationNumber;
}

答案 4 :(得分:1)

变量:

private表示该变量仅在该类中可见。例如

Class foo {
    private Object a; //a can only be accessed within foo.
}

protected表示该类和类的内容。例如

Class foo {
    protected Object a;
}

Class bar extends foo {
    public bar () {
        a = someVariable;
    }
}

public表示可以访问该类对象的所有类。例如

Class foo{
    public Object a;
}

Class bar{
    public bar(){
        foo foo = new foo();
        foo.a = someVariable;
    }
}