2015-09-04 2 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

Я думаю, вам, возможно, захочется более подробно ознакомиться с [интерфейсом 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 

Назад к текущему дизайну, я думаю, что это не ООП. Мое предложение состоит в том, чтобы изменить Person на класс Abstract. Вы можете создать еще один класс, например, «Студент», «Профессор» ... для продолжения Личности.В Person есть свойства этого типа firstName, lastName, mNumber и для них есть getter/setter. Факультет - это еще один класс, который содержит только информацию о себе. Вам понадобится класс службы, например StudentManagementService (название отражает вашу компанию или ваше действие). Просто попробуй так думать, и если у тебя все еще есть вопросы, все тебе помогут.

Надеюсь, что эта помощь.

0

Интерфейс имеет абстрактные методы, которые вы реализуете в своем классе реализации, и, поскольку вы не реализовали или не переопределили какие-либо из методов класса Faculty, компилятор жалуется.

Что вы можете сделать, это сделать интерфейс как класс, а затем ваш код будет работать нормально. Или, если вы все еще хотите использовать интерфейс, тогда вам нужно разместить там абстрактные методы и реализовать их в реализации класса. Это 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 
    } 
} 

Даже в этом случае вы должны будете предоставить тело метода в классе, но у вас есть свобода, чтобы оставить его пробел, и когда вы сделаете это, метод по умолчанию будет называться

Смежные вопросы