Java 内部类

来源:互联网 发布:美拍视频怎么上传淘宝 编辑:程序博客网 时间:2024/04/30 11:29

思考一个问题:为什么要使用内部类?!


什么是内部类?!

——内部类是指在一个外部类的内部再定义一个类。一旦编译成功,就会生成两个.class文件:outer.class和outer$inner.class,因此,所以内部类的成员变量/方法名可以和外部类的相同。



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


一. 静态内部类

用static 修饰的内部类,可以直接访问外部类的静态成员变量和静态方法。

在外部类的方法(不管是静态的还是非静态的)里可以写 Inner inner = new Inner();


二. 成员内部类

可以直接访问外部类的所有方法和变量。

成员内部类里不能有static的方法和变量,在外部类的方法(只能是非静态的)里可以写 Inner inner = new Inner()。注意:成员内部类需要先创建了外部类,才能创建它自己的;这个内部类需要外部内实例化后才可以使用,而静态方法是不需要实例化就可以使用的,因此在外部类的静态方法里是不能写Inner inner = new Inner()

Java编译器在创建内部类对象时,隐式的把其外部类对象的引用也传了进去并一直保存着。这样就使得内部类对象始终可以访问其外部类对象,同时这也是为什么在外部类作用范围之外向要创建内部类对象必须先创建其外部类对象的原因。


写到这里,说下静态内部类和成员内部类的本质区别:静态内部类没有指向外部的引用;在任何非静态内部类中,都不能有静态数据,静态方法或者又一个静态内部类(内部类的嵌套可以不止一层)。不过静态内部类中却可以拥有这一切。


三. 局部内部类

可以定义在一个方法甚至一个代码块之内,如果我们在用一个内部类的时候仅需要创建它的一个对象给外部使用。

不能超出方法或代码块去创建局部内部类的对象,因为这会超出它的作用域。


四 匿名内部类

当你只需要创建一个类的对象而且用不上它的名字时,使用内部类可以使代码看上去简洁清楚。它的语法规则是这样的:
new interfaceName(){......}; 或 new superclassName(){......}; 前者的匿名类实现了一个接口,后者继承了一个类~
需要注意的是:匿名内部类由于没有名字,所以它没有构造函数(但是如果这个匿名内部类继承了一个只含有带参数构造函数的父类,创建它的时候必须带上这些参数,并在实现的过程中使用super关键字调用相应的内容)。

如果你想要初始化它的成员变量,有下面几种方法:
如果是在一个方法的匿名内部类,可以利用这个方法传进你想要的参数,不过记住,这些参数必须被声明为final。
将匿名内部类改造成有名字的局部内部类,这样它就可以拥有构造函数了。
在这个匿名内部类中使用初始化代码块。

P.s:

Java中,如果你自己没有显示的写出一个构造函数,那么在你创建该类的对象的时候,编译器会自动为你创建并调用缺省的构造函数。但是只要你自己写出了带参的构造函数,那么,那个原本可以由编译器自动创建的无参构造函数就永远的消失了。要用?那你得自己再显示的写一个无参构造函数!


0 0
原创粉丝点击