一、final关键字概念与四种用法
final关键字代表最终的、不可改变决定
常见四种用法:
1) 修饰一个类
2) 修饰一个方法
3) 修饰一个局部变量
4) 修饰一个成员变量
1、final关键字用来修饰类
格式:
public final class 类名称{
……
}
含义:当前这个类**不能有任何子类。**其中的所有成员方法都无法进行覆盖重写
2、final关键字用来修饰方法
格式:
修饰符 final 返回值类型 方法名称(参数列表){
方法体
}
注意事项:
对于类、方法来说,abstract关键字和final关键字不能同时使用
3、final关键字用来修饰局部变量
格式:
final 数据类型 变量名 = 数值;
只能赋值一次,数值无法改变。可以先创建再赋值。
对于基本数据类型,变量数值大小不变
对于引用数据类型,变量地址值不变
4、final关键字用来修饰成员变量
成员变量具有默认值,所以用了final关键字之后必须手动赋值,不会再给默认值。要么使用直接赋值,要么通过构造方法赋值。
必须保证类当中的所有重载的构造方法都会对final修饰的成员变量赋值
二、四种权限修饰符
作用范围 | public | >protected | >(default) | >private |
---|---|---|---|---|
同一个类(自己) | ✔ | ✔ | ✔ | ✔ |
同一个包(邻居) | ✔ | ✔ | ✔ | – |
不同包子类(儿子) | ✔ | ✔ | – | – |
不同包非子类(陌生人) | ✔ | – | – | – |
三、内部类的概念
汽车和发动机、人和心脏
分类:
1、 成员内部类
2、 局部内部类(包括局部内部类)
1、成员内部类
格式:
修饰符 class 外部类名称{
修饰符 class 内部类名称{
}
}
注意:
内用外,随意访问;外用内,需要内部类对象
使用方法:
1) 间接方式:在外部类的方法中,调用内部类的方法,然后再main中只调用外部类的方法
2) 直接方式:外部类名称.内部类名称 对象名 =new 外部类名称().内部类名称()
内部类的同名变量访问
需要访问的变量 | 访问方式 |
---|---|
局部变量 | num |
内部类变量 | this.num |
外部类变量 | outer.this.num |
2、局部内部类
如果一个类是定义在一个方法内部的,那么就是一个局部内部类。只有当前所属的方法才能使用
定义格式:
修饰符 class 外部类名称{
修饰符 返回值类型 外部类方法名称(参数列表){
class 局部内部类名称{
//……
}
}
}
定义一个类的时候,权限修饰符规则:
1) 外部类:public/(default)
2) 成员内部类:public/protected/(default)/private
3) 局部内部类:什么都不能写
局部内部类的final问题:
如果希望访问所在方法的局部变量,那么这个局部变量必须是有效final的(Java 8+)
原因:
1) new出来的对象在堆内存中
2) 局部变量跟这方法走,在栈内存中
3) 方法运行结束之后立刻出栈,局部变量就会消失
4) new出来的对象在队中持续存在,指导垃圾回收消失
匿名内部类
如果接口的实现类,或者是父类的子类,那么这种情况下就可以省略该类的定义,而改为使用匿名内部类
定义格式:
接口名称 对象名 = new 接口名称(){
//覆盖重写所有抽象方法
}
格式解析:
1) new代表创建对象的动作
2) 接口名称就是出匿名内部类需要实现哪个接口
3) {…} 才是匿名内部类的内容
注意事项:
1) 匿名内部类,在创建对象的时候只能使用唯一一次
2) 匿名内部类和匿名对象不是一回事