成员内部类:
是一种可以访问外部类的私有成员或属性,可以再内部类中直接存取其所在的类的私有成员变量。其语法格式如下:
权限修饰符 class 外部类名{
权限修饰符 class 内部类名{
}
}
成员内部类的特点:
1.内部类作为外部类的成员,可以访问外部类的私有成员或属性。(即使将外部类声明为 private ,但是
对于处于其内部的内部类还是可见的。)
2.成员内部类不能定义静态成员,只能定义对象成员,但是可以使用 static final 关键字定义常量。
3.创建成员内部类的实例时,外部类的实例必须已经存在。换句话说,就是内部类的实例一定要绑定在外部类的实例上,如果从外部类中初始化一个内部类对象,那么内部类对象就会绑定在外部类对象上。
4.当内部类和外部类有同名的成员时,内部类可以通过使用 this 关键字来访问外部类成员,语法如下:
外部类名.this.变量名
建立内部类对象时应注意:
在外部类的内部可以直接使用 Inner s = new Inner(); (因为外部类知道inner是哪个类,所以可以生成对象);而在外部类的外部,要生成(new)一个内部类对象,需要首先建立一个外部类对象(外部类可用),然后再生成一个内部类对象。在其他类中创建内部类对象的语法如下:
Outer outer = new Outer();//先建立外部类对象
Outer.Inner inner = outer.new Inner();//再建立一个该此外部类对象的内部类对象
Outer.Inner inner1 = new Outer().new Inner();//直接使用new Outer().new Inner() 方法创建一个Inner对象
例如:
public class Outer{
private String a = "a";
private class Inner{
private String a = "b";
public void test(){
System.out.println(this.a); //内部类成员
System.out.println(Outer.this.a); //外部类成员
}
}
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
Outer.Inner inner1 = new Outer().new Inner();
inner.test();
inner1.test();
}
}
局部内部类:
也称方法内部类,被定义在方法的内部的类。有特点如下:
1.局部内部类与局部变量一样,不能使用访问控制修饰符(public、private 和 protected)和 static 修饰符修饰。且局部内部类中还可以包含内部类,同样不能被上述访问控制修饰符和 static 修饰符修饰。
2.局部内部类只在当前方法中有效。
3.局部内部类中不能定义 static 成员。
举例如下:
public class Test{
String a = "a";
public void function(){
String b = "b";
final String c = "c";
class Inner{
String a1 = a;
String b1 = b;
String c1 = c;
}
Inner i = new Inner();
System.out.println(i.a1);
System.out.println(i.b1);
System.out.println(i.c1);
}
public static void main(String[] args) {
Test t1 = new Test();
t1.function();
}
}
匿名内部类:
匿名类是只在创建对象时才会编写类体的一种写法。抽象类或者接口本不可以直接创建对象,可以使用匿名内部类方法直接创建,用来创建一个接口或者抽象类的对象。匿名类的特点是“现用现写”,语法如下:
new 父类/父接口(){
子类实现的内容
}; //最后一个大括号之后要加分号
abstract class People{
String sex;
public abstract void jump();
}
public class Test{
public static void main(String[] args) {
People tom = new People(){
public void jump(){
System.out.println("JUMP!");
}
}; //匿名类后面要记得加分号,否则报错
tom.sex = "male";
tom.jump();
}
}
代码输出结果为:
JUMP!
注意事项:
1.匿名类不能使用构造方法进行初始化。
2.匿名类中不可以使用 static 关键字来定义静态成员。
部分摘抄自 明日科技《Java从入门到精通》