Почему вызывается метод родительского класса? - PullRequest
0 голосов
/ 24 июня 2018

Почему метод родительского класса вызывается при создании дочернего объекта.Это даже не статический метод.

class Parent {
    public String pubMethod(Integer i) {
        return "p";
    }
}

public class Child extends Parent {
    public String pubMethod(int i) {
        return "c";
    }

    public static void main(String[] args) {
        Parent u = new Child();
        System.out.println(u.pubMethod(1));  // Prints "p"   why??
    }   
}

Здесь я передаю примитив int.Тем не менее это относится к родительскому методу.

Любое объяснение?

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Я думаю, что вы не создали свой дочерний объект правильно, у вас есть:

Parent child = new Child();

Но вы должны иметь:

Child child = new Child();
0 голосов
/ 24 июня 2018

Когда вы вызываете u.pubMethod(1), компилятор рассматривает только сигнатуры методов класса Parent, поскольку Parent является типом типа компиляции u. Так как public String pubMethod(Integer i) является единственным методом Parent, имеющим требуемое имя, это выбранный метод. public String pubMethod(int i) из Child класса не рассматривается в качестве кандидата, поскольку Parent не имеет метода такой подписи.

Во время выполнения метод подкласса public String pubMethod(int i) не может переопределить метод суперкласса public String pubMethod(Integer i), поскольку он имеет другую сигнатуру. Поэтому выполняется метод класса Parent.

Чтобы класс Child был выполнен, вы должны либо изменить его сигнатуру, чтобы она соответствовала сигнатуре метода класса Parent, что позволит ему переопределить метод класса Parent:

public class Child extends Parent {
    @Override
    public String pubMethod(Integer i) {
        return "c";
    }
}

Или вы можете добавить второй метод к классу Parent, который будет переопределен существующим методом класса Child:

class Parent {
    public String pubMethod(Integer i) {
        return "pInteger";
    }
    public String pubMethod(int i) {
        return "pint";
    }
}

В первом случае компилятор по-прежнему будет выбирать один метод - public String pubMethod(Integer i) - но во время выполнения метод класса Child переопределит его.

Во втором случае у компилятора будет два метода на выбор. Он выберет public String pubMethod(int i), так как тип литерала 1 равен int. Во время выполнения метод Child class public String pubMethod(int i) переопределит его.

...