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
设为私有。)谢谢!我还没想过呢