zoukankan      html  css  js  c++  java
  • java基础4:深入理解final关键字

    本文主要介绍了final关键字的使用方法及原理

    具体代码在我的GitHub中可以找到

    https://github.com/h2pl/MyTech

    文章首发于我的个人博客:

    https://h2pl.github.io/2018/04/23/javase4

    final关键字可以修饰类、方法和引用。

    修饰类,该类不能被继承。并且这个类的对象在堆中分配内存后地址不可变。

    修饰方法,方法不能被子类重写。

    修饰引用,引用无法改变,对于基本类型,无法修改值,对于引用,虽然不能修改地址值,但是可以对指向对象的内部进行修改。

    比如char[0] = 'a'。不改变对象内存地址,只改变了值。

    具体看一下下面的栗子:

    final class Fi { int a; final int b = 0; Integer s;

    }
    class Si{
        //一般情况下final修饰的变量一定要被初始化。
        //只有下面这种情况例外,要求该变量必须在构造方法中被初始化。
        //并且不能有空参数的构造方法。
        //这样就可以让每个实例都有一个不同的变量,并且这个变量在每个实例中只会被初始化一次
        //于是这个变量在单个实例里就是常量了。
        final int s ;
        Si(int s) {
            this.s = s;
        }
    }
    class Bi {
        final int a = 1;
        final void go() {
            //final修饰方法无法被继承
        }
    }
    class Ci extends Bi {
        final int a = 1;
    //        void go() {
    //            //final修饰方法无法被继承
    //        }
    }
    final char[]a = {'a'};
    final int[]b = {1};
    

    final修饰类

    @Test
    public void final修饰类() {
        //引用没有被final修饰,所以是可变的。
        //final只修饰了Fi类型,即Fi实例化的对象在堆中内存地址是不可变的。
        //虽然内存地址不可变,但是可以对内部的数据做改变。
        Fi f = new Fi();
        f.a = 1;
        System.out.println(f);
        f.a = 2;
        System.out.println(f);
        //改变实例中的值并不改变内存地址。
    
        Fi ff = f;
        //让引用指向新的Fi对象,原来的f对象由新的引用ff持有。
        //引用的指向改变也不会改变原来对象的地址
        f = new Fi();
        System.out.println(f);
        System.out.println(ff);
    }
    

    final修饰方法

    @Test
    public void final修饰方法() {
        Bi bi = new Bi();
        bi.go();//该方法无法被子类Ci重写
    
    }
    

    final修饰基本数据类型变量和引用

    @Test
    public void final修饰基本类型变量和引用() {
        final int a = 1;
        final int[] b = {1};
        final int[] c = {1};
    //  b = c;报错
        b[0] = 1;
        final String aa = "a";
        final Fi f = new Fi();
        //aa = "b";报错
        // f = null;//报错
        f.a = 1;
    }
    

    关于字符串的内容可以在上一节查看:

    https://blog.csdn.net/a724888/article/details/80042298

    关于抽象类和接口的内容可以在下一节查看:

    https://blog.csdn.net/a724888/article/details/80061047

    更多内容请关注微信公众号【Java技术江湖】

    这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!(关注公众号后回复”资料“即可领取 3T 免费技术学习资源以及我我原创的程序员校招指南、Java学习指南等资源)

    **

  • 相关阅读:
    ECS内网穿透
    设置服务器ssh会话时间
    VScode插件
    Linux拷贝U盘文件(命令行)
    打开IDM下载视频时弹出防火墙阻止下载,解决方案
    如何将jmeter.bat命令文件固定到任务栏
    jmeter安装教程
    安装JDK8.0(JDK1.8) & 环境变量配置 & idea中配置java路径
    教你不用任何第三方软件实现任务栏居中
    [Unity优化]gc03:代码优化
  • 原文地址:https://www.cnblogs.com/xll1025/p/10662369.html
Copyright © 2011-2022 走看看