⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 innerclass.java

📁 主要是java书上的一些代码
💻 JAVA
字号:
//: InnerClass.java
/*: 总共包含12个类,分别是
	1个接口: AnonymousInner.class
	2个外部类: InnerClass.class、UsingInnerClass.class
	1个静态成员类: InnerClass$StaticInner.class
	1个实例成员类: InnerClass$InstanceInner.class
	5个局部成员类: InnerClass$1$NestInner.class、InnerClass$1$MultiNest.class、
		InnerClass$1$NestInner$MultiNest.class、 InnerClass$1$ScopeInner.class
		InnerClass$2$MultiNest.class
	2个匿名类:InnerClass$1.class、InnerClass$2.class
*/

//package g3ds.joop.ch4;

//此类被编译成 InnerClass.class
public class InnerClass{
	
	/*
	//可以把内部类声明为外部类的静态或非静态成员变量
	static StaticInner si=new StaticInner();
	//对于实例成员类不能直接声明为static
	//static InstanceInner ii1=new InstanceInner();//It is wrong
	InstanceInner ii1=new InstanceInner();//It is ok
	//但先创建外部类实例后可以声明为static
	static InstanceInner ii2=new InnerClass().new InstanceInner();
	*/
	
	//外部类的实例变量
	int varTest=0;
	
	//静态成员类:此类被编译成 InnerClass$StaticInner.class
	static class StaticInner{
		StaticInner(){
			System.out.println("Show me: StaticInner");

		}
	}
	
	//实例成员类:此类被编译成 InnerClass$InstanceInner.class
	class InstanceInner{
		//定义一个与外部类的实例变量同名的内部类变量
		int varTest=5;
		
		void doSomething(){
			//在方法中进一步定义同名的局部变量
			int varTest=10;
			
			System.out.println("Show me: InstanceInner");
			
			System.out.println("同名变量的访问方法测试:");
			
			//varTest:局部变量
			System.out.println("varTest in InstanceInner(): " + varTest);
			
			//this.varTest:同名的内部类变量
			System.out.println("varTest in Inner class: " + this.varTest);
			
			//InnerClass.this.varTest:同名的外部类的变量
			System.out.println("varTest in outer class: " + InnerClass.this.varTest);
		}
	}
	
	//定义一个包含局部成员类的实例方法,并把局部成员类的引用值返回
	public Object nestTest(){
		//在局部成员类中使用的局部变量必须声明为final型
		final int VARTEST=100;
		
		//内部类可以有独立的继承关系或实现自己的接口,
		//此类被编译成 InnerClass$1$NestInner.class
		class NestInner extends InstanceInner implements AnonymousInner{
			NestInner(){
				//此类被编译成 InnerClass$1$MultiNest.class
				class MultiNest{}
				
				System.out.println("Show me: NestInner");
				
				//VARTEST: 声明为final型的局部变量
				System.out.println("calling varible beyond the scope: " + VARTEST);
			}
			
			//此类被编译成 InnerClass$1$NestInner$MultiNest.class
			class MultiNest{}
		}
		
		//返回一个局部成员类对象
		return new NestInner();
	}
	
	public void scopeTest(boolean condition){
		if(condition){
			//在一个语句中定义一个局部成员类,此类被编译成 InnerClass$1$ScopeInner.class
			class ScopeInner{
				ScopeInner(){
					//此类被编译成 InnerClass$2$MultiNest.class
					class MultiNest{}
					System.out.println("Show me: ScopeInner");
				}
			}
			new ScopeInner();
		}
	}
	
	public void anonymousTest(){
		//此处定义一个匿名类,可能被编译成InnerClass$1.class
		new AnonymousInner(){
			//作为实例代码块
			{
				//匿名类中还可以定义匿名类,"="右边可能被编译成InnerClass$2.class
				Object obj=new AnonymousInner(){};
				
				System.out.println("Show me: AnonymousInner");
			}		
		//结尾处的“;”不可少!
		};
	}

	public static void main(String[] args){
		System.out.println("各种形式的内部类测试:");
		
		//创建相应的外部类实例对象
		InnerClass innerClass=new InnerClass();
		
		//静态成员类可以直接实例化
		StaticInner staticInner=new StaticInner();
		
		//非静态成员类需先生成外部类实例
		InstanceInner instanceInner=innerClass.new InstanceInner();
			instanceInner.doSomething();
		innerClass.nestTest();
		innerClass.scopeTest(true);
		innerClass.anonymousTest();
	}
}

//模拟事件监听器,定义一个接口
//此接口被编译成 AnonymousInner.class
interface AnonymousInner{}

//使用其它外部类的内部类的方式,此类被编译成 UsingInnerClass.class
class UsingInnerClass{
	public static void main(String[] args){
		//不能直接以编译出来的类名实例化:下面一行声明方式是错误的 !
		//InnerClass$StaticInner icsi=new InnerClass$StaticInner();
		
		//静态成员类可以直接实例化
		InnerClass.StaticInner icsi=new InnerClass.StaticInner();
		
		//非静态成员类需先生成外部类实例
		InnerClass.InstanceInner icii=new InnerClass().new InstanceInner();
		icii.doSomething();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -