final关键字
- 1.final修饰的类无法继承
- 2.final修饰的方法无法重写
- 3.final修饰的变量只能赋一次值
- 4.final修饰引用只能赋一次值
- 5.final修饰实例变量
- 6.final修饰的实例变量一般和static联合使用,称为常量
先甩出结论,记住345即可
final
1.final 是java语言的一个关键字
2.final 表示:
最终的,不可变的
3.final可以修饰变量以及方法,还有类等
4.final 修饰的变量?
final修饰的变量一旦赋值,不能重新赋值
5.final修饰的方法?
final修饰的方法无法被覆盖,被重写
6.final修饰的类?
final修饰的类无法被继承
7.(提示)final控制不了能不能调用的问题,final管的是啥?
final修饰的表示最后的,不能变的,不能改的。
1.final修饰的类无法继承
final class A{//A没有子孙
}
//B类继承A类,相当于对A类的功能进行扩展,如果你不希望别人对A类型进行扩展。
//你可以给A类加final关键字,这样的话A类就无法继承了
//错误:无法从最终A进行继承
class B extends A{
}
打印结果:
2.final修饰的方法无法重写
class C{
public final void doSome(){
System.out.println("C's doSome...");
}
}
class D extends C{
public void doSome(){
System.out.println("D's doSome...");
}
}
打印结果:
3.final修饰的变量只能赋一次值
public class FinalTest01 {
public static void main(String[] args) {
//局部变量
int i = 100;
//重新赋值
i = 200;
//局部变量
final int k = 100;
//重新赋值
//错误:无法为最终变量k分配值
k = 300;
}
}
打印结果:
4.final修饰引用只能赋一次值
/*
final修饰的变量,如果这个变量是一个"引用"会怎样?
(重点)final修饰的变量只能赋一次值(万变不离其中)
"引用"是不是一个变量呢?是
final修饰的引用:
该引用只能指向1个对象,并且它只能永远指向该对象
并且在该方法执行过程中,该引用指向该对象之后,该对象不会被垃圾回收器回收.
直到当前方法结束,才会释放空间.
引用p存放的是指向new Person()的内存地址,如0X1111,加了final不可变
再次赋值则报错:无法为最终变量p分配值
修改p内存地址指向的对象age属性,只是改变堆内存中的数据,未修改p存放的值,可以正常操作
*/
public interface FinalTest02 {
public static void main(String[] args) {
Person p1 = new Person(30);
System.out.println(p1.age);
//------------------------------
//代码不管怎么变化,p也是一个变量.(只不过这里他有一个特殊的名字:引用)
final Person p = new Person(30);
//错误:无法为最终变量p分配值
//p = new Person(30);
p.age = 40;
System.out.println(p.age);
/*
final int i = 10;
//不允许的
i = 20;
*/
}
}
class Person{
int age;
public Person() {
}
public Person(int age) {
this.age = age;
}
}
打印结果:
内存图描述:
5.final修饰实例变量
/*
final修饰的实例变量呢?
final修饰的实例变量只能赋值一次
实例变量在什么时候赋值(初始化)?
构造方法执行的过程中赋值(new的时候赋值)
结论:
final修饰的实例变量,系统不管赋默认值,要求程序员必须手动赋值.
这个手动赋值,在变量后面赋值可以,在构造方法中赋值也可以
*/
public class FinalTest03 {
public static void main(String[] args) {
User u = new User(11.0);
User u1 = new User(0.0);
}
}
class User{
//实例变量
//编译器报错
//final int age;
//实例变量
//可以,因为程序员手动赋值了
final double height = 1.8;
//以下这一堆代码全部联合起来,weight变量也是赋值了1次
//实例变量
final double weight;
//构造方法
/*
public User(){
this.weight = 80;//只要我赶在系统赋默认值之前赋值就行
//this.weight = 81;//这个可以吗?不行!!
}
*/
public User(double d){
//这也是赋值了,没有采用系统默认值
this.weight = d;
}
}
6.final修饰的实例变量一般和static联合使用,称为常量
/*
上一个例子的结论:
final修饰的实例变量,必须手动赋值
<重点>final修饰的变量,只能赋值一次
final修饰的实例变量一般添加static修饰.
终极结论:
static final联合修饰的变量称为"常量",
常量名建议全部大写,每个单词之间采用下划线衔接
常量:实际上常量和静态变量一样,区别在于:
常量的值不能变.
常量和静态变量,都是存储在方法区,并且都是类加载时初始化
常量一般都是公共的:public的
*/
public class FinalTest04 {
public static void main(String[] args) {
System.out.println(Chinese.COUNTRY);
}
}
class Chinese{
//身份证号,每个人都不一样,对象级别
String idCard;
//姓名,对象不同姓名不同
String name;
//国家名是一个固定值,"中国"
//实例变量在堆中,一个对象一份,100个对象100份
//实例变量既然使用final修饰了,说明该实例变量值不会随着对象的变化而变化
//该实例变量前面应该添加:static关键字,变为静态的,存储在方法区
static final String COUNTRY = "中国";
//i永远都是10,创建100个对象,i也是10.
//i是10是永远不会发生改变的,既然这样的,没必要声明为实例变量,最好是静态的,节省内存空间
final int i =10;
}
class MyMath{
//数学中的π是永远不会变的
public static final double PI = 3.1415926;
}
``
| | |
|--|--|
| | |
`