在Java中,线程中的super.run()是什么意思?

在Java中,线程中的super.run()是什么意思?,java,android,multithreading,handler,super,Java,Android,Multithreading,Handler,Super,我真的不明白super.run()的意思和super.handleMessage(msg) 它们是必要的吗 我的代码应该写在哪里?在super.run()之前/super.handleMessage(msg)还是在它们之后 new Thread(){ @Override public void run() { super.run(); } }.start(); / 问题 我真的不明白super.run()和super.handleMessage(msg)

我真的不明白
super.run()的意思
super.handleMessage(msg)
它们是必要的吗

我的代码应该写在哪里?在
super.run()之前/
super.handleMessage(msg)还是在它们之后

new Thread(){
    @Override
    public void run() {
        super.run();
    }
}.start();
/


问题

  • 我真的不明白
    super.run()
    super.handleMessage(msg)
    的意思,它们是必需的吗
  • 我的代码应该写在哪里?在
    super.run()之前还是之后
  • 答案-1

    这在相关代码中是不必要的

    new Thread(){
        @Override
        public void run() {
            super.run();
        }
    }.start();
    
    public class Thread implements Runnable
    {
        ...
        @Override
        public void run() {
            if (target != null) {
                target.run();
            }
        }
        ...
    }
    
    super.run
    是调用
    Thread
    类。因此,没有必要这样做,因为存在空函数

    答案-2

    请参考答案-1,你不必担心


    但是,如果实现了
    super.x
    ,则必须编写依赖于函数的代码。

    线程类文档清楚地说明了这一点

    public void run()
    
    If this thread was constructed using a separate Runnable run object, then that Runnable object's run method is called; otherwise, this method does nothing and returns.
    
    Subclasses of Thread should override this method.
    
    类似地,Handler Java文档也不是很清晰,但如果您看到Handler的handleMessage方法代码,它是空的

        /**
         * Subclasses must implement this to receive messages.
         */
        public void handleMessage(Message msg) {
        }
    
    因此,对于这两种方法,都不需要调用super。他们俩什么也不做


    你的第二个问题,答案取决于你的要求。Java不限制对超级方法的调用必须是第一行代码(除非您在编写构造函数时,超级构造函数必须在子类构造函数中的任何其他行/段代码之前被调用)。如果您需要在超级类方法之前处理一些逻辑,您可以自由地这样做。如果需要,还可以在方法代码之间调用super方法。因此,您可以在重写方法中的任何位置调用超级方法。您需要了解超类方法的作用以及如何使用它来决定何时调用它。

    当您编写
    @Override public void run()
    时,您正在重写基本运行方法,以便它将运行其上的任何内容。 在下面的示例中,它将在run内部打印。如果您在构造函数中传递target并调用
    super.run()
    ,则调用了
    target.run()
    方法

    public static void main(String[] args) {
            new Thread(new test()){
                @Override
                public void run() {
                   // super.run();
                    System.out.println("inside run");
                }
            }.start();
        }
    
    }
    class test implements Runnable{
    
        @Override
        public void run() {
            System.out.println("inside target");
    
        }
    
     }
    

    对于线程super,不需要run()。对同名对象的超级方法的任何调用都将调用类继承自的类中的方法。对于Thread(),它提供了一个空的run方法,它不做任何事情。所以这不是必需的。我不确定处理程序是如何工作的,但我猜这里也不需要它。
    public static void main(String[] args) {
            new Thread(new test()){
                @Override
                public void run() {
                   // super.run();
                    System.out.println("inside run");
                }
            }.start();
        }
    
    }
    class test implements Runnable{
    
        @Override
        public void run() {
            System.out.println("inside target");
    
        }
    
     }