java基础十五-final关键字

先甩出结论,记住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;
}
``
|  |  |
|--|--|
|  |  |
`

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值