为什么 abstract 属性 在 Runnable 接口的子类中丢失了?
why abstract property is lost in a subclass of Runnable interface?
我其实是在学习Threads。但是遇到一个非常基本的问题。我知道如果我在我的 class 中继承一个接口,我必须在我继承的 class 中给出所有方法(在该接口中提到的)的定义,否则它必须被声明为抽象的。现在我尝试了非常简单的代码...
import java.util.*;
import java.lang.*;
import java.io.*;
abstract class Code implements Runnable
{
public static void main (String[] args) throws java.lang.Exception
{
}
}
编译没有问题,然后我把class代码中的abstract
关键字去掉,就提示编译错误,说class代码不抽象。 ..
肯定有错误。但是后来我做了什么,检查了一些变化,也从 class 扩展了 Thread class 并重新编译了代码。而且我没有编译错误!虽然我没有给出 run()
方法的定义,但我也没有提到我的 class 是抽象的。
那里...
class Code extends Thread implements Runnable
{
public static void main (String[] args) throws java.lang.Exception
{
}
}
表示这个class丢失了摘要属性。这怎么可能?有没有人解释一下。
抽象 class 不必实现接口中的所有方法。当您删除 'abstract' 时,Runnable class 已实现 运行 方法
@Override
public void run() {
// TODO Auto-generated method stub
}
嗯,你知道 Runnable 接口只有一个抽象方法。即,
abstract public void run();
如果您要实现 Runnable,则必须在您自己的具体 class 中提供 运行() 方法的定义,或者您可以将 class 抽象化。现在,您可以在 class 中显式地提供 运行() 方法的定义,或者通过继承具有 运行() 方法的有效定义的任何其他 class 来隐式地提供。线程 class 还具有 运行() 方法的有效定义。所以,如果你在你的 class 中同时继承 Thread class 和 Runnable 接口,那 class 不再携带任何抽象 property.that 这就是你没有得到编译的原因 error.Make 确定 运行() 方法的访问说明符。如果你继承任何其他 class 而不是 Thread 你必须在那里提供具体的 运行() 方法,
public void run()
{
//body
}
Runnable
是一个接口,它需要任何实现它的 class 来实现 run()
方法
public class A implements Runnable {
public void run() {
// implementation of run
}
}
Thread
是实现 Runnable
接口的具体 class。这意味着它已经具体实现了run()
方法。
public class Thread implements Runnable {
public void run() {
// Java's implementation of run
// for the Thread class
}
}
当您定义扩展 Thread
的 class 时,这意味着它将扩展 Thread
class,它已经实现了 [=13] 所需的一切=] 界面。所以你不需要实现 run()
方法。但是,您可以 override
来自 Thread
的实现,并在需要时选择性地调用它。
class A extends Thread {
@Override
public void run() {
// implementation of run
// optionally call super.run();
}
}
java.lang.Thread
已经实现了 Runnable
接口并定义了 run
方法。因此,当您扩展 Thread
时,您已经拥有实现 Runnable
所需的一切。如果愿意,您可以使用自己的定义覆盖 run
方法。但是你不需要,如果Thread自己的实现可以满足你的需求。
如前所述,Runnable is an interface containing just one method, run(),正如您所指出的那样抽象。如果您要实现接口:
class A implements Runnable {
...
}
编译器会报错:Class A must be either declared abstract or implement abstract method 'run()' in 'Runnable'
,所以根据报错提示你可以选择实现方法:
class A implements Runnable {
public void run() {
...
}
}
或将class设为摘要:
abstract class A implements Runnable {
}
任何解决方案都会满足编译器的要求。另一种解决方案是使 A
也成为一个接口:
interface A extends Runnable {
}
一切都取决于你想完成什么。如果您想扩展现有的层次结构但又不想在 A.
中有任何状态,则稍后提供的解决方案将很有用
Runnable 是具有以下声明的接口。
public
interface Runnable {
/**
* When an object implementing interface <code>Runnable</code> is used
* to create a thread, starting the thread causes the object's
* <code>run</code> method to be called in that separately executing
* thread.
* <p>
* The general contract of the method <code>run</code> is that it may
* take any action whatsoever.
*
* @see java.lang.Thread#run()
*/
public abstract void run();
}
当你用 implements Runnable
classue 声明你的 class 时,要么你必须实施 运行()方法或将您的 class 声明为抽象
当您的 class 使用以下语句扩展 Thread
时
class Code extends Thread
Thread
class 已经实现了 run()
方法,因此您不会收到编译错误。您可以从下面的语句中删除 implements Runnable
,这是多余的。
class Code extends Thread implements Runnable
看看Thread源代码:
public
class Thread implements Runnable {
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
public void run() {
if (target != null) {
target.run();
}
}
我其实是在学习Threads。但是遇到一个非常基本的问题。我知道如果我在我的 class 中继承一个接口,我必须在我继承的 class 中给出所有方法(在该接口中提到的)的定义,否则它必须被声明为抽象的。现在我尝试了非常简单的代码...
import java.util.*;
import java.lang.*;
import java.io.*;
abstract class Code implements Runnable
{
public static void main (String[] args) throws java.lang.Exception
{
}
}
编译没有问题,然后我把class代码中的abstract
关键字去掉,就提示编译错误,说class代码不抽象。 ..
肯定有错误。但是后来我做了什么,检查了一些变化,也从 class 扩展了 Thread class 并重新编译了代码。而且我没有编译错误!虽然我没有给出 run()
方法的定义,但我也没有提到我的 class 是抽象的。
那里...
class Code extends Thread implements Runnable
{
public static void main (String[] args) throws java.lang.Exception
{
}
}
表示这个class丢失了摘要属性。这怎么可能?有没有人解释一下。
抽象 class 不必实现接口中的所有方法。当您删除 'abstract' 时,Runnable class 已实现 运行 方法
@Override
public void run() {
// TODO Auto-generated method stub
}
嗯,你知道 Runnable 接口只有一个抽象方法。即,
abstract public void run();
如果您要实现 Runnable,则必须在您自己的具体 class 中提供 运行() 方法的定义,或者您可以将 class 抽象化。现在,您可以在 class 中显式地提供 运行() 方法的定义,或者通过继承具有 运行() 方法的有效定义的任何其他 class 来隐式地提供。线程 class 还具有 运行() 方法的有效定义。所以,如果你在你的 class 中同时继承 Thread class 和 Runnable 接口,那 class 不再携带任何抽象 property.that 这就是你没有得到编译的原因 error.Make 确定 运行() 方法的访问说明符。如果你继承任何其他 class 而不是 Thread 你必须在那里提供具体的 运行() 方法,
public void run()
{
//body
}
Runnable
是一个接口,它需要任何实现它的 class 来实现 run()
方法
public class A implements Runnable {
public void run() {
// implementation of run
}
}
Thread
是实现 Runnable
接口的具体 class。这意味着它已经具体实现了run()
方法。
public class Thread implements Runnable {
public void run() {
// Java's implementation of run
// for the Thread class
}
}
当您定义扩展 Thread
的 class 时,这意味着它将扩展 Thread
class,它已经实现了 [=13] 所需的一切=] 界面。所以你不需要实现 run()
方法。但是,您可以 override
来自 Thread
的实现,并在需要时选择性地调用它。
class A extends Thread {
@Override
public void run() {
// implementation of run
// optionally call super.run();
}
}
java.lang.Thread
已经实现了 Runnable
接口并定义了 run
方法。因此,当您扩展 Thread
时,您已经拥有实现 Runnable
所需的一切。如果愿意,您可以使用自己的定义覆盖 run
方法。但是你不需要,如果Thread自己的实现可以满足你的需求。
如前所述,Runnable is an interface containing just one method, run(),正如您所指出的那样抽象。如果您要实现接口:
class A implements Runnable {
...
}
编译器会报错:Class A must be either declared abstract or implement abstract method 'run()' in 'Runnable'
,所以根据报错提示你可以选择实现方法:
class A implements Runnable {
public void run() {
...
}
}
或将class设为摘要:
abstract class A implements Runnable {
}
任何解决方案都会满足编译器的要求。另一种解决方案是使 A
也成为一个接口:
interface A extends Runnable {
}
一切都取决于你想完成什么。如果您想扩展现有的层次结构但又不想在 A.
中有任何状态,则稍后提供的解决方案将很有用Runnable 是具有以下声明的接口。
public
interface Runnable {
/**
* When an object implementing interface <code>Runnable</code> is used
* to create a thread, starting the thread causes the object's
* <code>run</code> method to be called in that separately executing
* thread.
* <p>
* The general contract of the method <code>run</code> is that it may
* take any action whatsoever.
*
* @see java.lang.Thread#run()
*/
public abstract void run();
}
当你用 implements Runnable
classue 声明你的 class 时,要么你必须实施 运行()方法或将您的 class 声明为抽象
当您的 class 使用以下语句扩展 Thread
时
class Code extends Thread
Thread
class 已经实现了 run()
方法,因此您不会收到编译错误。您可以从下面的语句中删除 implements Runnable
,这是多余的。
class Code extends Thread implements Runnable
看看Thread源代码:
public
class Thread implements Runnable {
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
public void run() {
if (target != null) {
target.run();
}
}