内部类:
1)成员内部类---在外部类的成员位置定义的类
class Outer{ //外部类
private int num = 10 ;
class Inner{//成员内部类//内部类的成员方法
public void show(){
System.out.println(num);
}
}
2)局部内部类---在外部类的成员方法中定义的类
public void method(){
//局部内部类
class Inner{
成员内部类可以存在一些修饰符号:
可以使用private修饰,可以保证数据的安全性;
成员内部类还可以加入static修饰的,
特点: 如果成员内部类都是静态的--成员内部类的这个方法是否静态,无关了,访问外部类成员---->只能是静态的。
非静态的成员内部类中,是不能存在静态方法的
如何直接访问成员内部类的成员方法呢?
将外部类的成员内部类---当做是外部类的成员
直接访问的方式:前提条件:当前的成员内部类是非静态的!
外部类名.内部类名 对象名 = new 外部类对象.new 内部类对象;
局部内部类特点:局部内部类也依然访问外部类的成员变量
面试题:
局部内部类访问局部变量的时候,能访问码?局部变量有什么要求?
jdk7或者jdk7以前,局部变量必须显示加入final修饰,否则访问报错
而jdk8已经jvm优化了,此时这个num2就是常量!---使用反编译工具查看内部类的结构--->发现其实已经加入了final,为什么?
局部变量的生命周期是随着的方法的调用而存在,随着方法的调用结束而消失;而当前这个方法结束之后,num2局部变量也应该就不存在了,但是我们还在使用内部类对象访问它里面这个成员方法,而对象不会立即被GC立即回收,等待空闲的时候回收没有更多引用的对象,所以此时这些变量应该都是常驻内存,使用final定义----->常量!
class Outer4{
private int num = 100 ;
public void method(){
//局部内部类
class Inner4{
public void show(){
//局部变量
int num2 = 20 ;
System.out.println(num2) ;
System.out.println(num) ;
}
}
//在method方法中,访问show
//创建局部内部类对象.show()
Inner4 inner4 = new Inner4() ;
inner4.show() ;
}
}
//测试类
public class InnerClassDemo4 {
public static void main(String[] args) {
//创建外部类对象
Outer4 outer4 = new Outer4() ;
outer4.method() ;
}
}
权限修饰符
权限修饰 | 在同一个包下的当前类中 | 同一个包下的子类中/无关类中 | 在不同包下子类中 | 不同包下的无关类中 |
private | √ | |||
默认修饰符 | √ | √ | ||
protected:受保护的 | √ | √ | √ | |
public | √ | √ | √ | √ |
其他的修饰符:
static:结合自定义去使用
定义自定义常量结合final
public static final 数据类型 变量名 = 初始化数据;
static还可以在工具类中---->工具类中的构造方法私有化,里面的方法都加入static,类名访问
abstract--->修饰类-->抽象类
还可以在成员方法中定义:抽象类中 =--->public abstract 返回值类型 方法名(参数列表) ;
abstract在接口中定义的抽象方法---abstract可以省略
final结合static一块使用的:
public static final 数据类型 变量名 = 初始化数据;