Java内部类总结之成员内部类和静态内部类

        内部类分四种:成员内部类静态内部类局部内部类匿名内部类

        其中,成员内部类静态内部类可以类比。

  • 相同点成员内部类和静态内部类都是定义在一个类中,并且与该类的成员变量是同一级别的内部类。
  • 不同点:1)成员内部类是非静态类,而静态内部类是静态类。2)在Outer类内部的方法中调用时,成员内部类必须生成对象才能调用其中的方法,而静态内部类则可以直接通过‘类名.方法名’的方式调用。3)在Outer类外部进行调用时,成员内部类必须生成两个对象后才能调用其中的方法:Outer的对象和成员内部类的对象,而静态内部类则只须生成静态内部类的对象就可以调用其中的方法。
        成员内部类测试代码如下:

class MemberInner
{
	private int a = 4;
	
	/**
	 * 定义一个成员内部类(非静态类),注意:要想调用非静态类里的方法,则必须生成这个类的对象,
	 * 与静态类不一样,成员内部类必须要生成对象才能调用其中的方法。
	 * @author Rao
	 *
	 */
	public class Inner2
	{
		private int a = 5;
		
		public void doSomething()
		{
			//就近原则,输出:5
			System.out.println(a);
			
			//这里的this仍表示内部类,故调用的仍是内部类的成员变量,输出:5
			System.out.println(this.a);
			
			//MemberInner.this表示对外部类的引用
			System.out.println(MemberInner.this.a);
			System.out.println("--------------------------------");
		}
	}
	
	//生成成员内部类对象调用其中的方法
	public void method()
	{
		//实际上同main中的一样,也可写成:new Inner2();
		Inner2 inner = this.new Inner2();
		inner.doSomething();
	}
}

public class MemberInnerClassTest
{
	public static void main(String[] args)
	{
		//内部类也要生成对象,也可写成:(new MemberInner()).new Inner2()
		MemberInner.Inner2 inner = new MemberInner().new Inner2();
		
		//这两句同上面的一句是一个意思
		MemberInner member = new MemberInner();
		MemberInner.Inner2 inner2 = member.new Inner2();
		
		inner2.doSomething();
		inner.doSomething();
		member.method();
	}
}

        静态内部类测试代码如下:
class StaticInner
{
	private static int a = 4;
	private int b = 3;
	
	/**
	 * 定义一个静态内部类,静态的只能访问静态的(包括方法和成员变量),非静态的什么都可以访问。
	 * 注意:静态的成员变量、方法、内部类都可以通过outClass.innerClass的方式调用,
	 * 故静态内部类不需要生成外部类对象就可以调用,而只需直接生成静态内部类的对象即可调用。
	 * @author Rao
	 *
	 */
	public static class Inner
	{
		public void test()
		{
			System.out.println(a);
//			System.out.println(b);//不能访问非静态
		}
		
		public static void test2()
		{
			System.out.println("hello world");
		}
	}
	
	//直接通过类名调用,不用生成对象
	public void method()
	{
		Inner.test2();
	}
}

public class StaticInnerClassTest
{
	public static void main(String[] args)
	{
		//生成内部类对象的方法
		StaticInner.Inner inner = new StaticInner.Inner();
		
		inner.test();
	}
}



参考文献:圣思园视频

你可能感兴趣的:(java,String,测试,Class)