Java 子类中的调用方法

Java 子类中的调用方法,java,Java,我的代码如下 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

我的代码如下

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()编译器时出现错误,我的问题是,如果子类方法正在执行,我的问题是同一个对象,(我知道它正在重写)那么为什么我不能调用子类方法呢?

因为Java是静态类型的,而您的声明是子类的。要能够调用
printNumber,
您必须使用:


drawShape()
由于多态性而工作正常。
printNumber
方法是在类
Circle
中定义的,而不是在类
Shape
中定义的

变量
shape
的类型为
shape
。您不能在其上调用
printNumber
,因为调用时该方法在类
Shape
中不存在

Shape shape = new Circle();
shape.printStr();
您正在尝试调用形状不存在的方法

如果你这样做

Circle shape = new Circle();
shape.printStr();

然后编译器将知道在哪里搜索对象的类型是Shape,这是一个没有printNumber方法的超类。调用drawShape时,由于重写,它会调用子类方法。希望它能说明问题。

也许你不理解继承的概念。这里有一个类比:一个圆是一个形状,但是一个形状现在并不总是一个圆,是吗?

它会打印它…试试看是的,我同意,但是如果你看到结果,shape的输出。drawShape()正在执行子类方法,如果它可以执行子类方法,那么为什么我不能访问shape.printNumber()正如其他人所说,这是因为它不是以形状来声明的。drawShape是在Shape中声明的,因此Shape的引用知道它。在运行时,在检查真实类型时调用正确的方法(运行时类型信息)。如果您在形状中声明了一个printNumber,它的工作原理也是一样的。
Circle shape = new Circle();
shape.printStr();