有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java透明性和方法重写

对重写方法和重写方法的正确定义感到好奇。 在我的理解中,重写方法是子类中的方法,它用基类中相同的签名和返回类型重写该方法

然而,我看到一些源代码将被重写的方法称为子类中重写基类中方法的方法

那么,哪个是重写方法,哪个是重写方法

抱歉,如果这是一个有点愚蠢的问题


共 (3) 个答案

  1. # 1 楼答案

    class A {
        public void method() {
            System.out.println("I don't know if I am overriden, but I'm not overriding anything");
        }
    }
    class B extends A {
        public void method() {
            System.out.println("I am overriding A.method() which has now been overriden");
        }
    }
    

    您还可以阅读JLS中描述重写、实现、隐藏、重载等的部分,以获得更深入的理解

  2. # 2 楼答案

    来自Java Documentation的一个直接例子:

    public class Animal {
        public static void testClassMethod() {
            System.out.println("The class" + " method in Animal.");
        }
        public void testInstanceMethod() {
            System.out.println("The instance " + " method in Animal.");
        }
    }
    
    
    
    public class Cat extends Animal {
        public static void testClassMethod() {
            System.out.println("The class method" + " in Cat.");
        }
        public void testInstanceMethod() {
            System.out.println("The instance method" + " in Cat.");
        }
    
        public static void main(String[] args) {
            Cat myCat = new Cat();
            Animal myAnimal = myCat;
            Animal.testClassMethod();
            myAnimal.testInstanceMethod();
        }
    }
    

    我使用这个例子的原因是,从现实世界的情况来看这个场景。A Animal可能具有某些一般特征。但是Cat将有一些不同于泛型Animal的特性,但某些特性是对泛型Animal特性的改进。因此,Cat似乎覆盖了Animal特性(将包含覆盖方法)

    如果你对汽车感兴趣,再举一个简单的例子。比如说,有一个Car。它将有一个acceleration方法。但是a Ferrari显然比a Car有更好的acceleration。但是,a Ferrari就是a Car。所以,Ferrari覆盖了Car中的一个方法。所以,重写方法在子类中,而被重写的方法在基类中

    那么,你现在明白重点了吗?重写方法存在于子类中。但是被重写的方法存在于基类中

  3. # 3 楼答案

    假设我们有一个class SubClass extends SuperClass,那么:

    SuperClass#method   <- overridden
              ^
              |
           overrides
              |
      SubClass#method   <- overriding
    

    除此之外,wikipedia告诉我们:

    The implementation in the subclass overrides (replaces) the implementation in the superclass by providing a method that has same name, same parameters or signature, and same return type as the method in the parent class.