静态方法中使用内部类不能通过new
2017-01-31 21:48
197 查看
首先来看一下错误代码,
这里Outputer是一个内部类,在静态main方法中new一个Outputer对象是错误的。
原因:
首先,内部类是可以直接访问外部类成员变量的。(new一个对象首先在堆内存中创建一个对象,然后在栈内存中创建成员变量。)所以必须创建外部类对象,然而,main方法是静态的,不用创建对象即可访问外部类的成员变量。 —–内部类要有外部类这个对象,然而main方法没有创建这个外部类对象所以导致上面代码无法执行。
内部类调用外部类的成员变量时,是通过编译器自动为内部类添加一个成员变量, 这个成员变量的类型和外部类的类型相同, 这个成员变量就是指向外部类对象的引用,然后通过这个引用来调用外部类成员变量。
改写
通过TraditionalThreadSynchronized对象,调用init()方法,这时才能使内部类创建成功。
编译器自动为内部类的构造方法添加一个参数, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为新增的成员变量赋值;
public class TraditionalThreadSynchronized { public static void main(String[] args) { Outputer outputer = new Outputer(); new Thread(new Runnable() { @Override public void run() { while (true){ try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } outputer.output("yinxin"); } } }).start(); } } class Outputer{ public void output(String name){ int len = name.length(); synchronized(Outputer.class){ for (int i = 0; i < len; i++){ System.out.print(name.charAt(i)); } System.out.println(); } } } }
这里Outputer是一个内部类,在静态main方法中new一个Outputer对象是错误的。
原因:
首先,内部类是可以直接访问外部类成员变量的。(new一个对象首先在堆内存中创建一个对象,然后在栈内存中创建成员变量。)所以必须创建外部类对象,然而,main方法是静态的,不用创建对象即可访问外部类的成员变量。 —–内部类要有外部类这个对象,然而main方法没有创建这个外部类对象所以导致上面代码无法执行。
内部类调用外部类的成员变量时,是通过编译器自动为内部类添加一个成员变量, 这个成员变量的类型和外部类的类型相同, 这个成员变量就是指向外部类对象的引用,然后通过这个引用来调用外部类成员变量。
改写
public class TraditionalThreadSynchronized { public void init(){ Outputer outputer = new Outputer(); new Thread(new Runnable() { @Override public void run() { while (true){ try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } outputer.output("yinxin"); } } }).start(); } public static void main(String[] args) { new TraditionalThreadSynchronized().init(); } } class Outputer{ public void output(String name){ int len = name.length(); synchronized(Outputer.class){ for (int i = 0; i < len; i++){ System.out.print(name.charAt(i)); } System.out.println(); } } } }
通过TraditionalThreadSynchronized对象,调用init()方法,这时才能使内部类创建成功。
编译器自动为内部类的构造方法添加一个参数, 参数的类型是外部类的类型, 在构造方法内部使用这个参数为新增的成员变量赋值;
相关文章推荐
- A类只能通过B类的方法实例化,不能直接使用new,即内部类~代码一段
- 静态方法不能new内部类实例对象
- [对象和类型]8.C#构造函数,怎样用静态方法解决私有构造函数造成的不能new的问题?
- 调用静态方法是不能用this关键字的。直接使用类名就可以了
- 静态方法中不能创建内部类的实例
- 内部类访问外部类的变量必须是final吗,java静态方法中不能引用非静态变量,静态方法中不能创建内部类的实例
- 通过扩大IE使用内存,解决skyline在IE下模型不能加载的方法
- CSDN上的一个问题贴(关于内部类在外部类静态方法中使用问题)
- django-admin.py startproject new不能使用解决方法
- 动态的内部类不能在静态方法中直接声明对象
- java中静态方法中为什么不能使用this、super和直接调用非静态方法
- 只让用户通过域名访问网站,使用IP不能访问的方法
- java学习笔记(四)----对象、数组作为参数传递,静态变量、静态方法的使用,内部类,使用文档注释
- 外部类的静态方法内不能实例化内部类的对象
- java静态方法,静态初始化块及静态变量的声明和初始化不能使用泛型的原因
- 在struts2.1.2中不能使用ognl访问静态方法的原因
- 静态方法中不能使用非静态变量
- 在.NET中编辑器在用伪静态后不能正常使用的解决方法
- 静态方法中为什么不能使用this
- 静态方法使用动态内部类的错误