两种内部类web
Java的内部类有两种,一种是静态内部类,另外一种是普通内部类,普通内部类能够得到外部对象的引用,函数
因此在普通内部类可以访问外部对象的成员变量 ,也就可以使用外部类的资源,能够说普通内部类依赖spa
于外部类,普通内部类与外部类是共生共死的,建立普通内部类的对象以前,必须先建立外部类的对象。orm
建立普通内部类的代码以下:对象
Outer o = new Outer();资源
Outer.Inner inner = o.new Inner();get
Outer.Inner inner = new o.Inner(); /* 错误 */it
Outer.Inner inner = new Outer.Inner(); /* 错误 */class
静态内部类没有外部对象的引用,因此它没法得到外部对象的资源,固然好处是,静态内部类无需依赖于变量
外部类,它能够独立于外部对象而存在。建立静态内部类的代码以下:
Outer.Inner inner = new Outer.Inner();
静态类的使用场景
在如下场合可使用静态内部类:
(1) 外部类须要使用内部类,而内部类无需使用外部类的资源
(2) 内部类能够独立外部类建立对象
使用静态内部类的好处是增强了代码的封装性以及提升了代码的可读性,举个例子:
public class Person{
//姓名
private String name;
//家庭
private Home home;
//构造函数设置属性值
public Person(String _name){
name = _name;
}
/* home、name的getter/setter方法省略 */
public static class Home{
//家庭地址
private String address;
//家庭电话
private String tel;
public Home(String _address,String _tel){
address = _address;
tel = _tel;
}
/* address、tel的getter/setter方法省略 */
}
}
把Home放在Person内部,一看便知道Home是Person的一个属性。使用的时候也很方便,以下代码:
public static void main(String[] args) {
Home home = new Person.Home("上海", "021");
Person p1 = new Person("张三");
Person p2 = new Person("李四");
p1.setHome(home);
p2.setHome(home);
}
这里建立一个home对象,p1和p2都使用这个home对象,p1和p2共享同一个home对象。
若是把Home换成普通内部类,状况就不一样了,这时代码变成:
public static void main(String[] args) {
Person p1 = new Person("张三");
Home home = p1.new Home("上海", "021");
p1.setHome(home);
Person p2 = new Person("李四");
p2.setHome(home);
}
这里p1和p2依然共享同一个home对象,但此时home对象和p1是同生共死的,若是p1对象消亡,那么p2就没有
家了,这对p2来讲实在不公平,而若是为p1和p2都建立一个Home对象,又浪费资源。因此在这个例子中,
使用静态内部类比普通内部类要合适。
静态内部类和普通内部类的区别
(1)普通内部类不能声明static的方法和变量
普通内部类不能声明static的方法和变量,注意这里说的是变量,常量(也就是final static修饰的属性)
仍是能够的,而静态内部类形似外部类,没有任何限制。
(2)使用静态内部类,多个外部类的对象能够共享同一个内部类的对象。
使用普通内部类,每一个外部类的对象都有本身的内部类对象,外部对象之间不能共享内部类的对象