繁体   English   中英

在Java中实例化对象后无法在接口中调用某些方法

[英]Cannot call some methods in interface after instantiating the objects in Java

如您所见,我有此代码示例。 但是当我尝试编译时,它在id.input给出了错误提示, id.input对象引用变量id 有人可以帮帮我吗?

interface IDisplay{
    void print();
    void printDetails();
}

interface IInput{
    void input();
}

class Book implements IDisplay,IInput{
    int bookID;
    String title,publisher;
    public void print(){

    }
    public void printDetails(){

    }
    public void input(){

    }
}

class Student implements IDisplay,IInput{
    int studentID;
    public void print(){

    }
    public void printDetails(){

    }
    public void input(){

    }
}

class A{
    public static void main(String[] args) {
        IDisplay id=new Student();
                id.print();
                id.printDetails();
                id.input();
    }
}

接口IDisplay只有两个方法printprintDetails ,方法input位于接口IInput

在您的代码中,对象id类型为 IDisplay (即使它持有对Student对象的引用 ),因此您只能在接口IDisplay上调用方法。

您必须将id对象转换为StudentIInput才能调用input

((Student)id).input();
((IInput)id).input();

要么

idStudent类型。

但是,可以争辩说,前者违反了一些OO原则,因为IDisplay必须仅是IDisplayIInput必须仅是IInput

在编译阶段,编译器仅知道id的引用类型为IDisplay ,不知道id的运行时类型为Student

由于IDisplay没有方法input ,因此出现编译错误。 要使其编译,可以将其显式转换:

((Student)id).input();

一个Student实例将能够调用IInputIDisplay方法的所有方法,但这取决于您如何操作它

因为您将if存储在IDisplay ,所以IInput的方法不可见


解决方案:

  1. 投放到IInput

     IDisplay id = new Student(); id.print(); id.printDetails(); ((IInput) id).input(); // or ((Student) id).input(); 
  2. Student类型存储

     Student id = new Student(); id.print(); id.printDetails(); id.input(); 

那是因为idIDisplay类型而不是Student类型。

IDisplay没有方法input()

如果要从Student调用方法,可以将其StudentStudent

((Student)id).input();

或强制转换为IInput:

((IInput)id).input();

或实例化为学生:

Student s = new Student();
s.input();

实例化IDisplay的对象(id)类型时,导致JVM将其强制转换为IDisplay类型的对象。
因此,尽管您使用了实现IDisplay和IInput的Student类的构造函数,但仅使用接口IDisplay的已实现方法实例化了它。
如果要使用对象ID访问IDisplay和IInput这两个接口的已实现方法,则应将代码修改为:

class A{
    public static void main(String[] args) {
        Student id = new Student();
                id.print();
                id.printDetails();
                id.input();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM