1、fianl修饰一个类:格式:public final class 类名称{//},这个类不能有任何的子类。
2、final修饰一个方法:格式:public final 返回值类型 方法名称(参数列表){//方法体},该方法不能被子类覆盖重写。对于类和方法来说abstract和final不能同时使用,因为矛盾。
3、final修饰一个局部变量:格式:final 数据类型 变量名 = 数值。该变量不能进行改变,一次赋值终身不变。对于基本类型来说不可变就是变量中的数据不变,对于引用类型来说,不可变就是变量中的地址值不可变。
4、final下修饰一个成员变量:格式等同于局部变量,但是由于成员变量具有默认值,所以用了final之后必须手动赋值,要么直接赋值,要么通过构造方法赋值(二者选其一)。
Public
Protected
Default
Private
同一个类
yes
yes
yes
Yes
同包不同类
Yes
yes
yes
no
不同包子类
yes
yes
no
No
不同包非子类
yes
no
no
no
权限修饰符修饰类时:
外部类:public/default
成员内部类:四种都行。
局部内部类:不使用权限修饰符。
1、分类:成员内部类、局部内部类(包含匿名内部类)。
2、成员内部类:
格式:修饰符 class 外部类{修饰符 class 内部类{}}。
内用外,随意访问;外用内需要内部类对象。
使用成员内部类的两种方式:
a.间接方式:在外部类的方法中,使用内部类,然后main只是调用外部类的方法。
b.直接使用:外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
在内部类中如何访问外部类的同名变量:外部类名称.this.外部类成员变量。
3、局部内部类:
格式:修饰符 class 外部类名称{修饰符 返回值类型 外部类方法名(参数列表){ class 内部类名称{}}}
局部内部类只能在包含他的方法中才能使用,出了方法就不能用了。
局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须是有效final的(即局部变量需要保持不变或者添加final修饰符)。原因:new出来的对象在堆内存中,而局部变量是跟着方法走的,在栈内存中,方法运行结束后立刻出栈局部变量跟着消失,但是内部类对象会持续存在,直到垃圾回收。
4、匿名内部类:
格式:父类(接口名称)对象名 = new 父类(接口名称)(){//实现重写所有抽象方法。};
适用场景:当接口的实现类或者父类的子类,只需要使用唯一的一次,那么这种情况下就可以省略该类的定义,改为使用匿名内部类。