gpt4 book ai didi

java - 当派生类扩展基类并同时实现接口(interface)时,谁的方法被重写?

转载 作者:行者123 更新时间:2023-12-02 11:23:11 25 4
gpt4 key购买 nike

案例1:

我有一个Inter.java接口(interface):

interface Inter
{
void abcd();
}

基类:

class Base
{
void abcd()
{
System.out.println("Base abcd");
}
}

派生类:

class Use extends Base implements Inter
{
void abcd() //intentionally not using public
{
System.out.println("Use abcd");
}
public static void main(String[] args)
{
Use u = new Use();
u.abcd();
}
}

现在我编译它:

gyan@#ns:~/Desktop$ javac Inter.java Base.java Use.java 
Use.java:3: error: abcd() in Use cannot implement abcd() in Inter
void abcd()
^
attempting to assign weaker access privileges; was public
1 error
gyan@#ns:~/Desktop$

这意味着 Use 类中的重写方法 abcd() 来自实现的接口(interface)“Inter”,而不是来自基类“Base”。

案例2:

我们有一个包含以下代码的文件 Test.java:

interface Ab
{
void run();
}

class A extends Thread implements Ab
{
public void run()
{
System.out.println("class A");
}
public static void main(String[] args)
{
A a = new A();
Thread t = new Thread(a);
t.start();
System.out.println("main method");
}
}

当我们执行它时,我们得到:

gyan@#ns:~/Desktop$ java A
main method
class A
gyan@#ns:~/Desktop$

由于 t.start() 执行了 run() 方法,这意味着 Thread 类的 run() 方法被覆盖。但在情况 1 中,接口(interface)“Inter”的方法 abcd() 被覆盖。

情况 1:谁的方法 abcd() 在类 Use 中被重写?类基还是接口(interface)Inter?错误表明我们正在覆盖 Inter 接口(interface)的 abcd()。但在情况 2 中:看来我们没有重写接口(interface) Ab 的 run 方法。因为我们可以通过调用t.start()来执行run()方法。只有当我们重写 Thread 类的 run() 时,这才有可能。

最佳答案

类中的方法重写基类方法并同时实现接口(interface)。

重写方法与实现接口(interface)并不完全相同:

  • 重写父类(super class)中的方法意味着您正在替换其实现。如果您没有提供重写方法,则将使用父类(super class)(可以为空)的实现。
  • 在实现接口(interface)方法时,您正在为简单声明提供代码(没有任何实现)。如果您将非抽象类声明为实现接口(interface),但没有为接口(interface)的每个方法提供实现,则编译将失败。在 Java 8 中情况不太如此,您可以选择在接口(interface)中提供默认实现,但在这种情况下,来自父类(super class)的任何实现都会获胜。

方法的实现和重写始终可以扩展其可见性,但不会降低它。这意味着:

  • 父类(super class)中的包私有(private)(默认可见性)或 protected 方法可以在子类中公开
  • 但父类(super class)中的公共(public)方法不能在子类中设为包私有(private)或 protected 。

接口(interface)中的方法始终是公共(public)的,即使接口(interface)中未指定“public”修饰符也是如此。因此,它们的实现也必须是公共(public)的 => 这就是您在案例 1 中遇到的错误

顺便说一句,在你的情况2中,你使用的线程是错误的。不要子类化 Thread。相反,创建一个实现 Runnable 或 Callable 接口(interface)的类,并将其提交到线程池(请参阅 java.util.concurrent 中的类,或者使用 java 8 的 ForkJoinPool.commonPool().submit(myTask) 进行快速测试.

关于java - 当派生类扩展基类并同时实现接口(interface)时,谁的方法被重写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49779734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com