内部类简单使用
成员内部类(Inner-class)
- 作为类的成员存在,可以使用访问修饰符来控制访问权限(可使用的修饰符有:abstract, final, public, protected, private, static)
- 成员内部类中不能存在任何static的变量和方法
- 成员内部类是依附于外围类的,所以只有先创建了外围类实例才能够创建内部类实例。
如下就是声明和调用成员内部类的具体代码:
public class Test{
//定义 public 内部类 C 可在外包访问
public class C{
public void run(){
System.out.println("RUNNING...");
}
}
//定义 default 内部类D 可同包访问
class D{
public void run(){
System.out.println("RUNNING...");
}
}
//static 修饰符修饰内部类,此时该内部类不依赖外部类,可直接实例化
static class E{
public void run(){
System.out.println("RUNNING...");
}
}
public static void main(String[] args) {
C c = new Test().new C();
D d = new Test().new D();
E e = new E();
c.run();
d.run();
e.run();
}
}
编译结果如下:
运行结果如下:
局部内部类(MethodLocalInnerClass)
- 类似局部变量,有作用范围的内部类
- 局部内部类只能使用 final 和 abstract 两个修饰符
- 在局部内部类中可以调用 Outclass(外部类) 定义的常量
下面是定义在方法中的局部内部类示例:
public class Test {
final String str1 = "b";
public void testMethod(){
//在方法中定义常量 str
final String str = "a";
//在 testMethod 中定义局部内部类 A
// A 只能在 testMethod 中调用
class A{
public void run(){
//在局部内部类中调用常量 str
System.out.println("RUNNING...\n"+str+"\n"+str1);
}
};
//实例化并调用 A 的 run() 方法
A a = new A();
a.run();
}
public static void main(String[] args) {
new Test().testMethod();
}
}
编译结果如下:
我们可以看到运行结果如下:
匿名内部类(AnonymousInnerClass)
- 没有命名的内部类,一般写在方法或代码块中
- 没有构造器,只能在定义的地方实例化一次
- 不能是静态的
- 一般在实现/重写类和接口方法时才使用
//定义一个 Person 接口
package AnonymousInnerClass;
public interface Person {
public void sayHi();
}
以下是匿名内部类的声明和使用:
package AnonymousInnerClass;
public class Test {
public void meetEN(){
System.out.println("遇见英国朋友了,打招呼");
//实现Person接口 sayHi()方法 并实例化
Person p = new Person(){
@Override
public void sayHi() {
System.out.println("HI");
}
};
p.sayHi();
}
public void meetCH(){
System.out.println("遇见中国朋友了,打招呼");
//实现Person接口 sayHi()方法 并实例化
Person p = new Person(){
@Override
public void sayHi() {
System.out.println("你好");
}
};
p.sayHi();
}
public static void main(String[] args) {
Test test = new Test();
test.meetCH();
test.meetEN();
}
}
编译结果如下:
运行结果如下:
静态嵌套(内部)类
内部类用 static 修饰,参考上第一个例子中。
最后,非静态内部类能调用外部类定义的属性和方法。静态内部类只能调用静态属性和方法(这里的内部类指的是成员内部类)。