在 Java 中,在一个类中定义的类称为内部类。内部类分为:成员内部类,静态内部类,局部内部类,匿名内部类。
目录
1、成员内部类
成员内部类需要依靠外部类,只有创建了外部类才能创建成员内部类,成员内部类有个隐式引用指向外部类。我们可以类比类的成员属性和方法来分析成员内部类的特性。
成员内部类的定义:
//外部类
public class Outer{
//成员内部类
class Inner{
}
}
成员内部类可以定义的属性和方法
成员内部类可以定义成员变量,成员方法,类常量。不能定义静态变量和方法。
成员内部类对外部类的访问
可以访问外部类的所有变量和方法。
外部类对成员内部类的访问
对于成员内部类中的成员属性和方法必须通过实例对象访问,而对于类常量可以通过类名直接访问。
成员内部类的创建
-
外部类外部创建
静态方法中创建:
外部类.内部类 对象名 = new 外部类().new 内部类();
Outer.Inner in = new Outer().new Inner();
非静态方法中创建:
外部类.内部类 对象名 = new 外部类().new 内部类();
Outer.Inner in = new Outer().new Inner(); -
外部类内部创建
静态方法中创建:
外部类.内部类 对象名 = new 外部类().new 内部类();
Outer.Inner in = new Outer().new Inner();
非静态方法中创建:
内部类 对象名 = new 内部类();
Inner in = new Inner();
代码示例:
//外部类
public class Outer {
String outerProperty = "外部类全局属性";
static String outerStaticProperty = "外部类静态属性";
public void outerMethod(){
Inner inner = new Inner();
System.out.println("访问外部类成员方法");
}
public static void outerStaticMethod(){
Outer.Inner in = new Outer().new Inner();
System.out.println("访问外部类静态方法");
}
//成员内部类
class Inner{
String innerProperty = "内部类全局属性";
static final String constantProperty = "内部类类常量";
public void innerMethod(){
System.out.println( outerStaticProperty );
System.out.println(outerProperty);
outerStaticMethod();
outerMethod();
}
}
public static void main(String[] args) {
Outer.Inner inner = new Outer().new Inner();
inner.innerMethod();
}
}
class OtherClass{
public static void main(String[] args) {
Outer.Inner in = new Outer().new Inner();
}
}
2、静态内部类
静态内部类需要依靠外部类,可以直接创建。我们可以类比类的静态属性和方法来分析静态内部类的特性。
静态内部类的定义:
//外部类
public class Outer{
//静态内部类
static class Inner{
}
}
静态内部类可以定义的属性和方法
因为静态内部类独立于外部类,可以定义正常类的所有属性和方法。
静态内部类访问外部类
对于静态属性和方法可以直接访问,对于非静态属性和方法需要通过外部类实例进行访问。
外部类对静态内部类的访问
对于静态属性和方法,可以通过静态内部类类名直接访问。对于非静态属性和方法,必须通过实例对象访问。
静态内部类的创建
-
外部类外部创建
静态方法中创建:
外部类.静态内部类 对象名 = new 外部类.静态内部类();
Outer.Inner in = new Outer.Inner();
非静态方法中创建:
外部类.静态内部类 对象名 = new 外部类.静态内部类();
Outer.Inner in = new Outer.Inner(); -
外部类内部创建
静态方法中创建:
静态内部类 对象名 = new 静态内部类();
Inner in = new Inner();
非静态方法中创建:
静态内部类 对象名 = new 静态内部类();
Inner in = new Inner();
代码示例:
//外部类
public class Outer {
String outerProperty = "外部类全局属性";
static String outerStaticProperty = "外部类静态属性";
public void outerMethod(){
System.out.println("访问外部类成员方法");
System.out.println(Inner.innerStaticProperty); //访问内部类静态属性
Inner.innerStaticMethod(); //访问内部类静态方法
Inner inner = new Inner(); //创建内部类,访问全局属性和方法
System.out.println(inner.innerProperty);
inner.innerMethod();
}
public static void outerStaticMethod(){
System.out.println("访问外部类静态方法");
}
//静态内部类
static class Inner{
String innerProperty = "静态内部类全局属性";
static final String constantProperty = "静态内部类类常量";
static String innerStaticProperty = "静态内部类静态属性";
public void innerMethod(){
System.out.println(outerStaticProperty); //访问外部类静态属性
outerStaticMethod(); //访问外部类静态方法
Outer outer = new Outer(); //创建外部类,访问全局属性和方法
System.out.println(outer.outerProperty);
outer.outerMethod();
}
public static void innerStaticMethod(){
System.out.println("静态内部类静态方法");
}
}
}
class OtherClass{
public static void main(String[] args) {
//创建内部类
Outer.Inner inner = new Outer.Inner();
}
}
3、局部内部类
局部内部类是定义在一个方法或者作用域中的类。我们可以类比方法中的局部变量来分析局部内部类的特性。
局部内部类的定义:
//外部类
public class Outer {
public void outerMethod(){
//局部内部类
class Inner{
}
}
}
局部内部类可以定义的属性和方法
局部内部类可以定义成员属性,类常量,成员方法。不能定义静态属性和方法。
局部内部类访问外部类
外部类属性和方法可以直接访问。
外部类对局部内部类的访问
局部内部类只能由创建它的方法访问,对创建它的方法以外是与世隔绝的。
局部内部类的创建
只能在局部内部类所在的方法内创建:
局部内部类 类名 = new 局部内部类();
Inner in = new Inner();
其他特性
1)、在访问局部内部类所在方法的形参时,形参必须是final修饰的。JDK8以前必须显示声明final,JDK8以后不用声明,默认为final修饰。
2)、局部内部类不能指定访问修饰符(public、private、protected),不能被static修饰。
代码示例:
//外部类
public class Outer {
String outerProperty = "外部类全局属性";
static String outerStaticProperty = "外部类静态属性";
public void outerMethod(int n){
System.out.println("访问外部类成员方法");
//局部内部类
class Inner{
String innerProperty = "内部类全局属性";
static final String constantProperty = "内部类常量";
public void innerMethod(){
System.out.println(outerStaticProperty); //访问
System.out.println(outerProperty);
outerStaticMethod();
// n = 2; n被final修饰,再次赋值编译报错
}
}
new Inner().innerMethod();
}
public static void outerStaticMethod(){
System.out.println("访问外部类静态方法");
}
public static void main(String[] args) {
Outer o = new Outer();
o.outerMethod(1);
}
}
4、匿名内部类
假如只创建这个类的一个实例,就不必命名了。匿名内部类拥有局部内部类的所有特性,一般在接口中创建一个接口对象或类对象,本质是对接口或者类的继承,然后对继承方法的实现或者重写。
代码示例:
public class Outer {
String outerProperty = "外部类全局属性";
static String outerStaticProperty = "外部类静态属性";
public void outerMethod(){
System.out.println("访问外部类成员方法");
new MyInterface(){
@Override
public void test() {
System.out.println("调用局部内部类的test方法");
}
}.test();
}
public static void outerStaticMethod(){
System.out.println("访问外部类静态方法");
}
public static void main(String[] args) {
Outer o = new Outer();
o.outerMethod();
}
}
interface MyInterface{
void test();
}
——THE END——