0

我正在尝试使用子类中的构造函数创建一个对象,但我无法在子类构造函数中为该对象赋值。

这是超类。

public class Bike
{
    String color = "";
    String type = "";
    int age = 0;

    public static void main (String [] args)
    {
    }

    public Bike (String s, int i)           // Constructor
    {
        color = s;
        age = i;
    }

    public void PrintBike ()
    {
        if (type == "")
        {
            System.out.print(" You didn't give the proper kind of bike."); 
        }
        else
        {
            System.out.print(" Your bike is a " + type + " bike. \n");
        }
    }
}

这是子类。

public class BikeAdv extends Bike
{
    private String type;

    public BikeAdv (String color, int age, String BikeType)
    {
        super (color, age);
        type = BikeType;
    }
 }

这是调用构造函数的类。

public class Green
{
    public static void main (String [] args)
    {
        Bike greenBike = new BikeAdv ("Green", 20, "Mountain");
        greenBike.PrintBike();
    }
}

当我运行“绿色”课程时,输出是“你没有提供合适的自行车”。而我希望看到“您的自行车是山地自行车”。

谢谢!

4

3 回答 3

3

type子类中的字段会影响type超类中的字段。超类中的字段永远不会被填充,这就是被检查的字段。

如果您只是删除子类中的字段,那里的赋值将填充超类字段,您的代码可能会按您的预期工作。

但是,正如其他答案中所述,最好根据您的需要将字段设为私有或受保护,而不是默认可见性。

于 2012-07-15T22:42:54.290 回答
0

您已在没有明确可见性的情况下声明了这些属性:

    String color = "";
    String type = "";
    int age = 0;

此外,您已在 中type重新声明BikeAdv,这可能是一个错误(您不需要)。

如果您想让这些属性只能从其类中访问,那么您应该声明它们private。但是,在这种情况下,您必须对构造函数进行参数化才能修改所有这些。或者可能为他们创建设置器(请注意,这样您将授予来自类外的可访问性)。

    private String color = "";
    private String type = "";
    private int age = 0;

如果您希望它们在其类外部不可修改,但可从其子类访问,则将它们声明为受保护:

    protected String color = "";
    protected String type = "";
    protected int age = 0;

如您所见,有很多可能性。在这里查看它们:

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

于 2012-07-15T22:44:12.833 回答
0

Bike 类不是抽象的,也不是接口,这意味着它的所有方法都像他们在 Bike 类中所说的那样。当您将 greenBike 指定为 Bike,而不是 BikeAdv 时,您告诉它使用 Bike 类中的方法,而不是 BikeAdv 类。你最好的选择是让 Bike 抽象化,让 PrintBike 没有实体。

另外:您永远不会将 BikeType 字符串传递给超类,因此它无法接收它。

于 2012-07-15T22:40:54.980 回答