首页 > 编程语言 >Java-关于final关键字不得不知道的几大特点

Java-关于final关键字不得不知道的几大特点

时间:2024-11-11 17:16:29浏览次数:3  
标签:Java 变量 int 局部变量 final 关键字 public 赋值

final-最终的

修饰类:表示类不可被继承
修饰方法:表示方法不可被子类覆盖,但是可以重载
修饰变量:表示变量一旦被赋值就不可以更改它的值。

(1)修饰成员变量
如果final修饰的是类变量,只能在静态初始化块中指定初始值或者声明该类变量时指定初始值。
如果final修饰的是成员变量,可以在非静态初始化块、声明该变量或者构造器中执行初始值。
(2)修饰局部变量
系统不会为局部变量进行初始化,局部变量必须由程序员显示初始化。因此使用final修饰局部变量时, 即可以在定义时指定默认值(后面的代码不能对变量再赋值),也可以不指定默认值,而在后面的代码中对final变量赋初值(仅一次)

public class FinalVar {
    final static int a = 0;//再声明的时候就需要赋值 或者静态代码块赋值 
    /**
    static{
        a = 0;
    }
    */
    final int b = 0;//再声明的时候就需要赋值 或者代码块中赋值   或者构造器赋值
        /*{
        b = 0;
    }*/
    public static void main(String[] args) {
        final int localA;   //局部变量只声明没有初始化,不会报错,与final无关。 
        localA = 0;//在使用之前一定要赋值
        //localA = 1;  但是不允许第二次赋值
    }
}

(3)修饰基本类型数据和引用类型数据
如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;
如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。但是引用的值是可变的。

public class FinalReferenceTest{ 
    public static void main(){ 
        final int[] iArr={1,2,3,4}; 
        iArr[2]=-3;//合法 
        iArr=null;//非法,对iArr不能重新赋值

        final Person p = new Person(25); 
        p.setAge(24);//合法 
        p=null;//非法
    }
}

为什么局部内部类和匿名内部类只能访问局部final变量?
编译之后会生成两个class文件,Test.class Test1.class

public class Test {
    public static void main(String[] args)  {
    }
    //局部final变量a,b
    public void test(final int b) {//jdk8在这里做了优化, 不用写,语法糖,但实际上也是有的,也不能修改
        final int a = 10;
        //匿名内部类
        new Thread(){
            public void run() {
                System.out.println(a);
                System.out.println(b);
            };
        }.start();
    }
}
class OutClass { 
        private int age = 12;

        public void outPrint(final int x) { 
                class InClass { 
                        public void InPrint() { 
                                System.out.println(x); 
                                System.out.println(age);
                                                        }
                }
                new InClass().InPrint(); 
        }
}

首先需要知道的一点是: 内部类和外部类是处于同一个级别的,内部类不会因为定义在方法中就会随着方法的执行完毕就被销毁。
这里就会产生问题:当外部类的方法结束时,局部变量就会被销毁了,但是内部类对象可能还存在(只有没有人再引用它时,才会死亡)。这里就出现了一个矛盾:内部类对象访问了一个不存在的变量。为了解决这个问题,就将局部变量复制了一份作为内部类的成员变量,这样当局部变量死亡后,内部类仍可以访问它,实际访问的是局部变量的"copy"。这样就好像延长了局部变量的生命周期
将局部变量复制为内部类的成员变量时,必须保证这两个变量是一样的,也就是如果我们在内部类中修改了成员变量,方法中的局部变量也得跟着改变,怎么解决问题呢?
就将局部变量设置为final,对它初始化后,我就不让你再去修改这个变量,就保证了内部类的成员变量和方法的局部变量的一致性。这实际上也是一种妥协。使得局部变量与内部类内建立的拷贝保持一致。

标签:Java,变量,int,局部变量,final,关键字,public,赋值
From: https://blog.csdn.net/weixin_43834477/article/details/143690905

相关文章

  • Java流程控制-break,continue,goto
    breakcontinuegotobreakbreak在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句(break语句也在switch语句中使用)代码:publicstaticvoidmain(String[]args){inti=0;while(i<100){i++;......
  • Java概述与第一个程序,及JDK环境的安装
    开始学习java,我们需要对java有一个基本的了解,以及设置相关的开发环境一.为什么选择JavaJava有一个显著的优势就是用途广泛服务器后端:银行,证券交易平台,电子商务后台....Android应用:安卓手机,各种移动设备,智能家电…大数据技术:Hadoop以及其他大数据处理技术都是......
  • Java集合基础——针对实习面试
    目录Java集合基础什么是Java集合?说说List,Set,Queue,Map的区别?说说List?说说Set?说说Map?说说Queue?为什么要用集合?如何选用集合?Java集合基础什么是Java集合?Java集合(JavaCollections)是Java中提供的一种容器,用于存储和管理一组对象。Java集合框架(JavaCollections......
  • 【老白学 Java】人以群分,物以类聚
    人以群分,物以类聚文章来源:《HeadFirstJava》修炼感悟。上一章,Guess想必让师兄们留下「深刻」印象,也见到了OOP应有的样子。本章老白继续学习Java变量相关的知识,感兴趣的师兄可以继续往下看。一、变量的分类Java的数据类型可分为两大类:基本数据类型引用数据类......
  • visualvm远程连接Docker容器中部署的java应用并监控
    visualvm远程连接Docker容器中部署的java应用前言jdk1.8中自带了,java11中需要单独下载下载地址visualvm下载地址简介java虚拟机监控,故障排查及性能分析工具。网络配置局域网与docker内网打通,请参考:办公网络与Docker内网网络互通服务于网络服务名称节点IPj......
  • 将学习型索引ALEX的cmake项目在虚拟机上用java运行
    一、环境配置虚拟机:Centos7gcc-v:11.2.1java-version:1.8.0 二、ALEX实现步骤   1、安装c++输入命令sudoapt-getinstallg++出错sudo:apt-get:找不到命令原因:Centos7中用yum命令下载再次输入命令sudoyuminstallg++再次报错已加载插件:fastestmirror,l......
  • Java 日期 API
    JDK8之前日期与时间戳之间的转换publicclassTest{publicstaticvoidmain(String[]args){Datedate=newDate();System.out.println("date="+date);//date=SunSep2614:48:52CST2021Datedate1=newDate(1632638970000L......
  • Java爬虫:京东商品SKU信息的“偷心盗贼”
    在这个信息爆炸的时代,数据就像是藏在深山里的宝藏,等待着我们这些“数据探险家”去发掘。今天,我们要化身为一名“偷心盗贼”,用Java这把锋利的“剑”,精准地从京东的海洋中窃取商品的SKU信息。别担心,我们这是合法的“盗窃”,因为我们只是在学习如何用代码与网页对话。环境准备:装......
  • Java爬虫精准获得JD商品SKU信息
    在数字化时代,数据的价值日益凸显,尤其是在电商领域。通过爬虫技术,我们可以从网站中提取有价值的信息,用于市场分析、价格监控等。Java作为一种成熟且功能强大的编程语言,拥有丰富的库支持,使其成为编写爬虫的理想选择。本文将详细介绍如何使用Java编写爬虫,以精准获取京东(JD)商品的详......
  • 2024年Java后端开发最全面试攻略,不管你工作几年,都得看看
    互联网公司的面试,从形式上说,一般分为2~3轮技术面+1轮HR面,不过某些公司没有HR面试。在技术面试中,面试官一般会就你所应聘的岗位进行相关知识的考察,也叫基础知识和业务逻辑面试,只要回答的不是特别差,面试官通常会继续跟你聊聊项目,这个时候就开始了项目面试。也就是说,技......