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

时间:2014-03-25 16:02:33

标签: java class interface abstract

我的抽象类有问题。

这是我的界面:

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)时;在主要我得到错误&#34;服务无法解决&#34;。我该如何纠正?

4 个答案:

答案 0 :(得分:1)

请先粘贴主要方法。

我的猜测是你忘了实例化一个类的对象:

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

    };

答案 1 :(得分:0)

首先,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);

答案 2 :(得分:0)

本主题仅适用于删除。

ArrayList在Ks类型上运行,你们在里面放了一个K型对象...... 如果要实例化它,则应扩展此类,或使其不是抽象的(通过实现接口)。

答案 3 :(得分:0)

您的具体示例似乎与某种webservice api有关。如果没有抽象类的支持代码,我们就无法帮助您。

我认为我们可以从一些与接口和抽象类相关的简单基础开始,因为这似乎是你的问题。

抽象类是根据定义不能创建实例的类。 darijan做了什么&#34;构建&#34;而抽象类的实例是他正在为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"); }
}

现在你已经定义了什么状态定义了一个&#34; Car&#34;对象,然后你将其专门化为&#34; Hondacar&#34;的定义。

希望这是有道理的。

Onto interfaces ...接口是公共API的声明。他们是&#34;合同&#34;实施类必须遵守。根据定义,实现接口的类必须实现该接口上的所有方法。您可以将接口视为仅具有抽象方法的抽象类,其中子类化该抽象类的类将需要覆盖该超类型上的每个方法(这与&#34; @ override&#34;实现的接口上的注释相似虽然很多人可能会劝阻这种思维方式。我不确定你要用你的具体例子做什么,因为它没有任何名字,我甚至可以从中得出推论,所以我无法帮助你。

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

interface Car { 
String getMake();
}

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

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