繁体   English   中英

如何正确使用抽象类/接口?

[英]How to use Abstract Class/ Interface correctly?

我的抽象课有问题。

这是我的界面:

package dovilesUzduotis4;

import java.util.ArrayList;

public interface Interface1 {
    void a(ArrayList<K> kM, String g);
}

和抽象类:

package dovilesUzduotis4;

import java.util.ArrayList;

public abstract class Service implements Interface1 {
    public void iK(ArrayList<Ks> kM, String g){
        K aK = new K(g);
        kM.add(aK); 
    }
}

但是当我尝试使用service.iK(kM,g); 在主要我得到错误“服务无法解决”。 我该如何纠正?

请先粘贴主要方法。

我的猜测是您忘记实例化该类的对象:

Service service= new Service() { //create an object of the class
}; //brackets are there because the Service is abstract class and I am redefining it.
service.iK(kM, g); //invoke a method an that object

现在,我认为Service类不需要是抽象的。 如果希望用户以适合其需求的方式实现该类的一个或多个标记为抽象的方法,则可以将该类抽象化。 不用说,我在您的Service类中看不到任何抽象方法。

因此涉及到此:

  • 如果该类不是抽象的,则将其实例化为:

    Service service= new Service();

  • 如果该类是抽象的,则必须在以下位置重新定义它:

    Service service= new Service() {

    //here you could implement an abstract method or redefine an existing one

    };

首先,Java是case-sensitive这意味着serviceService是不同的东西。 您刚得到的错误: service cannot be resolved表示您需要Service类,但是该service类是预期的。

请记住,类名应实现CamelCase ,而变量名应以小写字母开头。

要调用方法,您必须:

  • 创建一个对象并访问其方法
  • 或将方法static

在第一种情况下,您必须实现一个子类:

SubService extends Service {}

因为服务是abstract ,并且有望得到扩展。

然后:

SubService service = new SubService();
service.method();

在第二种情况下,您不必扩展类,则可以调用静态方法。

public abstract class Service implements Interface1 {
    public static void iK(ArrayList<Ks> kM, String g){ //static method
        K aK = new K(g);
        kM.add(aK); 
    }
}

然后:

Service.iK(arg0, arg1);

本主题仅适用于删除。

ArrayList在Ks类型上运行,并且您正在其中放入一个K类型对象...您应该扩展此类,或者如果要实例化它,请使其不抽象(通过实现接口)。

您的特定示例似乎与某种Web服务api有关。 没有支持抽象类的代码,我们就无法真正为您提供帮助。

我认为我们可以从与接口和抽象类有关的一些简单基础知识入手,因为这似乎是您的问题。

根据定义,抽象类是不能创建其实例的类。 darijan为“构造”抽象类的实例所做的工作是,他正在为Service抽象类型创建一个匿名内部类。

Service service= new Service() { }; // notice the curly braces, this is an anonymous class definition

关于抽象类和界面的最佳实践,有很多不同的思想和观点流派。 我认为,我们在这里真正谈论的是OOP的核心。 抽象类旨在提供带有或不带有具体实现的API,以便可以将它们重写和专门用于特定目的。

这将是一个不错的示例:

public class Car {
String make;
public car (String make) { this.make = make; }
}

public class Hondacar extends Car{
public Hondacar() { super("honda"); }
}

现在,您已经定义了定义“汽车”对象的状态,然后将其专门化为“本田汽车”的定义。

希望这是有道理的。

到接口上...接口是公共API的声明。 它们是实现类必须遵守的“合同”。 根据定义,实现接口的类必须在该接口上实现所有方法。 您可以将接口视为仅具有抽象方法的抽象类,其中抽象类的子类将需要覆盖该超类型上的每个方法(这与已实现的接口方法上的“ @override”注释相似),尽管许多可能不鼓励这种想法。 我不确定您要如何处理您的特定示例,因为它没有任何名称甚至可以从中得出推论,因此我无法真正为您提供帮助。

因此,以整个汽车为例,类似的设计将是:

interface Car { 
String getMake();
}

class HondaCar implements Car {
private static final make = "honda";
@override
public String getMake() { return HondaCar.make; }
}

您可以看到接口如何根本不提供任何实现,它仅定义实现类必须提供的公共API。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM