Java方法的重载和继承

时间:2019-06-11 06:54:44

标签: java oop inheritance overriding

class Dad {
    private static final String me = "dad";
    protected  String getMe() {
        return me;
    }
    protected  void printMe() {
        System.out.println(getMe());
    }
}

class Son extends Dad {
    private static final String me = "son";
    protected  void printMe() {
       System.out.println(getMe());
    }
}

class Test {
    public static void main(String[] args) {
        Son son = new Son();
        son.printMe();
    }
}

在这种情况下,“ Son”类型的引用“ son”并且由于方法printMe()是非静态的,因此将执行来自类Son的方法的代码。 但是,由于Son类尚未重新定义方法getMe(),因此将执行祖先类中的方法代码。 所以我们得到“爸爸”。

第二种情况:

class Dad {
    private static final String me = "dad";
    protected  String getMe() {
        return me;
    }
    protected  void printMe() {
        System.out.println(getMe());
    }
}

class Son extends Dad {
    private static final String me = "son";
    protected  String getMe() {
        return me;
   }


class Test {
    public static void main(String[] args) {
        Son son = new Son();
        son.printMe();
    }
}

在那种情况下,Son类没有重新定义方法printMe()的原因,因此应该执行类Dad中方法printMe()的代码。 但是我们得到“儿子”。为什么?

那继承呢?也就是说,如果继承人没有覆盖祖先的方法,那么他们一起共享祖先的方法的代码吗?

4 个答案:

答案 0 :(得分:4)

在第一种情况下,son.printMe()调用Son的{​​{1}}(因为printMe()覆盖了该方法),后者调用了Son的{​​{1} }(因为Dad没有覆盖该方法),它返回“ dad”。

在第二种情况下,getMe()调用Son的{​​{1}}(因为son.printMe()没有覆盖该方法),后者调用Dad的{ {1}},因为printMe()会覆盖该方法。因此,将打印“儿子”。

答案 1 :(得分:1)

在第二种情况下,您正在呼叫kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(2*h+1,1)) closed_img = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel) ,而后者依次呼叫href。由于mailto:会覆盖它,因此会调用<span>。该方法返回“ Son”,然后由<a href="mailto:person@example.com"><span>link text</span></a> 打印。

答案 2 :(得分:0)

您正在使用tge diff类覆盖相同的方法,但是该tge main方法调用son方法的参数相同。

答案 3 :(得分:0)

情况2:   son.printMe()会调用Dad类的printMe()类,而不是Son类中没有被划分的类。现在它将在层次结构中最接近的实现类(即getMe()类)中寻找Son。现在Son#getMe()将在此实现类中查找变量me,并找到值"son",因此将其打印出来。请记住,private static final String me = "dad";private static final String me = "son";是属于两个不同类的两个不同的私有变量。如果me类中没有Son变量的定义,则会产生编译错误。