2015-09-04 111 views
1

所以我试图创建一个使用实现接口的类的程序。这个想法是接口拥有所有可能的基础统计数据,就像所有使用大学的人一样,而班级则更具体,比如教师。用户给出他们的名字和姓氏,M号码(实质上是一个ID),以及他们是全职还是兼职。我并不试图检查它是否已经存在,或者是任何复杂的东西:只要创建该对象,然后输出一行说明它已创建。Java类实现接口错误

下面的代码:

接口:

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) 

如果有人能告诉我什么,我做错了,解释为什么它是错误的,并告诉我如何解决它,这将不胜感激。

+1

我想你可能想仔细看看[interfaces trail](https://docs.oracle.com/javase/tutorial/java/IandI /createinterface.html),如果您使用的是Java 8,[缺省方法](https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html) – MadProgrammer

回答

1

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

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

如果您使用的是java 8,只需声明您的方法为default,它应该工作,我相信。

+1

*“接口不能有逻辑他们“* ...实际上... [默认方法](https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html) – MadProgrammer

+1

猜猜我没有及时了解我的Java 8 。 谢谢(你的)信息。我修改了我的帖子。 – CollinD

3

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

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

您可能正在寻找一个abstract class,它可以让你有abstract方法(必须由非抽象子类实现的方法)和可以在abstract类中给出实现的常规方法(子类可以选择覆盖它们)。

但我不确定是否要使用抽象类或接口。按照课程名称排列,Faculty将有Person s,但我不明白为什么要扩展/实现其他。他们似乎是不同的东西。你可能要重新考虑你的设计也是这样说的: When should I use an interface in java?

0

首先,我觉得你可以参考使用接口和抽象来这里的路上:

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。在个人中,它有像firstName,lastName,mNumber这样的属性,并且具有getter/setter。学院是另一个只包含自身信息的类。您将需要一个Service类,例如StudentManagementService(名称反映您的业务或您的操作)。 试着像这样思考,如果你仍然有问题,每个人都会帮助你。

希望得到这个帮助。

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 
    } 
} 

即使在这种情况下,你将不得不提供方法体中的类,但你有自由离开它空白,当你这样做时,默认方法将被称为