0

嘿,我只是在练习继承,我遇到了一个问题。我的汽车类(子类)中出现错误,即车辆(父类)中的变量不可见。我没有做任何事情来改变这一点,我什至不知道如何让它不可见。谁能帮我这个。

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
4

5 回答 5

7

“问题”是变量是private,因此子类不可用。大概您正在尝试直接在其中访问它们Car(很难说,因为您没有包含源代码)。

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

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

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

于 2012-10-19T16:52:07.347 回答
5

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

改变:

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

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

我建议不要将它们保密,因为这意味着Car不会从Vehicle. 强制 a调用它自己的父级的 getter 和 setter 会在andCar之间引入一个差距。它的意思是说 a没有颜色、品牌、型号或注册号,但它必须去一个单独的班级 ( ) 并向班级询问它的颜色、品牌、型号和注册号。CarVehicleCarVehicle

于 2012-10-19T16:51:15.633 回答
2

您的Vehicle成员是私有的。Vehicle因此,除了班级之外,任何人都看不到它们。有关更多详细信息,请参见此处

于 2012-10-19T16:51:26.060 回答
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;
}
于 2012-10-19T17:15:01.747 回答
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;
    }
}
于 2012-10-19T16:58:18.970 回答