2014-10-02 4 views
0

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

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

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); 
    } 
} 

ответ

0

В Java, вы не можете не вызова конкретной реализации методы класс экземпляра.

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

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

+0

как сделать отображение метод статической работы? –

+0

Если метод является 'static', он не« унаследован », и вы * можете * вызывать конкретные реализации с использованием класса ClassName.someStaticMethod()' без экземпляра. – Bohemian

+0

Методы, такие как отображение, стоит ли им наследовать, или все в порядке, чтобы сохранить их статическими? –

0

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

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

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

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

0

В вашем 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); 
    } 

`

0

Прежде здесь вы будете использовать два различных метода. 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.

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

+0

вы действительно основываете свой ответ на опечатке -.- ' –

+1

@Ajk_P, прежде чем ответить на что-то, что нужно для исправления других вещей. Вы должны узнать, что –

+0

Что делать, если я делаю метод отображения статическим в любом случае бесполезным в наследовании метода dispaly() в каждом классе –