【问题标题】:Is the Thread class in Java static? [duplicate]Java中的Thread类是静态的吗? [复制]
【发布时间】:2018-07-19 12:04:57
【问题描述】:

我目前正在学习 Java。当我到达课程中包含线程的地步时,我想知道为什么可以在 main 方法中调用 Thread.sleep()。

理念:Thread 类是静态的,这就是它不需要实例化的原因。 但是我想知道为什么我可以创建它的一个对象。我怎么理解?

短代码sn-p

class MyClass{
    public static void main(String [] args){
        Thread trd  = new Thread(new MyThread());
        trd.start();

        try{
            Thread.sleep(1000);
        }
       catch (InterruptedException e) {
            System.out.println("Error occured");
        }
    }
}

public class SuperClass{
    int x = 5;
}

public class MyThread extends SuperClass implements Runnable{
    public void run(){
        while(x<10){
            System.out.println("Hello" + x);
            x++;
        }
    }
}

【问题讨论】:

  • 其实Thread类里面的sleep方法是静态的。 :)
  • @KevinCruijssen 所以线程类不是静态的只有sleep() 方法?这就是为什么我可以通过Thread.sleep();访问它?
  • @Alan static 类在 java 中甚至不存在
  • @Lino 在嵌套类中它们可以是静态的
  • @Alan 这是另一种静态。它只是意味着可以在没有封闭类的实例的情况下创建实例。不像 C# 中那样使内部类 static

标签: java oop


【解决方案1】:

Thread 类本身不是静态的,您可以在 java.lang.Thread 的 Java 文档中看到:

public class Thread extends Object implements Runnable

当像Thread.sleep 这样的调用是可能的(所以没有创建Thread 对象的实例),这意味着方法sleep 在这种情况下是静态的:

public static void sleep(long millis) throws InterruptedException


这里有一个简单的示例类来说明 static 与非静态方法的工作原理:

public class TestObj{
  public static void staticPrint(){
    System.out.println("Static method call");
  }

  public void regularPrint(){
    System.out.println("Non-static method call");
  }
}

我们现在可以这样调用:

TestObj.staticPrint();

但是当我们尝试以下操作时,它会给出编译器错误(无法从静态上下文引用非静态方法 regularPrint()):

TestObj.regularPrint();

相反,您应该创建一个实例来调用regularPrint 方法:

TestObj testObjInstance = new TestObj();
testObjInstance.regularPrint();

请注意,仍然可以使用实例调用静态方法,尽管它会发出警告(TestObj 类型的静态方法 staticPrint() 应该以静态方式访问):

testObjInstance.staticPrint();

Try it online.

【讨论】:

  • 哦,我明白了,非常感谢! :)
  • @Alan 很高兴我能帮上忙。我使用示例类进行了编辑,以说明静态与非静态方法是如何工作的,作为额外的说明。如果有任何不清楚的地方,请随时询问。
  • 我明白了,非常感谢这个很棒的答案! :)
【解决方案2】:

顶级类不能是静态的,只有内部可以。

你的问题是关于为什么在类 java.lang.Thread 中定义的 sleep 方法是静态的。

回答:您可以在代码中的任何位置调用它,而无需引用您的线程。

sleep 使当前正在执行的线程休眠(当前 = 调用它的线程)

【讨论】:

    猜你喜欢
    • 2012-11-15
    • 1970-01-01
    • 2013-06-14
    • 2013-09-18
    • 2014-02-19
    • 2010-10-14
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    相关资源
    最近更新 更多