Java 遗产不起作用
嘿,我只是在练习继承,我遇到了一个问题。我在我的汽车类(子类)中得到一个错误,汽车(父类)中的变量不可见。我没有做任何改变,我甚至不知道如何让它隐形。有人能帮我吗Java 遗产不起作用,java,inheritance,Java,Inheritance,嘿,我只是在练习继承,我遇到了一个问题。我在我的汽车类(子类)中得到一个错误,汽车(父类)中的变量不可见。我没有做任何改变,我甚至不知道如何让它隐形。有人能帮我吗 public class Vehicle { private String make, model, colour; private int registrationNumber; public Vehicle() { this.make = ""; this.mod
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
private
变量将不可见。它们仅限于在其中定义的类<代码>受保护的变量(和函数)对子类可见
更改:
private String make, model, colour;
private int registrationNumber;
到
我建议不要将它们保密,因为这意味着
汽车
不会从汽车
继承这些变量。迫使汽车
调用自己父母的getter和setter是汽车
和汽车
之间的差距。它的意思是说一辆汽车没有颜色、品牌、型号或注册号,但它必须去一个单独的班级(汽车),向班级询问它的颜色、品牌、型号和注册号。你的汽车成员是私人的。因此,除了车辆
类外,任何人都看不到它们。有关更多详细信息,请参阅。问题在于变量是私有的,因此子类不可用。大概您正试图直接在车内访问它们(很难说,因为您没有包括源代码)
您可以使它们成为受保护的变量,但我强烈建议您将它们保留为private
,而使用子类中的属性(get和set方法)。字段是一个实现细节——您应该考虑将哪些API暴露给子类以及其他代码。
有关Java中访问控制的更多详细信息,请参阅。例如:
否则,如果该成员或构造函数被声明为私有
,则只有当且仅当该成员或构造函数的声明发生在顶级类(§7.6)的主体内时,才允许访问该成员或构造函数
变量:
private
表示变量仅在该类中可见。比如说
Class foo {
private Object a; //a can only be accessed within foo.
}
Class foo {
protected Object a;
}
Class bar extends foo {
public bar () {
a = someVariable;
}
}
Class foo{
public Object a;
}
Class bar{
public bar(){
foo foo = new foo();
foo.a = someVariable;
}
}
protected
表示该类和RIT中的类。比如说
Class foo {
private Object a; //a can only be accessed within foo.
}
Class foo {
protected Object a;
}
Class bar extends foo {
public bar () {
a = someVariable;
}
}
Class foo{
public Object a;
}
Class bar{
public bar(){
foo foo = new foo();
foo.a = someVariable;
}
}
public
表示可以访问该类对象的所有类。比如说
Class foo {
private Object a; //a can only be accessed within foo.
}
Class foo {
protected Object a;
}
Class bar extends foo {
public bar () {
a = someVariable;
}
}
Class foo{
public Object a;
}
Class bar{
public bar(){
foo foo = new foo();
foo.a = someVariable;
}
}
当您使用超级构造函数时,您不需要而且实际上不应该设置父字段,因为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;
}
请发布实际的错误消息,而不是对消息的解释,并用注释指出导致错误的行。不要让我们猜测这些信息。再加上儿童课。你的问题这次会得到答案,但将来不完整的问题可能不会。继承有效,甚至会晕倒!你的代码不起作用。请编辑您的帖子。将您的子类Car.java
发布到原始海报:不,不要这样做。乔恩·斯基特有更好的答案。无论何时何地,您都希望限制可见性。我在父级中有getter和setter。我显然遗漏了一些东西,因为我在初始化父类和子类中的变量时总是使用private。@Pendo:再次显示子类和实际的错误消息。否则我们将不知道您缺少了什么。@Pendo826:您有getter和setter,是的-但您可能试图直接从Car
访问变量,这是您无法做到的-您必须调用getter/setter。当你没有向我们展示不可编译的代码时,很难向你展示你做错了什么…我更喜欢你的另一个答案。并不是说我不同意上面的观点,我编辑了汽车类构造函数。在this.make=make的行上;this.model=模型;这个颜色=颜色;this.registrationNumber=注册号;这些都显示了错误。该死。我怎么会忽视这一点。我显然有点生疏了。谢谢气垫船。@Pendo:没问题,这就是我们来这里的目的。谢谢你“接受”我的答案,但事实上@JonSkeet的答案是正确的。我的回答只是他的补充。从技术上说,你帮我找到了解决办法。但是如果你想让我接受他的话。我会的。再次感谢,我很感激。@Pend:这可能没关系,因为他和我都不需要分数。