文章目录
- 一、内部类的多种形式
- 二、成员内部类
- 三、局部内部类
- 四、匿名内部类
- 五、内部类的调用方式总结
一、内部类的多种形式
- 静态内部类,
static class StaticInnerClass{ };
- 成员内部类,
private class InstanceInnerClass{ };
- 局部内部类, 定义在方法或表达式内部
- 匿名内部类,
(new Thread() { }).start
package top.clearlight.book.efficientcode.insideclass;
public class InnerClassTest1 {
// 成员内部类
private class InstanceInnerClass {
}
// 静态内部类
static class StaticInnerClass {
}
static int a = 1;
public static void main(String[] args) {
// 两个匿名内部类
(new Thread() {}).start();
(new Thread() {}).start();
// 两个方法内部类
class MethodClass {
}
class MethodClass2 {
}
}
}
源出处 : < Easy Coding >
二、成员内部类
将一个类直接定义在类的里面, 作为类中成员, 与属性或方法层次一致
- 内部类既可以访问自身的数据域,也可以访问创建它的外围类对象的数据域(包括私有的)
- 正常类的修饰符可以为
, 成员内部类可以使用不同的修饰符来修饰.public或default
- 内部类与外部类出现相同的变量名,想要引用外部类的域 ->
. (其中 外部类.this.外部成员
表示外围类的引用OuterClass.this
- 内部类中声明的所有静态域必须用
修饰.final
- 内部类不能有static方法
- 源码进行编译后,产生一个字节码:
外部类$内部类.class
三、局部内部类
将一个类定义在方法/块里面,作为方法的内部结构,与临时的局部变量一个层次
- 局部类不能用public或private访问符声明.只能用abstract或final修饰.
- 局部类可以对外部完全隐藏,只有方法之外的代码,都不能访问它. 因此需要在内部类里面完成对象的定义和引用.
- 局部内部类访问外部类的成员使用 :
.外部类名.this.成员名
- 从内部类引用本地变量必须用
修饰或者实际上的最终变量. 内部类访问的局部变量必须事实上为final,一旦赋值就绝对不会改变!final
public void testDemo() {
System.out.println("这是外部类中的方法");
int b = 1;
// 定义一个局部内部类
class LocalClass {
private String name;
int aa = 1;
public void test1() {
aa++;
// 报错,因为调用的本地变量jdk8默认添加了final修饰符不可变
// b++;
}
public void test() {
System.out.println(InnerClassTest.this.name);
}
}
LocalClass lc = new LocalClass();
lc.test();
lc.test1();
}
public void testDemo() {
System.out.println("这是外部类中的方法");
int b = 1;
System.out.println(++b); // 此处做了自增,因此变量b不会默认添加final修饰符
// 定义一个局部内部类
class LocalClass {
private String name;
int aa = 1;
public void test1() {
aa++;
System.out.println(b); // 报错, 因为局部内部类访问方法内的变量,需要使用final修饰.
}
}
LocalClass lc = new LocalClass();
lc.test1();
System.out.println(lc.aa);
}
四、匿名内部类
-
格式 : new 抽象类|接口(构造参数) {
实现的抽象方法 或 重写方法;
};
- 如果抽象类被使用一次,可以使用匿名内部类创建该类实例实现抽象方法,但是多次使用,建议重新定义类!
- 使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
- 匿名内部类中是不能定义构造函数的。
- 匿名内部类中不能存在任何的静态成员变量和静态方法。
- 匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
- 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
3 - 7 引用优秀博客第二篇