Java内部类分为4个部分进行阐述,分别为概览、成员内部类、局部内部类和匿名内部类。


在本文中是Java内部类的成员内部类,主要讲述成员内部类的访问方式和一些细节。

  • 成员内部类

  1. 成员内部类的访问方式

    1. 非static成员内部类

    2. static成员内部类

    1. 外部类提供一个方法创建内部类的对象

    2. 直接创建内部类的对象

  2. 成员内部类要注意的细节



1、成员内部类的访问方式


成员内部类的访问方式,也可以理解为它的创建方式,主要分为两种:第一种是由外部类提供一个方法,用来创建内部类的对象,第二种方法直接创建内部类的对象。


1.1、在外部类提供一个方法创建内部类的对象


在下面的代码当中,由OuterClass提供一个getInnerClassInstance方法,用来创建InnerClass内部类的对象。

示例代码:

OuterClass outter = new OuterClass();
OuterClass.InnerClass inner = outter.getInnerClassInstance();

完整代码:

package com.rk.innerclass;

class OuterClass
{
	class InnerClass
	{
		void print()
		{
			System.out.println("我是InnerClass内部类的print方法");
		}
	}
	
	public InnerClass getInnerClassInstance()
	{
		InnerClass instance = new InnerClass();
		return instance;
	}
}

public class MemberInnerClass
{
	public static void main(String[] args)
	{
		OuterClass outter = new OuterClass();
		OuterClass.InnerClass inner = outter.getInnerClassInstance();
		inner.print();		
	}
}



1.2、直接创建成员内部类的对象


直接创建成员内部类的对象,可以分为两种情况:一种是当成员内部类被static修饰时,另一种是不被static修饰时。


1.2.1、当成员内部类不被static修饰时


当成员内部类不被static修饰时,其创建格式为:

外部类.内部类  变量名 = new 外部类().new 内部类();

示例代码:

OuterClass outter = new OuterClass();
OuterClass.InnerClass inner = outter.new InnerClass();

完整代码:

package com.rk.innerclass;

class OuterClass
{
	class InnerClass
	{
		void print()
		{
			System.out.println("我是InnerClass内部类的print方法");
		}
	}
}

public class MemberInnerClass
{
	public static void main(String[] args)
	{
		OuterClass outter = new OuterClass();
		OuterClass.InnerClass inner = outter.new InnerClass();
		inner.print();		
	}
}




1.2.2、当成员内部类被static修饰时


当成员内部类被static修饰时,其创建格式为:

外部类.内部类  变量名 = new 外部类.内部类();

示例代码:

OuterClass.InnerClass inner = new OuterClass.InnerClass();

完整代码:

package com.rk.innerclass;

class OuterClass
{
	static class InnerClass
	{
		void print()
		{
			System.out.println("我是InnerClass内部类的print方法");
		}
	}
}

public class MemberInnerClass
{
	public static void main(String[] args)
	{
		OuterClass.InnerClass inner = new OuterClass.InnerClass();
		inner.print();
	}
}



2、成员内部类要注意的细节



2.1、细节一:当"成员内部类"与"外部类"存在相同名字的成员时


如果外部类与内部类存在同名的成员变量时,在内部类中默认情况下是访问内部类的成员变量。可以通过"外部类.this.成员变量名" 指定访问外部类的成员。


可以通过“外部类.this”访问外部类的同名“成员变量”

示例代码:

OuterClass.this.x

完整代码:

package com.rk.innerclass;

class OuterClass
{
	private int x = 100;
	class InnerClass
	{
		private int x = 200;
		void print()
		{
			System.out.println("OuterClass类的x的值为:" + OuterClass.this.x);//100
			System.out.println("InnerClass类的x的值为:" + this.x);//200
		}
	}
}

public class MemberInnerClass
{
	public static void main(String[] args)
	{
		OuterClass outter = new OuterClass();
		OuterClass.InnerClass inner = outter.new InnerClass();
		inner.print();
	}
}


可以通过“外部类.this”访问外部类的同名“成员方法”

示例代码:

OuterClass.this.test();

完整代码:

package com.rk.innerclass;

class OuterClass
{
	void test()
	{
		System.out.println("这是OuterClass类的test方法");
	}
	
	class InnerClass
	{
		void print()
		{
			OuterClass.this.test();
			test();
		}
		
		void test()
		{
			System.out.println("这是InnerClass类的test方法");
		}
	}
}

public class MemberInnerClass
{
	public static void main(String[] args)
	{
		OuterClass outter = new OuterClass();
		OuterClass.InnerClass inner = outter.new InnerClass();
		inner.print();
	}
}



2.2、细节二:当成员内部类被private修饰时


    私有(private)的成员内部类只能在外部类提供一个方法创建内部类的对象进行访问,不能在其他类创建对象了。


package com.rk.innerclass;

interface IMath
{
	void add(int a,int b);
}

class OuterClass
{	
	void calculate(int a,int b)
	{
		InnerClass inner = new InnerClass();
		inner.add(a,b);
	}
	
	InnerClass getInnerClassInstance()
	{
		InnerClass instance = new InnerClass();
		return instance;
	}
	
	private class InnerClass implements IMath
	{
		@Override
		public void add(int a, int b)
		{
			System.out.println(a + " + " + b + " = " + (a+b));			
		}
	}
}

public class MemberInnerClass
{
	public static void main(String[] args)
	{
		OuterClass outter = new OuterClass();
		outter.calculate(1,2);
		IMath inner = outter.getInnerClassInstance();
		inner.add(1,2);
	}
}



2.3、细节三:当成员内部类包含有static成员时


    成员内部类一旦出现了静态的成员,那么该类也必须使用static修饰。

class OuterClass
{	
	static class InnerClass
	{
		static double PI = 3.14;
	}
}

在上述代码中,PI被声明为static,那么也要求将InnerClass声明为static。


3、思维导图

wKiom1cPcVHRErbPAAC1lMLBRUI355.png