欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

内部类

程序员文章站 2022-07-12 11:55:31
...

内部类概念:

其实就是类定义到了另一个类的内部。

内置类,嵌套类。

 

内部类可以直接访问外部类中的成员。

外部类要想访问内部类,只能建立内部类的对象才可以访问内部类中的成员。

 

什么时候定义内部类呢?

 

当对事物进行描述的时候,在描述过程中该事物的内部还有具体的事物,

这是这个具体的事物可以通过内部类来进行描述。

 

内部类定义是可以存在外部类的任意位置上。

1,可以存放在成员位置上,

可以被成员修饰符修饰。

public 默认权限  

通常都会将内部类私有化。通过对外提供公有的方式对其方式,以便于控制

static

当内部类被static修饰时,该内部类就出现访问局限性。只能访问外部类中静态成员。

注意:当内部类中定义了静态成员时,该内部类必须被静态修饰。

 

2,可以存放在局部位置上。

内部类如果访问局部中的变量,改变量必须被final修饰。

也就是说,内部类只能访问被final修饰的局部变量。

/**
 * 成员内部类
 *
 */
class Outer
{
	private  int num = 4;
	private static int age = 22;
	
	class Inner
	{
		void show()
		{
			System.out.println("inner中的num="+num);//内部类里可以直接访问父类的成员变量  4
		}
	}

	static class Inner2
	{
		static String name="lala";//当内部类有静态成员时,内部类必须是静态的,否则编译失败。
		
		private  void show()
		{
			System.out.println("inner2中的age="+age);//若内部类被static修饰,则内部类只能引用外部类的静态成员。此处不能访问num
		}
		void getShow(){
			show();
		}
		
		 static void showOfStatic()
		{
			System.out.println("inner2中的静态方法:age="+age);//若内部类被static修饰,则内部类只能引用外部类的静态成员。此处不能访问num
		}
		
	}
	
	class Inner3
	{
		int num=5;
		void show()
		{
			int num=6;
			System.out.println("inner3中的num="+num);//内部类里可以直接访问父类的成员变量  6
			System.out.println("inner3中的num="+this.num);//内部类里访问内部类本身的成员变量  5
			System.out.println("inner3中的num="+Outer.this.num);//内部类里访问内部类本身的成员变量 4
		}
	}
	
	

	
	public void method()
	{
		Inner in = new Inner();
		in.show();
	}
}

/**
 * 局部内部类
 */
class outer2{
	int num=99;
	public void function() {
//		final int num=88;
		class Inner{
//			int num=77;
			private void show() {
				//如果删除 int num=77;编译器就会报异常。说是int num=88;需要为final类型
				//如果再删除final num=88;则程序执行的输出结果为99;
				System.out.println("局部内部类"+num);
			}
		}
	Inner inner=new Inner();
	inner.show();
	}
}

public class InnerClassVisitFeature {
	public static void main(String[] args) 
	{
		//在外部其他类中,直接访问内部类的格式。
		//通常编程的时候不会遇到这种情况,通常内部类都是作为私有的private修饰,然后提供一个供外部调用的操作内部类的方法
		Outer.Inner in = new Outer().new Inner();
		in.show();
		
		//内部类中重新定义了外部类中已经定义的成员变量时。获取不同情况下的值。
		Outer.Inner3 in3 = new Outer().new Inner3();
		in3.show();
		
		//当内部类被静态修饰,要访问内部类中的非静态方法格式:
		Outer.Inner2 in2 =new Outer.Inner2();
		in2.getShow();//在这里不能直接访问内部类的私有方法show,只能使用借助内部类的其他想歪暴露的方法来访问show方法。
		
		//当内部类被静态修饰,要访问内部类中的静态方法两种格式:
		Outer.Inner2.showOfStatic();
//		in2.showOfStatic();
	/////////////////////////////////////////////////////////////////////////////
		outer2 out2=new outer2();
		out2.function();
	}
}

 上面InnerClassVisitFeature类中main方法执行的结果为:

inner中的num=4

inner3中的num=6

inner3中的num=5

inner3中的num=4

inner2中的age=22

inner2中的静态方法:age=22

局部内部类99