嘿,我刚刚练习继承,我遇到了一个问题。我在我的汽车类(子类)中得到错误,车辆(父)中的变量不可见。我没有做任何改变这一点,我甚至不知道如何让它隐形。任何人都可以帮助我。
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
答案 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会导致Car
和Vehicle
之间的差距。它说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;
}
}