【初学者常见问题】从外到内,从内到外(内部类剖析1)

多久以前打的草稿,内部类是一个很有用的东东。

什么是外部类和内部类? 这样写有神马作用? 用一个类就搞定的事情为什么还要嵌套在里面? 源码里(特别是集合中)大量使用了内部类。比如在LinkedList源码中就有诸如Node节点的内部类。

内部的作用和外部类相互独立,相互促进,内部类也可以实现继承,也可以被覆盖。

这些是我进行外部类和内部类(非静态成员类和静态成员类)测试的原因。

/*
 * 嵌套类是指定义在一个类内部的类,比如TestOuter内部有一个嵌套类Inner1
 * 嵌套类分为静态成员类(static member class),非静态成员类(nonstatic member class)
 * 匿名类(anonymous class),局部类(local class)
 * 通过以下程序能够了解非静态成员类的权限相对于静态成员类要高些
 * 非静态成员类能够访问静态成员类中的成员和方法
 * 静态成员类(Inner1)和非静态成员类(Inner2)能够访问外围雷(TestOuter)的所有成员(包括私有成员)和方法。
 * 嵌套类存在的目的应该是为它的外围类(enclosing class)——TestOuter提供服务
 *
 */
public class TestOuter{

	private static String outer1 = "outer1";

	private String outer2 = "outer2";

	public String getOuter2(){
		return outer2;
	}

	public void outMethod1(){
		System.out.println("This is TestOuter...");
		//外部类是能够实例化静态成员类Inner1,并调用其方法
		Inner1 inOne = new Inner1();
		inOne.inMethod();
		//inOne.testInner2Method(); 静态成员类不能访问非静态成员类方法(静态或非静态)
		inOne.outMethod();        //测试静态成员类访问外部类机制

		//外部类是能够实例化非晶态成员类Inner2,并调用其方法
		Inner2 inTwo = new Inner2();
		inTwo.inMethod();
		//inTwo.inMethod2();        不能在非静态成员类中声明静态方法
		inTwo.testInner1Method();
		inTwo.outMethod();        //测试非静态成员类访问外部类机制


    }
	private static class Inner1{
		private static String inner1 = "inner1";
		private String inner2 = "inner2";
		public String getInner2(){
			return inner2;
		}

		public void outMethod(){
			TestOuter too = new TestOuter();
			//静态成员类能够访问外围类的静态变量(或非静态变量)和方法
			System.out.println(TestOuter.outer1);
			System.out.println(too.getOuter2());
			//静态成员类能够访问外围类的私有成员变量
			System.out.println("访问外围类的成员:"+too.outer1);
		}

		public void inMethod(){
			System.out.println("This is Inner1 Method()...");
		}

		public static void inMethod2(){
			System.out.println("This is static Inner Method()....");
		}

		/* 静态成员内部类不能引用非静态成员内部类的方法(静态方法或非静态)
		public void testInner2Method(){
			Inner2 inner2 = new Inner2();
			inner2.inMethod();
			Inner2.inMethod2();
		}
		*/
	}
	private class Inner2{
		//private static String inner1 = "inner1";	非静态成员类不能声明为静态成员变量
		private String inner2 = "inner2";

		public void inMethod(){
			System.out.println("This is Inner2 Method()...");
		}

		/* 不能再非静态成员类中声明静态方法
		public static void inMethod2(){
			System.out.println("This is Inner2 static Method()...");
		}
		*/

		//非静态成员类能够访问外围类的静态变量(或非静态变量)和方法
		public void outMethod(){
			TestOuter too2 = new TestOuter();
			System.out.println(TestOuter.outer1);
			System.out.println(too2.getOuter2());
		}

		//测试Inner2能不能访问Inner1的方法
		public void testInner1Method(){
			Inner1 inner1 = new Inner1();
			//访问静态成员类的方法
			inner1.inMethod();
			//访问静态成员类的静态方法
			Inner1.inMethod2();

			//能够在非静态成员类中访问静态成员类中的静态变量inner1
			System.out.println(Inner1.inner1);
			//能够在非静态成员类中访问静态成员类中的变量inner2
			System.out.println(inner1.getInner2());
		}
	}
	public static void main(String args[]){
		TestOuter to = new TestOuter();
		to.outMethod1();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值