一 静态内部类:
基础语法:
public class A1 {public static class B1 {} // 静态内部类}
静态内部类的特点:
和其他类一样,它只是定义在外部类中的另一个完整的类结构
可以继承自己的想要继承的父类,实现自己想要实现的父接口们,和外部类的父类和父接口无 关
可以在静态内部类中声明属性、方法、构造器等结构,包括静态成员
可以使用abstract
修饰,因此它也可以被其他类继承
可以使用final
修饰,表示不能被继承
编译后有自己的独立的字节码文件,只不过在内部类名前面冠以外部类名和$
符号。
和外部类不同的是,它可以允许四种权限修饰符:
public
,
protected
,缺省,
private
外部类只允许public
或缺省的
只
可以在静态内部类中使用外部类的
静态成员
在静态内部类中不能使用外部类的非静态成员哦
在外部类的外面不需要通过外部类的对象就可以创建静态内部类的对象
如果在内部类中有变量与外部类的静态成员变量同名,可以使用
“
外部类名
."
进行区别
静态内部类中,可以有静态数据、静态方法或者又一个静态内部类
class B1 {static class C1 {// 在静态内部类中才可以定义静态成员private static int age = 123;private String pwd="123456";// 同时允许定义非静态成员static {System.out.println("c1 static...");}public static void pp() {System.out.println("c1 static pp...");}public void ff(){// 同时允许定义非静态成员}static class D1{}class E1{}}}
如何使用静态内部类
public class A1 {public static void main ( String [] args ) {B1 . C1 cc = new B1 . C1 (); // 不需要构建外部类对象,就可以直接创建静态内部类对象,但是是否可见取决于范围限定词B1 . C1 . pp (); // 可以直接访问静态内部类中的静态成员,但是是否可见取决于范围限定词cc . ff ();}}
静态内部类中,也可以有非静态数据、非静态方法或者又一个非静态内部类
静态内部类中,不能访问外部类的非静态成员,这是由
Java
语法中【静态方法不能直接访问非静态
成员】所限定
class B1 {private static String name1 = "yan1";private double salary = 123.456;static class C1 {private static int age = 123;private String pwd = "abc";public static void pp() {System.out.println(age);// 静态方法只能访问静态成员// System.out.println(this.age); 在靜態方法中不允許使用 this 或者super// System.out.println(pwd); 语法报错System.out.println(name1);// 静态内部类中可以直接访问外部类中的静态成员dd();// System.out.println(salary); 语法报错,因为静态方法只能访问静态成员}public void fff() {System.out.println(this.age);System.out.println(pwd);// 当前类中的非静态成员System.out.println(name1);// 不允许使用 B1.this 或者 this. 进行访问 , 不允许使用 B1.this 是因为构建 C1 类对象时没有要求必须构建外部类对象// System.out.println(salary); 报错的原因是构建构建 C1 类对象时没有要求必须构建外部类对象dd();// ee();z 直接访问 ee 方法报错,构建构建 C1 类对象时没有要求必须构建外部类对象}}private void ee() {}private static void dd() {}}
二 局部内部类 :
可以将内部类定义在一个方法或者一个代码块内
public class A1 {private int age = 123 ;public static void main ( String [] args ) {A1 aa = new A1 ();}public void pp () {Date birth = new Date ();// B1 bb=new B1(); 语法错误,要求局部内部类必须先定义后使用class B1 { // 局部内部类,只能在所在的 {} 范围中使用 , 具备内部类的范围限定词和临时变量一致 , 只能添加 final 或者 abstractpublic void ff () {System . out . println ( age );A1 . this . age = 555 ; // 可以直接访问外部类中的成员System . out . println ( birth );// 语法报错,在局部内部类中使用外部的临时变量,则外部临时变量必须是final 的,只是 final 可以省略// birth = new Date(); 针对引用类型修改地址是不允许,但是可以修改属性System . out . println ( "B1...ff()" );}}B1 bb = new B1 ();}}
局部内部类的特点:
和外部类一样,它只是定义在外部类的某个方法中的另一个完整的类结构
可以继承自己的想要继承的父类,实现自己想要实现的父接口们,和外部类的父类和父接口无 关
可以在局部内部类中声明属性、方法、构造器等结构,但不包括静态成员,除非是从父类继承
的或静态常量
可以使用abstract
修饰,因此它也可以被同一个方法的在它后面的其他内部类继承
可以使用final
修饰,表示不能被继承
编译后有自己的独立的字节码文件,只不过在内部类名前面冠以外部类名、$
符号、编号。
和成员内部类不同的是,它前面不能有权限修饰符等
局部内部类如同局部变量一样,有作用域
局部内部类中是否能访问外部类的静态还是非静态的成员,取决于所在的方法
局部内部类中还可以使用所在方法的局部常量,即用
final
声明的局部变量
J DK1.8之后,如果某个局部变量在局部内部类中被使用了,自动加
final
注意:局部内部类需要先定义后使用,不能是先使用后定义