我正在尝试使用子类中的构造函数创建对象,但我无法在子类构造函数中为该对象赋值。
这是超类。
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();
}
}
当我上课“绿色”时,输出是“你没有给出适当的自行车”。而我希望看到“你的自行车是山地自行车”。
谢谢!
答案 0 :(得分:3)
子类中的type
字段隐藏了超类中的type
字段。永远不会填充超类中的字段,这是正在检查的字段。
如果您只是删除子类中的字段,那么分配将填充超类字段,您的代码可能会按预期工作。
如其他答案中所述,最好将字段设为私有或根据您的需要进行保护,而不是默认可见性。
答案 1 :(得分:0)
类Bike不是抽象类或接口,这意味着它的所有方法都与他们在Bike类中所说的一样。当你将greenBike指定为Bike而不是BikeAdv时,你告诉它使用Bike类中的方法,而不是BikeAdv类。你最好的选择是让自行车变得抽象,让没有身体的PrintBike无效。
另外:你永远不会将BikeType字符串传递给超类,所以它无法接收它。
答案 2 :(得分:0)
您已声明这些属性而没有明确的可见性:
String color = "";
String type = "";
int age = 0;
此外,您在type
中重新声明了BikeAdv
,这可能是一个错误(您不需要)。
如果您希望只能从其类访问这些属性,那么您应该将它们声明为private
。但是,在这种情况下,您必须参数化构造函数才能修改所有构造函数。或者也许为他们创建setter(请注意,这样您将从课外授予可访问性)。
private String color = "";
private String type = "";
private int age = 0;
如果您希望它们在类外部不可修改,但可以从其子类访问,则将它们声明为protected:
protected String color = "";
protected String type = "";
protected int age = 0;
如您所见,有很多可能性。在这里查看它们:
http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html