Java类实现接口错误

时间:2015-09-04 03:27:36

标签: java eclipse class interface

所以我试图创建一个使用实现接口的类的程序。这个想法是界面具有所有可能的基本统计数据,就像所有使用大学的人一样,而课程则更具体,例如教师。用户提供他们的名字和姓氏,M号码(基本上是ID),以及他们是全职还是兼职。我没有尝试检查它是否已存在或任何复杂:只需创建对象,然后输出一条说明它已创建的行。

以下是代码:

界面:

package assignment1;

import java.util.Scanner;

public interface Person {
    String firstName, lastName, mNumber;

    void setName(String fName, String lName){
        firstName = fName; lastName = lName;    }

    String getName(){
        String fullName = this.firstName.concat(" " + this.lastName); 
        return fullName;    }

    void setMNumber(String mNum){
        mNumber = mNum;     }

    String getMNumber(){
        return mNumber;     }
    }

类别:

 package assignment1;

 import java.util.Scanner; 

 public class Faculty implements Person {
     void actionPerformed(java.awt.event.ActionEvent ev){   }
     String Type; 
     public Faculty(){  }

    public void defineType(String type){
        this.Type = type; 
    }

    String getType(){
        return this.Type; }

    void print(){
        System.out.println(" A new faculty " + this.getName() + 
                "M-Number: " + this.getMNumber() + " Type: " + 
                this.Type + " has been created.");
    }

    public static void main(String[] args){
        Faculty f1 = new Faculty();
        Scanner scant = new Scanner(System.in);
        String fName = scant.next(); 
        String lName = scant.next();
        f1.setName(fName, lName);
        String MNum = scant.next(); 
        f1.setMNumber(MNum);
        String T = scant.next();  
        f1.defineType(T); 
        f1.print();
    }
}

当我尝试运行此问题时,问题就出现了。无论我给出什么样的输入,或者通过我所有其他尝试来修复它,我在输入后都会收到以下错误:

 Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
 The type Faculty must implement the inherited abstract method Person.setName(String, String)

at assignment1.Faculty.setName(Faculty.java:5)
at assignment1.Faculty.main(Faculty.java:28)

如果有人能告诉我我做错了什么,请解释为什么会出错,并告诉我如何解决它,我们将不胜感激。

4 个答案:

答案 0 :(得分:4)

接口方法在Java 8之前不能实现。从Java 8开始,这是可能的,但只能使用default methods和静态方法。

  

除了默认方法,您还可以在接口中定义静态方法。 (静态方法是一种与定义它的类相关联的方法,而不是与任何对象相关联。该类的每个实例都共享其静态方法。)

您可能正在寻找一个abstract class,它允许您拥有两个abstract方法(必须由非抽象子类实现的方法)和可以在{{1类本身(子类当然可以选择覆盖它们。)

但我不确定你是否想要使用抽象类或接口。按类名称abstract会有Faculty s,但我不明白为什么要扩展/实现另一个。{1}}它们似乎是不同的东西。您可能想重新考虑您的设计并阅读: When should I use an interface in java?

答案 1 :(得分:1)

接口在Java 8之前不能包含逻辑。你已经在界面中实现了“setName”,但这在Java中是不合法的。接口纯粹是成员对象和方法的列表。

我怀疑你想要的是一个抽象类。这里列出了差异http://www.programmerinterview.com/index.php/java-questions/interface-vs-abstract-class/

如果你使用的是java 8,只需将你的方法声明为default,我相信它应该可行。

答案 2 :(得分:0)

首先,我认为你可以参考这里使用Interface和Abstract的方式:

https://docs.oracle.com/javase/tutorial/java/IandI/usinginterface.html 
https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

回到你目前的设计,我认为这种方式并不是真正的OOP。我的建议是将Person更改为Abstract类。您可以创建另一个类,例如Student,Professor ......来扩展Person。在Person中,有一些属性,如firstName,lastName,mNumber,并为它们设置getter / setter。该学院是另一个仅包含其自身信息的课程。您将需要一个Service类,例如StudentManagementService(该名称反映您的业务或您的操作)。 试着这样想,如果你还有问题,每个人都会帮助你。

希望得到这个帮助。

答案 3 :(得分:0)

接口有抽象方法,你在Implementation类中实现,因为你没有实现或覆盖Faculty类中的任何方法,编译器都在抱怨。

您可以做的是将接口作为一个类,然后您的代码将正常工作。或者,如果您仍想使用Interface,那么您需要在其中放置抽象方法并在实现类中实现它们。这是Java 7

如果你在Java 8,那么你应该这样做:

public interface MyInterface {
    public void existingMethod();
        default public void newDefaultMethod() {
        System.out.println("New default method is added in interface");
    }
} 

public class MyInterfaceImpl implements MyInterface {
    public void existingMethod() {
        // default implementation is called
    }
}

甚至,在这种情况下,你必须在你的类中提供方法体,但你可以自由地将它留空,当你这样做时,默认方法将被称为