您的位置:首页 > 编程语言 > Java开发

静态方法不能new内部类实例对象

2016-12-28 09:58 246 查看
在学习多线程时,遇到了静态方法中不能new内部类实例对象的情况:

public class TraditionalThreadSynchronized {

public static void main(String[] args) {
//错误。静态方法中不能new内部类的实例对象 内部类能访问外部类实例对象的成员变量
Outputer outputer = new Outputer();
//		new Thread().start();
//		new TraditionalThreadSynchronized().init();
}

class Outputer{
public void output(String name) {
int len = name.length();
for(int i=0;i<len;i++) {
System.out.println(name.charAt(i));
}
System.out.println();
}
}
}


静态方法中不能new内部类的实例对象。why?

内部类最重要的一个特点是它可以直接访问它外部类的成员变量,非静态内部类能够访问外部类成员是因为它持有外部类对象的引用new TraditionalThreadSynchronized(),this,就像子类对象能够访问父类成员是持有父类对象的引用super一样。

成员变量是对象身上的,对象创建完成了,才会为成员变量分配空间,能调用成员变量,意味着一定有了实例对象。

main方法是静态的,它执行的时候可以不创建那个对象,这就产生矛盾。main方法运行时没有任何外部类的实例对象,我们的内部类实例对象创建了又可以访问外部类实例对象的成员变量,外部类的实例对象在哪里呢?所以要想创建内部类的实例对象,必须创建外部类的实例对象。

public static void main(String[] args) {
//错误。静态方法中不能new内部类的实例对象 内部类能访问外部类实例对象的成员变量
//		Outputer outputer = new Outputer();
new Thread().start();
new TraditionalThreadSynchronized().init();
}

class Outputer{
public void output(String name) {
int len = name.length();
for(int i=0;i<len;i++) {
System.out.println(name.charAt(i));
}
System.out.println();
}
}

private void init() {
Outputer outputer = new Outputer();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
outputer.output("zhangxiaoxiang");

}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
outputer.output("lihuoming");

}
}).start();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 内部类