在静态方法中为啥不能创建内部类的实例对象

package cn.itcast.thread;
/**
 * 静态方法中不能创建内部类的实例对象
 * @author wjc
 *
 */

public class ThreadDemo1 {//ThreadDemo1为外部类

	/**
	 	为啥在静态方法中不能创建内部类的实例对象
		内部类的一个重要特点就是能够访问外部类的成员
		而外部类的成员只有在外部类对象创建时才会存在
		而在静态方法中可以不用创建外部类的实例对象
		那么静态方法内部类的实例对象在没有外部类的实例对象情况下又如何外部类的成员
		这就发生矛盾!!
	 */
	public static void main(String[] args) {
		final Print print  = new Print();//创建内部类示例对象
		new Thread( new Runnable() {
			public void run() {
				while(true){
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					print.show("张三1111");
				}
				
			}
		}).start();
		
	}
	
	class Print{

		public void show(String name){
			System.out.println(name);
		}
	}
	
}

解决方法(1)

package cn.itcast.thread;
/**
 * 静态方法中不能创建内部类的实例对象
 * @author wjc
 *
 */

public class ThreadDemo1 {//ThreadDemo1为外部类

	/**
	  	要想创建内部类的实例对象必须要有外部类的实例对象
	  	这样当内部类创建示例对象时,内部类会找调用它方法的对象
	  	而调用方法的对象正是外部类的实例。
	  	所以在创建内部类的实例对象前已经拥有外部类的实例对象
	 */
	
	
	
	public static void main(String[] args) {
		
		new ThreadDemo1().init();
	}
	
	
	public void init(){
		final Print print  = new Print();//创建内部类示例对象
		new Thread( new Runnable() {
			public void run() {
				while(true){
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					print.show("张三1111");
				}
				
			}
		}).start();
	}
	
	class Print{

		public void show(String name){
			System.out.println(name);
		}
	}
	
}

 

解决方法(2) 

package cn.itcast.thread;
/**
 * 静态方法中不能创建内部类的实例对象
 * @author wjc
 *
 */
 
public class ThreadDemo1 {//ThreadDemo1为外部类
 
	/**
	 	static修饰内部类,这样可以不依赖与外部类实例对象而被实例化,
	 	而通常的内部类需要外部类实例化后才能实例化。静态内部类不能与外部类有相同的类名,
	 	不能访问外部类的成员变量,只能访问外部类的static成员变量和static方法(包括外部类的私有)。
	 	实例内部类格式:Outer.Inner name = new Outer.Innner();
	 */
	public static void main(String[] args) {
		final Print print  = new Print();//实例static内部类
		new Thread( new Runnable() {
			public void run() {
				while(true){
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					print.show("张三1111");
				}
				
			}
		}).start();
		
	}
	
	static class Print{
 
		public void show(String name){
			System.out.println(name);
		}
	}
	
}

 

你可能感兴趣的:(java,JAVA学习)