内部类(innerclasses)
一般情况,我们把类定义成独立的单元。有些情况下,我们把一个类放在另一个类的内部定义,称为内部类。
内部类的作用:
1.内部类提供了更好的封装。只能让外部类直接访问,不允许同一个包中的其他类直接访问。
内部类的使用场合:
<span style="font-family:SimSun;font-size:18px;">public class Computer {
String type ;
class Cpu{ //定义内部类Cpu
String type;
int size;
void show(){
System.out.println("显示尺寸大小");
}
}
public static void main(String[] args) {
Computer.Cpu c = new Computer().new Cpu(); //非静态内部类创建内部类对象
}
}</span>
内部类的分类:
1.成员内部类
(可以使用private、protected、public任意进行修饰。)
成员内部类编译后内部类的文件名:外部类$内部类.class
a)、非静态内部类(外部类里使用非静态内部类和平时使用其他类没什么不同)
2.非静态内部类可以使用外部类的成员,但是外部类不能直接访问非静态内部类成员
3.非静态内部类不能有静态方法、静态属性、静态初始化块;
4.静态成员不能访问飞静态成员:外部类的静态方法、静态代码快不能非静态内部类,包括不能使用非静态内部类定义变量、创建实例。
5.成员变量访问要点:
a)、内部类的方法的局部变量:变量名
b)、内部类属性:this.变量名
访问Cpu中的type属性:this.type
c)、外部类属性:外部类类名.this.变量名(当外部类属性与内部类属性名字一样时,如果名字不相同可以直接访问)
访问Computer中的type属性:Computer.this.type
6.内部类访问:a)、外部类定义内部类:new InnerClass()
b)、外部类以外的地方使用非静态内部类
Outer.inner varname = new OuterObject.new innerObject();
如:Computer.Cpu c = new Computer().new Cpu();
b)、静态内部类
static class ClassName{
//类体
}
2.使用要点:
a)、当一个静态内部类对象存在,并不一定存在对应的外部类对象。因此,静态内部类的实例方法不能直接访问外部类的实例方法。
b)、静态内部类看错外部类的一个静态成员。因此,外部类的方法中可以通过:静态内部类.名字 访问静态内部类 的静态成员。通过new 静态内部类() 访问静态内部类的实例
c)、在外部类的外面穿件静态内部类:
Face.TestStaticInner aInner = new Face.TestStaticInner();
<span style="font-family:SimSun;font-size:18px;">/**
* 测试静态内部类
* @author Dell
*
*/
public class Computer {
String type ;
static class Cpu{
String type;
int size;
void show(){
System.out.println("显示尺寸大小");
}
}
public static void main(String[] args) {
Computer.Cpu c = new Computer.Cpu(); //
c.show();
}
}</span>
2.匿名内部类
记得JAVA中抽象类是不能创建实例的,但是在代码中总会看见new 抽象类名的用法。如果不太清楚这个原因,需要了解匿名抽象类这个概念。
匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。Java中内部匿名类用的最多的地方也许就是在Frame中加入Listener了吧。
适合哪种只需要使用一次的类。比如:键盘监听操作等等。语法:new 父类构造器(实参列表) 实现接口(){
//匿名内部类类体
}
import java.awt.*;
import java.awt.event.*;
public class QFrame extends Frame {
public QFrame() {
this.setTitle(\"my application\");
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
});
this.setBounds(10,10,200,200);
}
}
上面的new语句,建立一个 WindowAdapter对象 ,后面一个 {} 表示这个括号中的操作作用于这个默认的对象。打开 WindowAdapter 的代码可以发现,它是一个抽象类。它是对 WindowListener 接口的一个实现。
更多有关匿名内部类的请看:http://www.cnblogs.com/pepcod/archive/2013/02/16/2937374.html
3.局部内部类
定义在方法内部。作用域仅限于本方法。
class Person {
private int age;
public void run(){
class Run{
public Run(){
System.out.println("局部内部类!");
}
}
}
}
类Run就是局部内部类。
注意:
(1)局部内部类的定义和局部变量的定义一样,不用加限定符,其作用域是为本代码块。
(2)它可以访问外部类的实例变量,也可以访问外部类的局部变量,但是外部类的局部变量必须为final的。
(3)可以配合interface来使用来做到强制性的弱耦合。
(4)在另外的一个类的中不可以创建局部内部类的实例,只能在局部内部类中来创建。
本文参考:http://www.cnblogs.com/nerxious/archive/2013/01/24/2875649.html
http://android.blog.51cto.com/268543/384844/
http://andy136566.iteye.com/blog/1061951
http://blog.youkuaiyun.com/sysusr/article/details/6212323