必须在超类中定义子类中的每个函数吗?

时间:2014-11-12 14:55:56

标签: java oop

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不是抽象类。

任何人都可以向我解释为什么会这样吗?

谢谢!

5 个答案:

答案 0 :(得分:4)

问题是newObject变量的编译时类型为shape。这意味着编译器知道的唯一成员是shape中的成员,并且不包含f()

如果要使用特定于给定类的成员,则需要使用该类型的变量,例如

square newObject = new square();
newObject.f(); // This is fine

as asides:

  • 您应遵循Java命名约定(ShapeSquare而非shapesquare
  • 课后声明不需要分号
  • 你应该突破每个班级宣言的第一行......目前看起来很奇怪。

答案 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)开头。 ;)