当前位置: 首页 > 知识库问答 >
问题:

接口-类允许静态成员方法到实例成员方法的重新声明,但不能用于类-类或接口-接口

周睿范
2023-03-14
java prettyprint-override">interface Super{
    public static void doIt(){}
}
class Sub implements Super{
    public void doIt(){}
}
    null
class Super{
    public static void doIt(){}
}
class Sub extends Super{
    public void doIt(){}
}
  • 同样的道理是什么?-理想情况下,访问子类的方式本质上是相同的-那么为什么会有这种限制呢?

共有1个答案

温智明
2023-03-14

原因是Java允许以非静态方式调用静态方法。请考虑以下示例:

public class MyClass {
    public static void sayHello() {
    }

    public void test() {
        this.sayHello();
    }
}

这将产生一个编译器警告(应该以静态方式访问MyClass类型的静态方法sayHello()),但它将在运行时正确编译和调用静态方法。

这就是为什么下面的代码不会编译,因为有一个二义性(MyClass类型中的重复方法test()):

public class MyClass {
    public static void test() {
    }

    public void test() {
    }
}
public class MyClass {
    public static void test() {
    }

    public void test() {
    }

    public void execute() {
        this.test();
    }
}
public class Super {
    public static void test() {
    }
}

public class Sub {
    public void execute() {
        this.test();
    }
}
public class Sub {
    public void execute() {
        test();
    }
}

其中调用this.test()会产生警告,但在运行时会起作用。

对于接口中的static方法,上面的示例将不起作用,因为编译器强制您以限定的方式调用接口的static方法。以下内容将不起作用(未为类型Sub定义方法interfaceStatic()):

public interface Interface {
    public static void interfaceStatic() {  
    }
}

public class Sub implements Interface {
    public void test() {
        interfaceStatic();
    }
}

为了调用interfacestatic(),必须对调用进行如下限定:

public class Sub implements Interface {
    public void test() {
        Interface.interfaceStatic();
    }
}
 类似资料:
  • 但是,我也看到了一种奇怪的方法来重写接口方法: 3.子类只实现接口,但由父类重写接口中的方法: 覆盖接口方法的第三种方法在android框架源代码中非常常见,例如: 这样设计的原因是什么?

  • 我是Visual Studio Xamarin的新手。在现有的xamarin android项目中,我必须添加一个Jar文件(SDK),所以我创建了一个绑定库,但是它引发了一些错误,我试图通过使用metadata.xml来解决这些错误,其中一个如下所示: 在api.xml中搜索,我发现了以下内容: 在接口中有这样的方法: 但是,当我搜索生成的类DeviceService.cs时,我发现了以下内容:

  • 我正在尝试创建一个单例的访问方法。我得到这个错误(见下面的代码)。我不明白为什么会出现这个错误,以及这个错误的含义。有人能解释一下吗?

  • 我在读有效的Java课本。第一项是关于使用静态工厂方法而不是公共构造函数。我的疑问是,如果我正在指定我如何在中指定静态工厂方法?因为Java不支持内部的静态方法。教材指定了如何创建包含公共静态工厂方法的不可实例化类。但是这些方法如何访问实现类的私有构造函数呢? 教材中说,如果要定义,请创建一个不可实例化的类,并在该类中包含静态工厂方法。但是类中定义的方法如何访问具体实现的私有构造函数 编辑:-以下

  • 我尝试对多个元素使用视图转换,但遇到了这个错误:静态成员“transition”不能用于“UIView”类型实例。我读过类似的讨论,但无法在我的案例中实现它们。你能帮帮我吗? 下面是我的代码:

  • 我试图通过visual Studio中的android绑定库将clover.aar文件绑定到xamarin。我把它归结为两个错误: “Decimal”不实现接口成员“icomparable.comapreto(对象)”