class shape {
private String name;
public shape(){
System.out.println("in shape, default");
}
public shape(String n){
System.out.println("in shape, one parameter");
name=n;
}
public String getName(){
return name;
}
};
class square extends shape {
private int length;
public square(){
super("square");
}
public void f(){
System.out.println("in f, square!");
}
};
public class Test {
public static void main(String args[]){
shape newObject=new square();
System.out.println(newObject.getName());
newObject.f();
}
};
当我尝试在main方法中调用函数f()
时会抛出错误,但是当我在超类f()
中定义shape
时,它会起作用。 Shape
不是抽象类。
任何人都可以向我解释为什么会这样吗?
谢谢!
答案 0 :(得分:4)
问题是newObject
变量的编译时类型为shape
。这意味着编译器知道的唯一成员是shape
中的成员,并且不包含f()
。
如果要使用特定于给定类的成员,则需要使用该类型的变量,例如
square newObject = new square();
newObject.f(); // This is fine
as asides:
Shape
和Square
而非shape
和square
)答案 1 :(得分:0)
Shape Class没有函数" f"。您可以在square newObject=new square();
答案 2 :(得分:0)
除了Jon所说的
如果您知道newObject
类型为Square
,则可以执行以下操作:
Shape newObject = new Square();
((Square)newObject).f();
答案 3 :(得分:0)
即使您正在创建square
的实例,也要将其分配给shape
,这是超类。它没有定义函数,因此编译错误。
而不是shape newObject=new square();
使用:square newObject=new square();
答案 4 :(得分:0)
您只能调用声明对象的类中定义的方法,而不是它所属的类的方法。 所以在这种情况下:
shape newObject=new square();
newObject.f();
你不能调用f(),但如果你这样写:
square newObject=new square();
newObject.f();
你可以(因为它现在被宣告为方形)。
如果你想调用子类的方法,你可以在其上强制转换对象(假设它确实是它的一个实例,在其他情况下你会得到一个例外):
shape newObject=new square();
((square)newObject).f();
同样如前所述,将您的类命名为以大写字母(Shape,Square)开头。 ;)