Как вызвать функцию с таким же именем из унаследованного класса в java

Я новичок в java, и я помню, что в C ++ мы сделали что-то вроде CLASSNAME::Fn(), чтобы избежать двусмысленности в наследовании.

Вот мой код, и я хочу иметь одинаковые методы отображения в обоих классах и явно обращаться к ним.

public class Main {
    public static void main(String args[]){
    Emplo e = new Emplo("samuel",19,"designer",465);
    e.display();  // here i want to call both display()
    }
}

public class Person {
    String name;
    int age;

    Person(String s, int a){
        name = s;
        age = a;
    }

    public void dispaly(){
        System.out.println("name: "+name+"\nage: "+age);
    }
}


public class Emplo extends Person {
    String desg;
    double sal;
    Emplo(String s,int a,String d, double sa){
        super(s,a);
        desg=d;
        sal=sa;
    }
    void display(){
        System.out.println("desg: "+desg+"\nsal: "+sal);
    }
}

person Community    schedule 02.10.2014    source источник


Ответы (5)


В java вы не можете не вызывать конкретную реализацию метода класса экземпляра.

То есть вы не можете «обойти» метод подкласса и вызвать версию метода суперкласса; вызов метода суперкласса может быть выполнен только из внутри подкласса с использованием super.someMethod().

Вы даже не можете вызвать версию суперкласса, то есть не можете сделать что-то вроде super.super.someMethod()

person Bohemian♦    schedule 02.10.2014
comment
Если метод static, он не наследуется, и вы можете вызывать определенные реализации, используя ClassName.someStaticMethod(), не имея экземпляра. - person Bohemian♦; 02.10.2014
comment
Стоит ли унаследовать такие методы, как display, или можно оставить их статичными? - person ; 02.10.2014
comment
В вашем коде они не статичны - у них нет ключевого слова static, поэтому они являются методами экземпляра. И они должны быть методами экземпляра, потому что им нужен доступ к полям экземпляра. Как и методы, статические поля также имеют ключевое слово static, но сделать поля или методы статическими было бы недостатком дизайна, потому что каждый экземпляр Person имеет собственное имя и т. Д. - person Bohemian♦; 02.10.2014

Сначала вы используете два разных метода. display() в Emplo и dispaly() в Person. ТАК, нет смысла говорить о двусмысленности или overriding исправлять это.

Предположим, вы это исправили. Тогда вы не можете кодировать так

public void display(){ // method in Person
    System.out.println("name: "+name+"\nage: "+age);
} 

потом

void display(){ // method in Emplo
    System.out.println("desg: "+desg+"\nsal: "+sal);
}

Вы используете более слабый модификатор для override, поэтому вы не можете скомпилировать этот код. Вы можете сделать public метод в Emplo.

И ответьте на ваш последний вопрос. ты не можешь этого сделать. нельзя вызвать оба метода.

person Ruchira Gayan Ranaweera    schedule 02.10.2014
comment
вы действительно основываете свой ответ на опечатке? - person Ajk_P; 02.10.2014
comment
@Ajk_P прежде чем ответить на что-то, вам нужно исправить другие вещи. Вы должны узнать это - person Ruchira Gayan Ranaweera; 02.10.2014
comment
что, если я все равно сделаю метод отображения статическим, он бесполезен в наследовании метода dispaly () в каждом классе - person ; 02.10.2014
comment
@EmeraldRoar: если вы сделаете его статическим, вы сделаете метод бесполезным, поскольку вы не можете получить состояние объекта (name или age). - person Voicu; 02.10.2014
comment
о, я не могу сделать статическую ссылку на нестатическую переменную. :( - person ; 02.10.2014

Во втором методе отображения вызовите метод отображения суперкласса, используя super keywod как: super.display (); (должно быть первым утверждением метода)

и не будет двусмысленности, потому что будет вызываться тот метод отображения, объект которого создается, что означает, что в этом случае будет вызываться метод display () для Employee

поэтому, если вы хотите вызвать метод отображения класса Person, вы должны создать объект этого класса и ссылку по этому типу класса, например:

Человек p = новый Человек (ваши данные); p.display () // здесь будет вызываться метод отображения человека
и нет, вы не можете вызывать оба метода из одной и той же ссылки

person Nawed Shaikh    schedule 02.10.2014

В вашем Emplo классе display() метод super.dispaly() указывает display() метод непосредственного суперкласса, то есть Person класс.

 void display(){   // here in Emplo class you can't give more restrictive modifier(i.e  `public` to     `default`. since in `Person` class it is `public` so it must be `public`.(overriding rule)
        super.dispaly();
        System.out.println("desg: "+desg+"\nsal: "+sal);
    }

поэтому поместите сюда модификатор public:

  public void display(){
       super.dispaly();
        System.out.println("desg: "+desg+"\nsal: "+sal);
  }

`

person Rustam    schedule 02.10.2014

Возможно, это ответит на ваш вопрос:

public void myMethod()
{   //inherited method
    super.myMethod(); //calls base class method
    //...    add more code to inherited method
}

подробности см. в исходном источнике: Как в Java вызвать метод базового класса из метода переопределения в производном классе?

person Thomas P.    schedule 08.12.2020