首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么接口中的变量没有出现在类实现中?

为什么接口中的变量没有出现在类实现中?
EN

Stack Overflow用户
提问于 2014-01-21 02:16:11
回答 3查看 324关注 0票数 0

为什么当我单击implement时,接口中列出的变量没有出现在类中?我看了看,我没有看到我真正想要的答案,还是变量更像一个属性?

类:

代码语言:javascript
复制
public class TestInterface implements myInterable {

    public TestInterface() {
    }

    public static void main(String[] args) {


    }

    @Override
    public void method1() {


    }

    @Override
    public void method2() {


    }
}

interface myInterable {
    public int score = 0;
    public void method1();
    public abstract void method2();
}

尝试过此代码,但无法工作。它与列出的Oracle教程中的示例几乎完全一样。

示例:

代码语言:javascript
复制
interface TimeClient {
    void setTime(int hour, int minute, int second);
    void setDate(int day, int month, int year);
    void setDateAndTime(int day, int month, int year, int hour, int minute, int second);
    void getLocalDateTime();

    public static String getZoneId (String zoneString) { <-- Tutorial example
        return "";
    }

    public default int getZonedDateTime(String zoneString) { <-- like the tutorial
        return 0;
    }
}

另一个例子是:

Oracle声明您不能创建接口的实例,但是如果您的类实现和接口比您可以通过创建对类的新引用来创建接口实例?你会这样看待这个。这是一种创建类实例的更好方法吗?方法是使用接口并将所有的方法存根放在接口中,然后添加一个新的接口方法,而不必因为一个或两个新方法而重写所有代码。

如果这是正确的,并且我想向我的例如我的应用程序中添加一个新的方法,那么如果我的变量使用这种类型的实例创建,我就不必遍历并重新编译每个类来添加一个新方法。

代码语言:javascript
复制
public class TestInterface implements myInterable,
                                      Runnable,
                                      MouseListener {
     //Code goes here
}

public myInterable uu = new TestInterface(); <--This is the interface class

不起作用的例子。

如果我用类变量名创建接口实例,这是否有效。

代码语言:javascript
复制
public class TestInterface implements myInterable,
                                      Runnable,
                                      MouseListener {

    public  myInterable uu = new TestInterface();

    public TestInterface() {
    }

    public void method1() {
    }


    public void method2() {
    }


    public void run() {
        System.out.println("Runnable");
    }

    @Override
    public void mouseClicked(MouseEvent arg0) {
    }

    @Override
    public void mouseEntered(MouseEvent arg0) {
    }

    @Override
    public void mouseExited(MouseEvent arg0) {
    }

    @Override
    public void mousePressed(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub
    }

    public static void main(String[] args) {
        TestInterface b = new TestInterface();
        b.run();
        b.uu.run();
    }
}

interface myInterable {
    public int score = 0;
    public void method1();
    public abstract void method2();
    public abstract void run();
//     void method3() {
//      int index = 0;
//       for (index = 0; index < 10; index++) {
//       }
//  }
}

错误信息:

代码语言:javascript
复制
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
at DDHIntefaceExample.TestInterface.<init>(TestInterface.java:10)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-21 02:36:50

让人费解的是,您的myInterable应该是MyInterable,遵循典型的Java大写惯例。

接口中的所有方法本质上都是public abstract (而且您不能定义static方法)。不过,Java 8可能会改变这一点。

接口中的所有变量本质上都是public static final

有关更多详细信息,请参见关于接口的Java教程

所以你的

代码语言:javascript
复制
interface MyInterable {
    public int score = 0;
    public void method1();
    public abstract void method2();
}

是相同的

代码语言:javascript
复制
interface MyInterable {
    public static final int score = 0;
    public void method1();
    public void method2();
}

,并且也与

代码语言:javascript
复制
interface MyInterable {
    int score = 0;
    void method1();
    void method2();
}
票数 2
EN

Stack Overflow用户

发布于 2014-01-21 02:18:07

The JLS状态

接口主体中的每个字段声明都是隐式的publicstaticfinal。允许冗余地为这些字段指定任何或所有这些修饰符。

因此,示例中的字段score不是继承的,因为它是static

票数 5
EN

Stack Overflow用户

发布于 2014-01-21 02:18:30

只能在接口中定义常量或静态变量,而不能定义实例变量。如果要定义实例变量,为什么不使用抽象类并提供getter和setter,并将实例变量设置为私有?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21247902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档