总结
- public、default(包访问权限)、final可以用在外部类上
- public、default(包访问权限)、private、protected、static、final可以用在内部类上
- 局部内部类上不能有修饰符,或者只能有个final修饰符
- 访问权限用在外部类,表示其他类访问外部类的权限,访问权限用在内部类表示就算其他类可以访问到外部类,还是要经过内部类的权限检查才能访问内部类
- 内部类访问外部类与权限修饰符无关,只与static关键词有关,当没有static表示不是静态内部类,则可以访问外部类的所有变量,当有static表示是静态内部类,只能访问外部类的static静态变量
- 局部内部类由于无法使用static修饰,所以能访问外部类的所有变量
- 内部类中定义变量与权限修饰符无关,只与static关键词有关,没有static修饰的内部类无法定义static静态成员变量,只能定义普通成员变量、final常量,有static修饰的内部类,可以定义所有变量包括普通成员变量、final常量、static静态成员变量
- 局部内部类由于无法使用static修饰,所以无法定义static静态成员变量,只能定义普通成员变量、final常量
- final修饰类表示类无法被继承,修饰方法表示方法无法被重写,修饰变量表示变量值或引用不可更改,值不可更改针对基础类型,引用不可更改针对引用类型,但是对象里面的属性可以更改
类定义
外部类
- 可以看到外部类无法使用private和protected修饰符,以及无法使用static修饰符
- public修饰符表示任何类都可以访问该外部类
- defualt(包访问权限)修饰符即什么都不填,表示只有同包的类可以访问到该外部类
- final修饰符表示该外部类无法被继承
内部类
- 可以看到四种访问权限修饰符都可以用在普通内部类上
- 在内部类上的权限修饰符表示虽然可以访问到外部类Test,但是如果是default权限那只能在同包的内才能访问到内部类,如果是protected如果外包的类想访问外部类Test的内部类,只能先继承外部类才能访问
- static表示该内部类是静态内部类,可以理解为和外部类关系不大,和外部类一起是两个独立的类
- final表示该内部类无法被继承
局部内部类
- 局部内部类的定义在方法内部
- 局部内部类不能使用任何权限修饰符和static修饰符,只能使用final修饰符表示该局部内部类无法被继承
变量访问
内部类
- 可以看到类权限修饰符以及final对内部类访问外部类的变量没有任何影响,需要区分的就是普通内部类和静态内部类
- 普通内部类可以访问外部类的普通成员变量和静态成员变量
- 外部类的final成员变量表示变量无法被更改,更改则报错,外部类的static成员变量的意思是可以在同一个类创建的多个对象中访问到同一个staic成员变量
- final常量无法被更改,所以会报错
- 由于final并没有static的语义,所以在静态内部类无法访问到
局部内部类
- 在上面局部内部类定义时,只有两种选项,一种是没有任何修饰符,一种是final修饰符,其他都报错,所以这里只贴出两者的变量访问
- 可以看出局部内部类可以访问外部类的所有成员变量,包括普通的,静态的和final常量
变量定义
内部类
- 其实权限修饰符和final对定义类的成员变量没有影响,只要把类分为普通内部类和静态内部类就可以了
- 普通内部类不能定义静态变量,而静态内部类可以定义所有变量
局部内部类
- 局部内部类只能定义普通成员变量和final常量
- 由于局部内部类不能是静态的,所以不能定义静态变量