【问题标题】:How to call function with same name from an inherited class in java如何从java中的继承类调用具有相同名称的函数
【发布时间】:2014-11-27 01:55:27
【问题描述】:

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

【问题讨论】:

    标签: java inheritance ambiguity


    【解决方案1】:

    在java中,不能调用实例的类的具体方法实现。

    也就是说,你不能“绕过”子类方法并调用该方法的超类版本;只能使用super.someMethod() 从子类调用超类方法。

    你甚至不能调用超超类的版本,即你不能做类似super.super.someMethod()

    【讨论】:

    • 如果一个方法是static,它不是“继承的”,你可以使用ClassName.someStaticMethod()调用特定的实现而不需要实例。
    • display 等方法值得继承还是保持静态?
    • 在您的代码中,它们不是静态的 - 它们没有 static 关键字,因此它们是实例方法。它们必须是实例方法,因为它们需要访问实例字段。与方法一样,静态字段也有 static 关键字,但将字段或方法设为静态将是设计缺陷,因为 Person 的每个实例都有自己的名称等
    【解决方案2】:

    首先在这里你使用两种不同的方法。 display()Emplodispaly()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 中的方法。

    并回答你的最后一个问题。你不能这样做。不能同时调用这两种方法。

    【讨论】:

    • 你的答案真的是基于一个错字-.-'
    • @Ajk_P 在回答您需要纠正其他问题之前。你应该知道
    • 如果我将显示方法设为静态,那么在每个类中继承 dispaly() 方法是没有用的
    • @EmeraldRoar:如果将其设为静态,则该方法将无用,因为您无法获取对象的状态(nameage)。
    • 哦,我不能对非静态变量进行静态引用。 :(
    【解决方案3】:

    在第二个显示方法中,使用 super 关键字调用超类显示方法: 超级显示(); (应该是方法的第一个语句)

    并且不会有歧义,因为将调用 display 方法,其对象正在创建,这意味着在这种情况下将调用 Employee 的 display() 方法

    所以如果你想调用 Person 类的 display 方法,那么你应该创建该类的对象并通过该类类型引用,例如:

    Person p = new Person(你的数据); p.display() // 这里会调用人的显示方法
    不,你不能从同一个引用中调用这两种方法

    【讨论】:

      【解决方案4】:

      在你的Emplodisplay()方法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);
        }
      

      `

      【讨论】:

        【解决方案5】:

        也许这回答了你的问题:

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

        详情见原文: In Java, how do I call a base class's method from the overriding method in a derived class?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-26
          • 2020-10-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多