Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从父类调用指定的方法?_Java_Inheritance - Fatal编程技术网

Java 如何从父类调用指定的方法?

Java 如何从父类调用指定的方法?,java,inheritance,Java,Inheritance,我有两个从同一父类扩展而来的类。在这些类中,我有一个名称相同但实现不同的方法。有没有办法从父类调用这个特定的方法?请找到下面的示例代码 public class Fruit { public String callingName () { //calling specified method getTaste() here // return specified value; } } public class Orange extends

我有两个从同一父类扩展而来的类。在这些类中,我有一个名称相同但实现不同的方法。有没有办法从父类调用这个特定的方法?请找到下面的示例代码

public class Fruit {

    public String callingName () {
        //calling specified method getTaste() here 
       // return specified value;
    }
}



public class Orange extends Fruit{
    private String getTaste(){
        return "Orange has sour taste";
    }
}

public class Banana extends Fruit{
    private String getTaste(){
        return "Banana has sweet taste";
    }
}
在这种情况下,我既没有提到香蕉也没有提到橙色。类Fruit本身必须决定从callingName()方法调用哪个是正确的getTaste()。
感谢您的帮助。

是的,请使用抽象类

public abstract class Fruit {

    protected abstract String getTaste();

    public String callingName () {
         String taste = getTaste(); //calling specified method getTaste() here 
        // return specified value; 
    }
}
必须在每个类中保护getTaste()。

实现

public abstract class Fruit {
    public abstract String getTaste ();
    public String callingName () {
        //calling specified method getTaste() here 
       // return specified value;
    }
}

尝试使用工厂模式的概念:

public String callingName (String fruit) {
        switch(fruit){
        case "Orange" :
         return new Orange().getTaste();
        case "Banana" :
            return new Banana().getTaste();
        }
    }

在这里,您不需要将水果类创建为抽象类,您可以创建它的对象。

我认为最好的方法是将水果抽象化,因为您不太可能实例化它

给它一个名为name的受保护属性和一个相关方法(我会使用getName而不是调用name来遵循约定)

在Orange和Banana的构造函数中,只需为属性名指定正确的值,并重写getName方法

因此:

public abstract class Fruit {
    protected String name;
    public String getName() {
        return name;
    }
}


public class Banana extends Fruit {
    public Banana() {
        name = "Banana";
    }
    public String getName() {
        return super.getName();
    }
}

它是Java继承的一个内置特性。如果扩展类的一个实例被上推,那么它的方法被调用,它的原始方法仍将被调用。它也是Java中面向对象实现的一个基本概念

class Fruit {
    protected String callingTaste() {
        return "";
    }

    public String callingName() {
        return callingTaste();
    }
}
您可以使用以下示例测试上述概念:

class FruitProducer {
    public static Fruit[] produce() {
        Fruit[] list = new Fruit[] { new Orange(), new Banana() };
        return list;
    }
}

class UnknownClient {
    public static void main(String args[]) {
        Fruit[] listOfFruit = FruitProducer.produce();
        foreach (Fruit f : listOfFruit) {
            f.callingName(); 
        }
    }
}

若要创建水果类的对象,则不能将水果类作为抽象类。你有这样的情况吗?谢谢你的回答,我真的很感激。是的,我有一个约束条件,即我无法知道客户端传递的对象到底是什么。它可以是橙色或香蕉色的物体。我只需要从调用名为()的父类方法中确定,这正是从客户端传递的对象调用的getTaste()方法。我应该使用反射来检查确切的类/对象类型吗?非常感谢。