---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ---------------------
内部类是指在一个外部类的内部再定义一个类,内部类是作为外部类的成员而存在的,其依附于外部类。
为什么需要内部类呢?每个内部类可以独立的继承继承一个接口的实现,当然也可以实现不同的接口,所以无论外部类是否已经继承该接口的实现,对于内部类没有影响。所以相当于一个类继承了某接口的实现,在其内部又有个内部类继承了另外一个接口的实现,这算多继承的一种实现吧。
为什么可以把它看做多继承实现呢?因为内部类一般定义出来只是给外部那个类使用的,基本上没有谁会定义一个内部类还想把他给外部类之外的类使用,要使用的话也会非常麻烦的。
内部类分为成员内部类,局部内部类,静态内部类和匿名内部类
成员内部类:顾名思义就是外部类的一个成员,可以有不同的访问修饰符,在使用局部内部类的时候,需要有一个外部类的对象供其依附:
public class Test {
private String str = "22222";
public static void main(String[] args) {
new Test().f();
}
public void f() {
new Inner().f();//默认this.new Inner().f();
}
private class Inner {
public void f() {
System.out.println("ssss" + str);
}
}
}
成员内部类中不可以定义静态成员,这大概是因为成员内部类要实例化必须先有外部类对象,如果要实例化多个内部类对象,还公用一个静态成员,那么将静态成员分给外部类的普通成员更合理吧。
2、局部内部类
在方法中定义的内部类,与局部变量类似,局部内部类不能有访问修饰符,但它可以访问当前代码块的常量(用final修饰的局部变量),和外围类的所有成员
public class Test {
private String str = "22222";
public static void main(String[] args) {
new Test().g(1);
}
public void g(final int i){
class Inner_1{
public void f(){
System.out.println(str + i);
}
}
new Inner_1().f();
}
}
3、静态内部类,和静态成员一样理解,普通的内部类对象隐含地保存了一个引用只想创建它的外部类对象,而静态内部类就不需要有外部类对象存在,直接用外部类名就可以创建了,在静态内部类中不能访问外部类的非静态成员。
4、匿名内部类,这种类多用在事件处理上
在使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法。
·匿名内部类不能定义任何静态成员、方法和类。
·匿名内部类不能是public,protected,private,static。
·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
(粘自网络)
如果匿名类的几类有带参数的构造函数,是可以写new ClassA(参数){}因为参数不在匿名类内部直接被使用
java中的枚举用的就是内部类来实现:
package exercise;
public class TestTraffic {
public static void main(String[] args) {
TrafficLamp lamp = TrafficLamp.GREEN;
System.out.println(lamp + ":" +lamp.getTime());
System.out.println(lamp.nextLamp() + ":" + lamp.nextLamp().getTime());
}
public enum TrafficLamp {
GREEN(45) {
public TrafficLamp nextLamp() {
return YELLOW;
}
},//相当于匿名类,并实现了抽象方法
RED(30) {
public TrafficLamp nextLamp() {
return GREEN;
}
},
YELLOW(5) {
public TrafficLamp nextLamp() {
return GREEN;
}
};//定义3个枚举变量,相当于通过TrafficLamp来实例三个交通灯颜色,这段代码必须放到最前边
private final int time;
//定义TrafficLamp的构造方法
private TrafficLamp(int time) {
this.time = time;
}
//定义一个抽象方法,每次实例该枚举的时候,都必须实现该方法
public abstract TrafficLamp nextLamp();
public int getTime() {
return time;
}
}
}
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net