内部类
-
类体中 还有其他的类,该类就叫内部类
-
当一个类的内部,需要有一个完整的结构进行描述,而这个内部的完整结构又只为了外部类提供服务,此时该类可以定义为内部类
-
内部类优点 : 可以访问外部类的所有属性,包括私有化属性
-
内部类分为:
-
成员内部类 可以看做成员变量
-
静态内部类 可以看做静态变量
-
局部内部类 可以看做局部变量
-
匿名内部类 可以看做实参
一、成员内部类
成员内部类,没有static修饰
成员内部类中可以 直接 访问外部类的所有属性
在成员内部类中不能有静态声明
public class OuterClass_01 {
private static String s1 = "私有化静态";
private String s2 = "私有化成员";
// 成员内部类,没有static修饰
// 可以使用权限控制修饰符的
// 成员内部类中可以 直接 访问外部类的所有属性
// 在成员内部类中不能有静态声明
// 内部类编译之后的类名为 : 外部类类名$内部类类名
protected class InnerClass {
// static int a = 1;
// public static void m1(){}
public void m2(){
System.out.println(s1);
System.out.println(s2);
}
}
public static void main(String[] args) {
// 外部类对象
OuterClass_01 outerClass_01 = new OuterClass_01();
// 通过外部类对象创建内部类对象
InnerClass innerClass = outerClass_01.new InnerClass();
innerClass.m2();
}
}
1、InnerClass类定义在 OuterClass_01类的内部,相当于 OuterClass_01类的成员变量的位置,InnerClass类可以使用任意访问修饰符,如:public、private、protected等。
2、InnerClass类中定义的m2()方法可以访问OuterClass_01类中的数据,不受访问控制符的影响。
3、 定义了成员内部类后,必须使用外部类对象来创建内部类对象。而不能直接去 new 一个内部类对象,即:内部类 对象名 = 外部类对象.new 内部类( );
如创建InnerClass的内部类对象:
要先创建外部类对象:OuterClass_01 o = new OuterClass_01(); 创建内部类:InnerClass i = o.new InnerClass();访问InnerClass中的test()方法:i.m2();
二、静态内部类
静态内部类,使用static修饰
可以使用权限控制修饰符的
在静态内部类中 成员也能声明 静态也能声明
在静态内部类中,无法直接访问外部类的成员属性,需要有对象
public class OuterClass_02 {
private static String s1 = "私有化静态";
private String s2 = "私有化成员";
// 静态内部类,使用static修饰
// 可以使用权限控制修饰符的
// 内部类编译之后的类名为 : 外部类类名$内部类类名
// 在静态内部类中 成员也能声明 静态也能声明
// 在静态内部类中,无法直接访问外部类的成员属性,需要有对象才行
public static class InnerClass {
public void m1() {
System.out.println(s1);
// System.out.println(s2);
// 创建外部类对象才能调用 外部类的成员属性
OuterClass_02 o = new OuterClass_02();
System.out.println(o.s2);
}
public static void m2() {
System.out.println(s1);
// System.out.println(s2);
// 创建外部类对象才能调用 外部类的成员属性
OuterClass_02 o = new OuterClass_02();
System.out.println(o.s2);
}
}
public static void main(String[] args) {
OuterClass_02.InnerClass.m2();
// 外部类类名可以省略
InnerClass.m2();
// 创建对象
InnerClass innerClass = new OuterClass_02.InnerClass();
// 外部类类名可以省略
innerClass = new InnerClass();
innerClass.m1();
}
}
三、局部内部类
- 局部内部类 : 方法中的类是局部内部类
- 局部内部类 不能有静态声明 , 并且该类也不允许使用static修饰
- 如果外部方法是成员方法,则该内部类可以直接访问外部类的所有属性
- 如果外部方法是静态方法,则该内部类不能 直接 访问外部类的成员属性,需要有对象
- 局部内部类可以直接访问外部方法的局部变量,但是需要加final修饰 , 从1.8开始 final可以省略
- 也就是说,如果局部内部类用了外部方法的局部变量了,那么该局部变量就等于加final修饰了,值不能更改了
- 内部类类名 :
- 如果多个方法的内部类类名不一致 那就是这样 : 外部类类名$1内部类类名
- 如果内部类类名一致 : 就是这样 : 外部类类名$1内部类类名 , 外部类类名$2内部类类名 , 外部类类名$3内部类类名…
public class OuterClass_03 {
private static String s1 = "私有化静态";
private String s2 = "私有化成员";
public void m1() {
final int i = 100;
class InnerClass {
// static int x=2;
public void m3() {
System.out.println(s1);
System.out.println(s2);
System.out.println(i);
}
}
// 不能在更改
// i=2;
// 局部内部类只能在方法内部使用
// 创建内部类对象
InnerClass innerClass = new InnerClass();
innerClass.m3();
}
public static void m2() {
final int i = 100;
class InnerClass {
public void m3() {
System.out.println(s1);
// 静态方法中的内部类,不能直接访问外部类的成员属性,需要创建外部类对象才行
// System.out.println(s2);
System.out.println(i);
}
}
// 不能在更改
// i=2;
// 局部内部类只能在方法内部使用
// 创建内部类对象
InnerClass innerClass = new InnerClass();
innerClass.m3();
}
public static void main(String[] args) {
OuterClass_03 outerClass_03 = new OuterClass_03();
outerClass_03.m1();
m2();
}
}