根据内部类定义的位置及关键字一共分为以下四种内部类:成员内部类/普通内部类,静态内部类,方法内部类/局部内部类,匿名内部类。
1. 成员内部类 – 类比普通属性或方法
定义:直接定义在外部类之中,不加static修饰符。
-
在成员内部类中要注意的点:
① 成员内部类中不能存在任何static的变量和方法。
②成员内部类的创建需要依赖外部类对象,先有外部类对象才有成员内部类对象。 -
在外部类的外部创建成员内部类语法:
外部类.内部类 内部类名称 = new 外部类().new 内部类();
Outer.Inner in = new Outer().new Inner();
*** 成员内部类限制:
成员内部类(类比普通属性或方法)可以访问外部类的静态属性,成员内部类不能拥有静态域(静态方法或属性)。
class Outer {
private String a = "Hello World!";
//成员内部类
class Inner {
public void print() {
System.out.println(a);
}
}
public void fun() {
Inner in = new Inner();
in.print();
}
}
public class NeiBuLei {
public static void main(String[] args) {
//在外部类外部创建成员内部类对象
Outer.Inner in = new Outer().new Inner();
in.print();
}
}
2. 静态内部类 – 类比静态属性或方法
定义:直接定义在外部类之中,加static修饰符。
-
在静态内部类中要注意的点:
① 静态内部类不可以使用任何外围类的非static成员变量和方法,而成员内部类则都可以。
②静态内部类的创建不需要依赖于外部类对象,可以直接创建。 -
在外部类外部创建静态内部类语法:
外部类.内部类 内部类名称 = new 外部类.内部类();
Outer.Inner in = new Outer.Inner();
*** 静态内部类限制:
静态内部类能拥有普通域,但是不能访问外部类的普通域。
class Outer {
private static String a = "Hello world!";
//静态内部类
static class Inner {
public void print() {
System.out.println(a);
}
}
public void fun() {
Inner in = new Inner();
in.print();
}
}
public class JingTaiNeiBuLei {
public static void main(String[] args) {
//在外部类外部产生静态内部类对象
Outer.Inner in = new Outer.Inner();
in.print();
}
}
3. 方法内部类 – 类比方法中的一个局部变量
定义:直接定义在外部类的方法中,不加任何修饰符,与普通内部类基本类似,只是作用域不同,方法内部类只能在该方法中被使用,出了该方法就会失效。
- 在方法内部类中要注意的点:
①方法中若存在内部类,方法形参使用隐式的final声明(JDK8之前使用显示声明),因此方法内部类只能使用方法形参而不能修改方法形参。
②方法内部类不能使用任何权限修饰符(public,private,protected)。
class Outer {
private int num;
public void fun(int data) {
//方法内部类
class Inner {
public void print() {
num++;
System.out.println(num);
System.out.println(data);
}
}
new Inner().print();
}
}
public class FangFaNeiBuLei {
public static void main(String[] args) {
Outer out = new Outer();
out.fun(20);
}
}
4. 匿名内部类
定义:等同于方法内部类,就是没有名字而已,但是匿名内部类必须继承一个抽象类或者实现一个接口,除此以外和方法内部类完全一致,也可以引用方法形参,此形参也必须声明为final
。
- 在匿名内部类中要注意的点:
① 匿名内部类不能使用任何权限修饰符。
② 匿名内部类中不能存在任何静态成员或方法。
③ 匿名内部类是没有构造方法的,因为它没有类名。
//抽象类
abstract class Person {
public abstract void print();
//在抽象类内部提供了一个实现好的子类
public static Person getInstance() {
//匿名内部类,等同于 class 无名 extends Person
return new Person() {
public void print() {}
};
}
}
public class NiMingNeiBuLei {
public static void main(String[] args) {
Person per = Person.getInstance();
per.print();
}
}