展开全部
你这个问题是32313133353236313431303231363533e59b9ee7ad9431333361326361因为类加载顺序的问题导致的,出现这个问题的原因就是你使用了内部类,而在外面这个类的静态main方法里面你创建了内部类的实例所导致的,解决方法比较简单,在class MyThread extends Thread{}
在class前面加个static关键字就可以了static class MyThread extends Thread{}
具体原因的话是你可以这么理解,内部类就相当于外部类的一个属性像下面这种情况class Student{
private String name;
private int age;
....
class Course{
}
public static void main(String[] args){}
}
像上面这种情况,你就可以理解为Course这个类的用法跟name,age这些属性是一样的,只不过他还是一个类罢了。通过这个对比我们知道,在main中不能直接访问name,age等,因此也不能直接new Course这种情况。但是当我们在class前面加了static关键字之后,这种现象就打破了,Course就相当于一个普通的类了,只不过访问规则会有些不同罢了。
看着你还不采纳,我就心里发慌,是不是没说清楚,那我就详细说一下吧。
在内部类Couse里面的方法是可以直接访问外部类的name,age等这些属性的,是如何做到的呢,内部类里面在编译的时候是有一个指向外部类实例的引用的,这就要求要想创建内部类,就必须提前创建好外部类,否则这个指向外部类的实例的引用就没法赋值。根据这个结论,我们可以退出这种形式是可以的class Student{
private String name;
private int age;
....
public Course getCourse(){
return new Course();
}
class Course{
}
public static void main(String[] args){}
}
添加的getCouse()方法里面是可以直接new Course的,这是因为当你能执行一个类的普通方法的时候,这个类的实例就一定创建好了,所以这个时候内部类Course就可以获取到外部类的实例。
而在main方法中,没有创建外部类的实例,所以内部类也就没发直接new出来,但是可以通过先创建外部类,再创建内部类的这种形式。这个时候你的代码要稍微修改一下在创建MyThread的代码修改为如下的形式:TestInterrupt test = new TestInterrupt();
MyThread thread = test.new.MyThread();
这种形式看着很奇怪,但是当理解了原理就可以理解为什么要这么来写。
当然还有一种更简单的方法,那就是把你的内部类剪切到类的外面,就没有上面这些规则了,这个时候的类就相当于一个普通的类。
大体结构是这样的:public class TestInterrupt{
....
}
//一定要放到大括号的外面,否则就是内部类了,要符合上面的要求
class MyThread extends Thread{
....
}