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



我的抽象类有问题。

下面是我的界面:
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操作的是K类型,而你们在里面放了一个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"); }
}

现在您已经定义了哪些州定义了"Car"对象,然后您将其专门化到"Hondacar"的定义中。

希望这有意义。

到接口……接口是公共API的声明。它们是实现类必须遵守的"契约"。根据定义,实现接口的类必须实现该接口上的所有方法。您可以将接口视为只有抽象方法的抽象类,其中抽象类的子类将需要覆盖该超类型上的每个方法(这与实现的接口方法上的"@override"注释相似),尽管许多人可能不赞成这种想法。我不确定你想用你的具体例子做什么,因为它没有任何我可以推断的名字,所以我不能真正帮助你。

因此,在整个汽车的例子中,类似的设计将是:

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

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

最新更新