所以我试图创建一个使用实现接口的类的程序。这个想法是界面具有所有可能的基本统计数据,就像所有使用大学的人一样,而课程则更具体,例如教师。用户提供他们的名字和姓氏,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)
如果有人能告诉我我做错了什么,请解释为什么会出错,并告诉我如何解决它,我们将不胜感激。
答案 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
}
}
甚至,在这种情况下,你必须在你的类中提供方法体,但你可以自由地将它留空,当你这样做时,默认方法将被称为