【发布时间】:2018-09-21 14:44:11
【问题描述】:
案例一:
我有一个Inter.java 接口:
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() 来自实现的接口“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 中,接口“Inter”的方法 abcd() 被覆盖。
案例 1:在 Use 类中重写了谁的方法 abcd()?类基或接口间?错误说我们正在覆盖接口 Inter 的 abcd()。但是在案例2中:似乎我们没有覆盖接口Ab的方法run。因为我们可以通过调用 t.start() 来执行 run() 方法。这只有在我们重写 Thread 类的 run() 时才有可能。
【问题讨论】:
-
@OHGODSPIDERS 具有默认可见性的方法对同一包中的所有类都是可见的。所以你错了。
标签: java inheritance interface overriding