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:这可能没关系,因为他和我都不需要分数。