Java 调用/分配实现接口的类的变量

Java 调用/分配实现接口的类的变量,java,class,variables,inheritance,interface,Java,Class,Variables,Inheritance,Interface,我写了一个简单的接口继承示例来说明我要做的事情 interface Fruit{ public void taste(); } class Banana implements Fruit { public String name = "Banana"; public void taste(){ System.out.println("yummy banana!"); } class Strawberry implemen

我写了一个简单的接口继承示例来说明我要做的事情

interface Fruit{
     public void taste();    
}


class Banana implements Fruit {
     public String name = "Banana"; 
     public void taste(){
         System.out.println("yummy banana!");
     }


class Strawberry implements Fruit {
     public String name = "Strawberry"; 
     public void taste(){
         System.out.println("yummy strawberry!");
     }
}

class Lunch<Fruittype implements Fruit> {
     public Fruittype fruit;

     public void tasteit() {
         System.out.println("I'm going to eat a"+ fruit.name + "!" );
         // error: name cannot be resolved or is not a field
         fruit.taste();
     }
}

class exec {
     public static void main(String[] args) {
          Lunch<Banana> bananalunch  = new Lunch<>;
          bananalunch.fruit = new Banana();
          bananalunch.tasteit();
     }
}
接口水果{
大众口味();
}
香蕉类水果{
公共字符串name=“Banana”;
公众口味{
System.out.println(“美味香蕉!”);
}
草莓类水果{
公共字符串name=“草莓”;
公众口味{
System.out.println(“美味草莓!”);
}
}
课堂午餐{
公共果型果实;
公共图书馆{
System.out.println(“我要吃一个“+水果.name+”!”;
//错误:名称无法解析或不是字段
水果味;
}
}
类执行器{
公共静态void main(字符串[]args){
午餐班纳伦克=新午餐;
bananalunch.fruit=新香蕉();
bananalunc.tasteit();
}
}
香蕉和草莓正在实现水果。在课堂午餐中,我试图调用水果名称及其函数taste(); 虽然调用函数taste工作正常,但我无法调用该名称(请参阅:注释中的错误)

想要的输出: 我要吃香蕉! 美味的香蕉

正如我所说,yummy banana可以工作,但名称无法解析。我尝试在水果接口中声明“public String name=“default”);然后您可以调用它,但它总是说“default”,而不是实际类中的名称

有没有办法获得实现接口的泛型类型的成员? 另外,我需要这样做,当然这个代码只是为了表示,但我有一个更大更复杂的代码,在其中我遇到了这个问题-如果没有必要,我不想重新构造它


提前感谢!

您的问题是由于尝试直接访问实例成员--
fruit.name
,而不是通过方法--
fruit.getName()
造成的

如果使用getter方法,将执行正确的方法并返回所需的输出

也就是说,在这个特定的示例中,在基类中有一个
getName()
方法,在该基类中有一个
\u name
变量更有意义,该变量根据类的实际类型初始化为不同的值

另一方面,如果您的
foults
是一个接口而不是基类,那么可以让实现该接口的每个类都有一个
getName()
方法返回不同的值

例如:

class Strawberry implements Fruit {
     public String name = "Strawberry"; 
     public void taste(){
         System.out.println("yummy strawberry!");
     }
}
将成为:

class Strawberry implements Fruit {
     public String getName () {
         return "Strawberry";
     }
     public void taste() {
         System.out.println("yummy strawberry!");
     }
}
您必须将
getName()
添加到接口:

interface Fruit {
     public String getName();
     public void taste();    
}
最后,您的
午餐
课程变成:

class Lunch<Fruittype implements Fruit> {
     public Fruittype fruit;

     public void tasteit() {
         System.out.println("I'm going to eat a "+ fruit.getName() + "!" );
         fruit.taste();
     }
}
课堂午餐{
公共果型果实;
公共图书馆{
System.out.println(“我要吃一个“+水果.getName()+”!”;
水果味;
}
}

当类实现接口时,Case表示该类的对象可以执行接口中描述的操作

例如,每个平面形状都有面积,所以我们可以确定界面:

interface PlaneShape {
    int getArea();
}
正方形的面积是边的乘积,圆形的面积是边的乘积 半径的平方除以π数除以2。因此:

class Square implements PlaneShape {
    public int edge = 5;

    public int getArea() {
        return edge*edge;
    }   
}

class Circle implements PlaneShape {
    public int radius = 5;
    public int pi = 3.14;

    public int getArea() {
        return radius*radius*pi/2;
    }   
}
接口用于抽象。AreaCalculator使用平面形状进行操作,因此它可以从任何特定类型的平面形状中进行抽象。AreaCalculator只知道任何形状都可以通过执行方法getArea()为其提供面积值。AreaCalculator对特殊形状字段一无所知,例如
半径

class AreaCalculator<S implemets PlaneShape> {
    public S shape;

    public int calculateArea() {
        shape.getArea();
    }
}
类面积计算器{
公众形象;
公共整数计算earea(){
shape.getArea();
}
}
这样,在您的示例中,
sunch
类不知道任何内部名称,它不“查看”此字段,它只能调用方法
taste()
。您需要将方法
getName()
添加到接口中,并实现它


关于接口中的
name=“default”
主题。它在接口上下文中声明,与实现没有任何关系。

我将向接口添加一个
getName()
方法,并在该接口的实现中实现标准的getter/setter方法。(当然,将
name
设为私有。)谢谢!我还没想过呢