Loading

JAVA_SE基础——51.内部类

在Java中,允许在一个类的内部定义类,这样的类称作内部类,这个内部类所在的类称作外部类。根据内部类的位置、修饰符和定义的方式可分为成员内部类、静态内部类、方法(局部内部类)内部类。


内部类:一个类定义在另外一个类的内部,那么该类就称作为内部类。

内部类的class文件名: 外部类$内部类.  好处:便于区分该class文件是属于哪个外部类的。




成员内部类


在类中除了可以定义成员变量、成员方法,还可以定义类,这样的类被称作成员内部类。

成员内部类的访问方式:

方式一:在外部类提供一个方法创建内部类的对象进行访问。code1使用此方式

方式二:在其他类直接创建内部类的对象。code2使用此方式

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


code1

class A{
	int num = 10 ;
	//下面的代码定义了一个成员方法,方法中访问内部类
	public void test(){
		B a = new B() ;
		a.show() ;
	}
	//下面的代码定义了一个成员内部类
	class B{
		public void show(){
			System.out.println("num = "+num) ;
		}
	}
}
class Demo1{

	public static void main(String[] args) {
		A a = new A() ;
		a.test() ;
	}
}
运行结果:

num = 10


code2

class A{
	int num = 10 ;
	
	//下面的代码定义了一个成员内部类
	class B{
		public void show(){
			System.out.println("num = "+num) ;
		}
	}
}
class Demo2{

	public static void main(String[] args) {
		A.B a = new A().new B() ;
		a.show() ;
	}
}
运行结果:

num = 10



内部类的好处:内部类可以直接访问外部类的所有成员。





静态内部类

可以使用static关键字来修饰一个成员内部类,该内部类被称作静态内部类,它可以在不创建外部类对象的情况下被实例化(因为静态内部类随着外部类的加载而加载)。


静态内部类,在其他类创建 的格式:

外部类.内部类  变量名 = new 外部类.内部类();  code3使用此方式

code3

class A{
	//定义静态成员变量
	static int num = 10 ;
	
	//下面的代码定义了一个静态内部类
	static class B{	
		public void show(){
			System.out.println("num = "+num) ;
		}
	}
}
class Demo3{

	public static void main(String[] args) {
		A.B a = new A.B() ;
		a.show() ;
	}
}

运行结果:

num = 10


P.S.

在静态内部类中只能访问外部类的静态方法,如果将外部类的静态成员num的static关键字去掉,将会报错

在静态内部类中可以定义静态的成员,而在非静态的内部类中不允许定义静态的成员。(因为内部类中的静态成员随着内部类的加载而加载,但是这样违背了当初sun公司定义的:静态的成员数据是不需要对象存在才能访问。





方法内部类(局部内部类)

方法内部类是指在成员方法中定义的类,它只能在当前方法中被使用。

局部内部类: 在一个类 的方法内部定义另外一个类,那么另外一个类就称作为局部内部类。
局部内部类要注意的细节:

局部内部类可以访问外部类的成员变量、code4实现了此句话


如果局部 内部类访问了一个局部变量,那么该局部变量必须使用final修饰(java1.8以下 局部变量没有用final修饰会报错)、  (我的java1.8  试验过了,没有final也不会报错,估计优化了吧。。微笑



code4

class A{
	int num = 10 ;
	
	//下面的代码定义了一个成员内部类
	public void test(){
		
		class B{
			public void show(){
				System.out.println("num = "+num) ;
			}
		}
	//由于B类是方法内部类,因此只能在方法中创建该类的实例对象并调用show()方法、
		B b = new B() ;
		b.show() ; 
	}

}
class Demo4{

	public static void main(String[] args) {
		A a = new A() ;
		a.test() ;
	}
}
运行结果:

num = 10


在A类的test()方法中定义了一个内部类B ,由于B类是方法的内部类,因此程序只能在方法中创建该类的实例对象并调用show()方法。 从结果上看,方法内部类可以访问外部类的成员变量。

看完本章节觉得对自己都帮助的,写个评论顶顶大笑

posted @ 2015-11-06 23:08  脚本叔叔  阅读(235)  评论(0编辑  收藏  举报