在Java中,容许在一个类的内部定义类,这样的类称做内部类,这个内部类所在的类称做外部类。根据内部类的位置、修饰符和定义的方式可分为成员内部类、静态内部类、方法(局部内部类)内部类。html
内部类:一个类定义在另一个类的内部,那么该类就称做为内部类。
内部类的class文件名: 外部类$内部类. 好处:便于区分该class文件是属于哪一个外部类的。java
成员内部类优化
在类中除了能够定义成员变量、成员方法,还能够定义类,这样的类被称做成员内部类。spa
成员内部类的访问方式:
方式一:在外部类提供一个方法建立内部类的对象进行访问。code1使用此方式
方式二:在其余类直接建立内部类的对象。code2使用此方式code
格式:外部类.内部类 变量名 = new 外部类().new 内部类();
htm
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 = 10it
code2class
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 = 10test
内部类的好处:内部类能够直接访问外部类的全部成员。
静态内部类
可使用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()方法。 从结果上看,方法内部类能够访问外部类的成员变量。
看完本章节以为对本身都帮助的,写个评论顶顶