Java子类构造函数赋值

Java子类构造函数赋值,java,Java,我试图使用子类的构造函数创建一个对象,但我无法在子类构造函数中为该对象赋值 public class Green { public static void main (String [] args) { Bike greenBike = new BikeAdv ("Green", 20, "Mountain"); greenBike.PrintBike(); } } 这是超类 public class Bike { String

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

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

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();
    }
}
当我运行“绿色”课程时,输出是“你没有提供合适类型的自行车”,而我希望看到“你的自行车是山地自行车”


谢谢

类Bike不是抽象的或接口,这意味着它的所有方法都与Bike类中所说的一样。当您将greenBike指定为Bike而不是BikeAdv时,您会告诉它使用Bike类中的方法,而不是BikeAdv类中的方法。你最好的办法是将自行车抽象化,让打印自行车没有实体


另外:您从不将BikeType字符串传递给super类,因此它无法接收它。

类Bike不是抽象的或接口,这意味着它的所有方法都与它们在Bike类中所说的一样。当您将greenBike指定为Bike而不是BikeAdv时,您会告诉它使用Bike类中的方法,而不是BikeAdv类中的方法。你最好的办法是将自行车抽象化,让打印自行车没有实体


另外:您从未将BikeType字符串传递给超类,因此它无法接收该字符串。

子类中的
类型
字段将超类中的
类型
字段隐藏起来。超类中的字段永远不会填充,这就是正在检查的字段

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


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

子类中的
type
字段将超类中的
type
字段隐藏起来。超类中的字段永远不会填充,这就是正在检查的字段

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


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

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

    String color = "";
    String type = "";
    int age = 0;
另外,您在
BikeAdv
中重新声明了
type
,这可能是一个错误(您不需要这样做)

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

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

    protected String color = "";
    protected String type = "";
    protected int age = 0;
正如你所看到的,有很多可能性。请在此处查看:


您声明了这些属性,但没有明确的可见性:

    String color = "";
    String type = "";
    int age = 0;
另外,您在
BikeAdv
中重新声明了
type
,这可能是一个错误(您不需要这样做)

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

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

    protected String color = "";
    protected String type = "";
    protected int age = 0;
正如你所看到的,有很多可能性。请在此处查看: