【java基础】static和final关键字的作用及其用法详解

news2024/9/25 9:37:44

文章目录

  • static关键字
    • 静态字段
    • 静态方法
    • 静态代码块
    • 静态内部类
  • final关键字
    • final字段
    • final方法
    • final类

static关键字

这个关键字表示静态的,用于不同地方意思不一样

静态字段

如果我们将其作用到字段上,那么该字段为类所拥有,我们使用new关键字创建出来的对象会共享这个这段。使用static标记字段之后我们也可以使用 类名.静态字段名的方式直接进行访问

public class StaticAndFinal {

    public static String tip = "我是静态字段";

    public static void main(String[] args) {
        System.out.println(StaticAndFinal.tip);
    }
}

静态方法

类似的,我们也可以将static作用到方法上,作用到方法上就表示该方法是为类所拥有,可以使用 类名.方法名进行调用。可以认为静态方法就是一个没有this参数的方法。注意在静态方法里面不能够访问类的实例字段和方法,换言只就只能够访问静态字段和静态方法

public class StaticAndFinal {

    public static String tip = "我是静态字段";
    private String tip1 = "我是普通字段";

    public static int add(int a, int b) {
        System.out.println(tip); // OK
        System.out.println(tip1); // Error
        return a + b;
    }

    public static void main(String[] args) {
        int add = StaticAndFinal.add(1, 2);
    }
}

上面代码在静态方法中就访问了tip1这个实例字段,这时IDEA就会提示如下
在这里插入图片描述
如果强制编译,那么程序就会出现以下错误
在这里插入图片描述

静态代码块

静态代码块在类加载的时候只会执行一次,里面常常执行对静态字段的初始化工作。(注意:不需要创建该类的对象,只要用到该类,那么静态代码块就会执行且只执行一次)。如果是通过new第一次访问对象,那么静态代码块会比代码块还要构造器先执行

public class StaticAndFinal {
    public static int count;

    static {
        count++;
    }

    public static void main(String[] args) {
        System.out.println(StaticAndFinal.count);
    }
}

上面代码输出为1

静态内部类

静态内部类就是使用static修饰的一个内部类

class Animal{
    static class Cat{
    
    }
}

上面的Cat就是一个静态内部类
对于静态内部类,我们可以不用创建外部的实例,而直接创建内部静态内部类

    public static void main(String[] args) {
        Animal.Cat cat = new Animal.Cat();
    }

对于外部类和静态内部类可以相互访问静态变量和方法,静态内部类可以直接通过字段名或者方法名访问外部类中的static字段、方法,如果出现命名冲突,那么就需要使用外部类名.静态字段(方法)进行访问。对于外部访问内部的静态字段、方法,那么必须使用静态内部类.静态字段(方法)进行访问

class Animal {
    public static String tip = "外部静态字段";
    //访问静态内部类静态变量
    public int age = Cat.age;

    static class Cat {
        public String name;
        public static int age;

        public void t() {
            // 访问外部类静态变量
            System.out.println(tip);
        }
    }
}

上面代码t方法中的tip也可以写为 Animal.tip。对于静态内部类,我们简单一点理解就是静态内部类和外部类没有关系即可,都只能互相访问静态字段和方法,静态内部类的创建并不需要外部类的实例化。

final关键字

final字段

使用final修饰的字段就表示只能初始化一次,后面不能再被修改。
对于局部变量使用final修饰,我们可以后序再进行赋值

    public static void main(String[] args) {
        final int a;
        a = 1;
        // a = 2; // 再次赋值会抱错
        System.out.println(a);
    }

对于类的字段使用final修饰,必须在定义的时候就进行赋值

class A{
    public final double PI;
}

上面代码没有赋值,IDEA提示以下信息
在这里插入图片描述
对于final字段的初始化,下面3种写法都可以

class A{
	// 直接赋值
    public final double PI = 3.14;
}
class A {
	// 代码块初始化
    public final double PI;
    {
        PI = 3.14;
    }
}
class A {
	// 构造器初始化,我们需要在所有声明的构造器中都进行初始化
    public final double PI;

    A(double pi) {
        PI = pi;
    }

    public A() {
        PI = 1;
    }
}

final方法

使用final修饰的方法表示不能被重写

class A {
    public final void show() {
        System.out.println("A---show");
    }
}

class B extends A {
    @Override
    public final void show() {
        System.out.println("B---show");
    }
}

上面的B继承了A,并且重写了A类中的show方法,但是A类中show方法使用final修饰,这时,编译器提示以下信息
在这里插入图片描述

final类

final类就表示不能够被继承

final class A {
    
}

class B extends A {

}

上面代码IDEA提示如下
在这里插入图片描述

需要说明的是,如果一个类声明为final,那么里面的所有方法自动成为final,但是字段并不会。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/372206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Node.js】 Express编写接口和跨域解决的方法!

Node.jsExpress编写接口接口跨域问题使用cors中间件解决跨域问题CORS响应头分类:CORS请求分类:编写JSONP接口Express编写接口 注意想获取URl-encoded格式的请求体数据,必须配置中间件app.use(express.urlencoded({extended:false}))创建api路…

动态规划:leetcode 1049.最后一块石头的重量II、494.目标和、474.一和零

leetcode 1049.最后一块石头的重量IIleetcode 494.目标和leetcode 474.一和零leetcode 1049.最后一块石头的重量II有一堆石头,每块石头的重量都是正整数。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y&am…

【算法经典题集】递归(持续更新~~~)

😽PREFACE🎁欢迎各位→点赞👍 收藏⭐ 评论📝📢系列专栏:算法经典题集🔊本专栏涉及到的知识点或者题目是算法专栏的补充与应用💪种一棵树最好是十年前其次是现在1.递归1.1 递归实现…

【JAVA】常见的七大排序

前言:本篇主要介绍常见的七大排序,实现语言为Java,其主要分为:直接插入排序,希尔排序,直接选择排序,堆排序,冒泡排序,快速排序,归并排序。 在介绍七大排序之前…

【多尺度密集递归融合网络:超分】

A novel image super-resolution algorithm based on multi-scale dense recursive fusion network (基于多尺度密集递归融合网络的图像超分辨率算法) 随着卷积神经网络(CNN)技术的成熟度,超限分辨的图像重建(SR)方法基于CNN正在蓬勃发展,取得了许多显…

RIP路由协议的更新(电子科技大学TCP/IP第二次实验)

一.实验目的 1、掌握 RIP 协议在路由更新时的发送信息和发送方式 2、掌握 RIP 协议的路由更新算法 二.预备知识 1、静态路由选择和动态路由选择 2、内部网关协议和外部网关协议 3、距离向量路由选择 三.实验原理 RIP 协议&#xff08…

使用Python进行数据分析——线性回归分析

大家好,线性回归是确定两种或两种以上变量之间互相依赖的定量关系的一种统计分析方法。根据自变量的个数,可以将线性回归分为一元线性回归和多元线性回归分析。一元线性回归:就是只包含一个自变量,且该自变量与因变量之间的关系是…

AMBA-AXI(一)burst 传输-INCR/WRAP/Fixed

💡Note:本文是根据AXI协议IHI0022F_b_amba_axi_protocol_spec.pdf(issue F)整理的。主要是分享AXI3.0和4.0部分。如果内容有问题请大家在评论区中指出,有补充或者疑问也可以发在评论区,互相学习&#x1f64…

JUC 体系的基石——AQS

—— AQS(AbstractQueuedSynchronizer) 概念 抽象队列同步器;volatile cas 机制实现的锁模板,保证了代码的同步性和可见性,而 AQS 封装了线程阻塞等待挂起,解锁唤醒其他线程的逻辑。AQS 子类只需要根据状…

182、【动态规划/数组】leetcode ——647. 回文子串:动态规划+双指针(C++版本)

题目描述 原题链接:647. 回文子串 解题思路 (1)动态规划 动态规划的思路是每次判定子串两端对称位置是否相等,然后再基于已有的内侧对称情况判定是否为回文串。 动态规划五步曲: (1)dp[i][…

语音识别与Python编程实践

博主简介 博主是一名大二学生,主攻人工智能研究。感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c,Python,爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主,博主会继续更新的&#xff0c…

uni-app入门并使用学习

笔记课程 工具准备 下载HBuilderX 点击下载HBuilderX 下载微信开发者工具 点击下载微信开发者工具 使用参考uni-app官网 官网 新建项目运行 文件---新建----项目 运行到谷歌浏览器H5 运行------谷歌浏览器打开---打开成功(第一次可能需要安装插件&#xff0…

React(三) ——新、旧生命周期

🧁个人主页:个人主页 ✌支持我 :点赞👍收藏🌼关注🧡 文章目录⛳React生命周期🌋初始化阶段👣运行中阶段🏓销毁阶段🏫新生命周期的替代🚚react中性…

MS9123是一款单芯片USB投屏器,内部集成了USB2 0控制器和数据收发模块、视频DAC和音视频处理模块,MS9123可以通过USB接口显示或者扩展PC、

MS9123是一款单芯片USB投屏器,内部集成了USB2.0控制器和数据收发模块、视频DAC和音视频处理模块,MS9123可以通过USB接口显示或者扩展PC、智能手机、平板电脑的显示信息到更大尺寸的显示设备上,支持CVBS、S-Video视频接口。 主要功能特征 C…

基本中型网络的仿真(RYU+Mininet的SDN架构)-以校园为例

目录 ​​​​​​​具体问题可以私聊博主 一、设计目标 1.1应用场景介绍 1.2应用场景设计要求 网络配置方式 网络技术要求 网络拓扑要求 互联互通 二、课程设计内容与原理 (1)预期网络拓扑结构和功能 (1)网络设备信息 …

aws ecr 使用golang实现的简单镜像转换工具

https://pkg.go.dev/github.com/docker/docker/client#section-readme 通过golang实现一个简单的镜像下载工具 总体步骤 启动一台海外区域的ec2实例安装docker和awscli配置凭证访问国内ecr仓库编写web服务实现镜像转换和自动推送 安装docker和awscli sudo yum remove awsc…

超市怎么做微信小程序_线上超市小程序开发可以实现什么功能呢

1。开发超市小程序有什么价值? 1、对于消费者来说:通过超市小程序能够更加直接的购买到想要的产品,消费者无需再到门店寻找商品可以直接通过超市小程序进行在线浏览;通过在线搜索的方式能够更加便捷的搜索到相应的商品&#xff0…

第一篇自我介绍(单片机)

小白的单片机之旅 🤔自我介绍🤔 😊学习目标😊 😜关于单片机😜 🌝小结🌝 🎉博客主页:小智_x0___0x_ 🎉欢迎关注:👍点赞&…

JavaSE学习笔记day14

二、Set Set集合是Collection集合的子接口,该集合中不能有重复元素!! Set集合提供的方法签名,与父接口Collection的方法完全一致!! 即没有关于下标操作的方法 Set接口,它有两个常用的子实现类HashSet,TreeSet 三、HashSet HashSet实现了Set接口,底层是hash表(实际上底层是HashM…

QML 中的 5 大布局

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在 QML 中,可以通过多种方式对元素进行布局 - 手动定位、坐标绑定定位、锚定位(anchors)、定位器和布局管理器。 说到 anchors,可能很多人都不太了解,它是 QML 中一个非常重要的概念,主要提供了一种相…