在劫

吾生也有涯,而知也无涯 。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

成员内部类

public class NBClass{
	
	public void test(){
		System.out.println("外部类方法");
	}
	
	public static void test2(){
		System.out.println("外部类静态方法");
	}
	class demo{
		//不可定义静态方法
		
		//静态成员需同时有final关键字修饰
		static final String str = "静态成员需同时有final关键字修饰";
		public void classDemo(){
			System.out.println("内部类方法---");
			System.out.println(str);
			
			//内部类访问外部类非static.this.成员方法/属性
			//外部类名.this.外部类成员方法/属性
			NBClass.this.test();
			//可以直接访问外部类静态方法
			test2();
		}
	}
	
	public static void main(String[] args){
		//NBClass nn = new NBClass();
		//外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数);
		//非静态内部类与静态内部类创建实例都需要通过外部类实例创建
		//静态内部类直接调用静态内部类名即可,非静态内部类通过new关键字创建
		NBClass.demo nd = new NBClass(). new demo();
		nd.classDemo();
	}
	
	/**与外部类平级的类继承内部类时,其构造方法中需要传入父类的实例对象。且
	  *在构造方法的第一句调用“外部类实例名.super(内部类参数)”
	  */
}

静态内部类

public class NBClass2{
	
	String NBClass2str = "外部类成员";
	
	static String NBClassstr2 = "外部类静态成员";
	
	//静态
	public static class demo{
		public static String str = "静态内部类可以直接有静态成员";
		public static void demoTest(){
			System.out.println(str);
			System.out.println("静态内部类可以有静态方法");
		}
		public void classDemo(){
			System.out.println("静态内部类");
			
			//不可访问外部类非静态成员/方法
			//System.out.println(NBClass2);
			
			//访问外部类静态成员
			System.out.println(NBClassstr2);
		}
	}
	
	public static void main(String[] args){
		//外部类名.内部类名 实例名 = new 外部类名.内部类名(参数);
		NBClass2.demo nd = new NBClass2.demo();
		nd.classDemo();
		nd.demoTest();
		
	}
	
}

局部内部类

public class NBClass3{
	
    // 局部内部类只能在代码代码块、方法体内和作用域中使用(如创建对象和使用类对象等)
    // 局部内部类访问作用域内的局部变量,该局部变量需要使用final修饰。
    // 可以使用abstract修饰,声明为抽象类。
	public void NBClass3test(){
		System.out.println("外部非静态属性/方法访问格式:外部类名.this.成员方法/属性");
	}
	static String NBClass3str = "外部类成员变量";
	
	public void test(){
		
		class demoTest{
			//不可定义静态方法
			//静态成员需要同时用final修饰
			static final String str = "静态成员需要同时使用final修饰";
			
			public void tDemo(){
				NBClass3.this.NBClass3test();
				System.out.println(str);
				//外部类静态变量直接调用
				System.out.println(NBClass3str);

			}
		}
		//在方法中创建局部内部类实例,通过外部类实例调用方法,运行内部类
		demoTest dt = new demoTest();
		dt.tDemo();
	}
	
	public static void main(String[] args){
		NBClass3 n3 = new NBClass3();
		//NBClass3.demoTest nd = n3.new demoTest();
		//nd.tDemo();
		n3.test();
	}
}
// 与外部类平级的类继承内部类时,其构造方法中需要传入父类的实例对象。
// 且在构造方法的第一句调用“外部类实例名.super(内部类参数)”

匿名内部类

class NBC{
	public void test(){}
}
/*
 *匿名内部类不可以定义静态成员方法,访问外部非static属性/方法:外部类名.this.成员方法/属性
 *外部类访问内部类通过内部类的一个实例访问
*/
public class NBClass4{
	NBC n;
	public NBClass4(NBC n){
		this.n = n;
	}
	
	public void demo(){
		n.test();
	}
	public static void main(String[] args){
		NBClass4 n = new NBClass4(new NBC(){
			public void test(){
				System.out.println("匿名内部类");
			}
		});
		n.demo();
		
		//直接调用匿名内部类方法
		new NBC(){
			public void test(){
				System.out.println("匿名内部类");
			}
		}.test();

	}
}
posted on 2018-02-13 05:51  长嘴大耳怪  阅读(125)  评论(0编辑  收藏  举报