【问题标题】:How to use Abstract Class/ Interface correctly?如何正确使用抽象类/接口?
【发布时间】:2014-03-25 16:02:33
【问题描述】:

我的抽象类有问题。

这是我的界面:

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.iK(kM,g); 中的service 是什么?

标签: java class interface abstract


【解决方案1】:

请先粘贴到main方法中。

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

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

    };

【讨论】:

  • 修改您的答案以反映 Serviceabstract
  • 但是当Service类是抽象类时,我可以创建对象吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这个话题只适合删除。

    ArrayList 对 Ks 类型进行操作,你们在其中放入了一个 K 类型对象... 如果你想实例化它,你应该扩展这个类,或者使它不是抽象的(通过实现接口)。

    【讨论】:

      【解决方案4】:

      您的具体示例似乎与某种 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。

      【讨论】:

        猜你喜欢
        • 2012-05-01
        • 2011-07-13
        • 2011-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        • 2012-03-03
        相关资源
        最近更新 更多