我的代码如下
class Shape {
void drawShape() {
System.out.println("shape drawn of shape class");
}
void printStr() {
System.out.println("checking");
}
}
class Circle extends Shape {
void drawShape() {
System.out.println("shape drawn of circle class");
}
public void printNumber() {
System.out.println("1");
}
}
public class TestShape {
public static void main(String[] args) {
Shape shape = new Circle();
shape.drawShape();
shape.printStr();
}
}
这是输出
shape drawn of circle circle
checking
当我调用shap.drawShape()时,它正在执行我的子类的方法,但是当我试图调用shape.printNumber()编译器给出错误时,我的问题是使用相同的对象,如果是子类方法正在执行,(我知道它是重写的)为什么我不能调用子类方法?
答案 0 :(得分:1)
因为Java是静态类型的,并且您的声明属于子类。要致电printNumber,
您必须使用
Circle shape = new Circle();
shape.drawShape();
shape.printStr();
由于多态性, drawShape()
工作正常。
答案 1 :(得分:1)
printNumber
方法在课程Circle
中定义,但未在课程Shape
中定义。
您的变量shape
的类型为Shape
。您无法在其上调用printNumber
,因为该类Shape
中不存在该方法。
答案 2 :(得分:1)
致电
Shape shape = new Circle();
shape.printStr();
你试图调用一个Shape不存在的方法
如果你这样做
Circle shape = new Circle();
shape.printStr();
然后编译器将知道在哪里搜索
答案 3 :(得分:0)
你的对象的类型是Shape,它是没有printNumber方法的超类。当你调用drawShape时,它会因为覆盖而调用子类方法。希望它能说清楚。
答案 4 :(得分:0)
也许你不理解继承的想法。这是一个类比:圆形是一个形状,但现在形状并不总是圆形,是吗?