关键字static,final的使用

news2024/11/28 2:55:05
  1. 关键字:static
    概念
    是java中的一个关键字
    用于修饰成员(成员变量和成员方法)

类属性、类方法的设计思想

概念:
当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实
质上的对象,只有通过 new 关键字才会产出对象,这时系统才会分配内存空间
给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无
论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份。
例如例如,所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个
中国人的实例对象中都单独分配一个用于代表国家名称的变量。

请添加图片描述
此外,在类中声明的实例方法,在类的外面必须要先创建对象,才能调用。但
是有些方法的调用者和当前类的对象无关,这样的方法通常被声明为类方法,
由于不需要创建对象就可以调用类方法,从而简化了方法的调用。
这里的类变量、类方法,只需要使用 static 修饰即可。所以也称为静态变量、
静态方法。

1.2 特点(重点)

1.static可以修饰成员变量和方法,但是还可以修饰代码块和内部类
2.被static修饰的资源称为静态资源
3.静态资源随着类的加载而加载,最先加载,优先于对象进行加载
4.静态资源可以通过类名直接调用,也被称作类资源
5.静态被全局所有对象共享,值只有一份
6.静态资源只能调用静态资源
7.静态区域内不允许使用this与super关键字

1.3 练习:static入门案例

创建包: cn.tedu.oop
创建类: TestStatic1.java

package cn.tedu.oop;
/*本类用作静态static的入门案例*/
/*0.被static修饰的资源统称为静态资源
* 静态资源是随着类加载而加载到内存中的,比对象优先进入内存
* 所以静态资源可以不通过对象,直接通过类名调用*/
public class TestStatic1 {
    public static void main(String[] args) {
        //5.通过类名直接调用静态资源
        Fruit.clean();//我们可以通过类名直接调用静态方法,这个IDEA会提示
        System.out.println(Fruit.kind);//我们可以通过类名直接调用静态属性,这个IDEA会提示
        //4.创建水果类的对象
        Fruit f1 = new Fruit();
        Fruit f2 = new Fruit();
        f1.grow();
        f1.clean();//没有提示,需要自己写
        System.out.println(f1.weight);
        System.out.println(f1.kind);//没有提示,需要自己写

        //6.修改普通变量的值
        f1.weight = 6.6;
        System.out.println(f1.weight);//6.6
        System.out.println(f2.weight);//0.0

        /*3.静态资源在内存中只有一份,而且会被全局所有对象共享
        * 所以:不管我们使用哪种方式修改了静态变量的值,使用任何方式来查看
        * 都是静态变量那个刚刚修改了的值*/
        //7.修改静态变量的值
        Fruit.kind = "苹果";
        System.out.println(Fruit.kind);
        System.out.println(f1.kind);
        System.out.println(f2.kind);

        f1.kind = "猕猴桃";
        System.out.println(Fruit.kind);
        System.out.println(f1.kind);
        System.out.println(f2.kind);

        f2.kind = "香蕉";
        System.out.println(Fruit.kind);
        System.out.println(f1.kind);
        System.out.println(f2.kind);
    }
}

//1.创建水果类
class Fruit{
    //2.定义属性
    /*1.可以用static修饰成员变量吗?--可以*/
    static String kind;//品种
    double weight;//重量

    //3.定义方法
    /*2.可以用static修饰方法吗?--可以*/
    public static void clean(){
        System.out.println("洗水果呀洗水果~");
    }
    public void grow(){
        System.out.println("这个果子长的一看就很好吃~");
    }
}

1.4 练习:static静态调用关系

创建包: cn.tedu.oopstatic
创建类: TestStatic2.java


package cn.tedu.oopstatic;
/*本类用于测试静态的调用关系*/
/*总结:
* 1.普通资源既可以调用普通资源,也可以调用静态资源
* 2.静态资源只能调用静态资源*/
public class TestStatic2 {
}
//1.创建老师类
class Teacher{
    //2.定义普通属性与方法
    String name;
    public void teach(){
        System.out.println("正在授课中...");
        /*1.普通资源能否调用静态资源?--可以!!!*/
        System.out.println(age);
        ready();
    }
    //3.定义静态属性与方法
    static int age;
    public static void ready(){
        System.out.println("正在备课中...");
        /*2.静态资源能否调用普通资源?--不可以!*/
        //System.out.println(name);
        //teach();
    }
    public static void eat(){
        System.out.println("正在吃饭中...");
        /*3.静态资源能否调用静态资源?--可以!*/
        System.out.println(age);
        ready();
    }
}


练习:static静态调用关系

创建包: cn.tedu.oopstatic
创建类: TestStatic2.java



package cn.tedu.oopstatic;
/*本类用于测试静态的调用关系*/
/*总结:
* 1.普通资源既可以调用普通资源,也可以调用静态资源
* 2.静态资源只能调用静态资源*/
public class TestStatic2 {
}
//1.创建老师类
class Teacher{
    //2.定义普通属性与方法
    String name;
    public void teach(){
        System.out.println("正在授课中...");
        /*1.普通资源能否调用静态资源?--可以!!!*/
        System.out.println(age);
        ready();
    }
    //3.定义静态属性与方法
    static int age;
    public static void ready(){
        System.out.println("正在备课中...");
        /*2.静态资源能否调用普通资源?--不可以!*/
        //System.out.println(name);
        //teach();
    }
    public static void eat(){
        System.out.println("正在吃饭中...");
        /*3.静态资源能否调用静态资源?--可以!*/
        System.out.println(age);
        ready();
    }
}

总结:请添加图片描述

4. 类的成员之四:代码块

代码块是类的成分之一:成员变量,方法,构造器,代码块,内部类。

在Java中,使用 { } 括起来的代码被称为代码块(Code block)

代码块的分类

根据其位置和声明的不同,可以分为:

局部代码块:用于限定变量生命周期,及早释放,提高内存利用率。
静态代码块:主要用于对静态属性进行初始化。

构造代码块:调用构造方法都会执行,并且在构造方法前执行。

4.1 静态代码块

如果想要为静态变量初始化,可以直接在静态变量的声明后面直接赋值,也可以使用静态代码块。

4.1.1 语法格式

在代码块的前面加 static,就是静态代码块

静态资源随着类的加载而加载,并且只被加载一次,一般用于项目的初始化
特点: 被static修饰,位置在类里方法外

4.1.2 静态代码块的特点
• 可以有输出语句。
• 可以对类的属性、类的声明进行初始化操作。
• 不可以调用非静态的属性和方法。
• 若有多个静态的代码块,那么按照从上到下的顺序依次执行。
• 静态代码块的执行要先于非静态代码块。
• 静态代码块随着类的加载而加载,且只执行一次。

练习:几种代码块的关系

创建包: cn.tedu. block
创建类: TestBlock.java


package cn.tedu.oopstatic;
/*本类用于学习静态代码块*/
/*执行顺序:
* 静态代码块->构造代码块->构造方法【对象创建成功】->局部代码块*/
public class TestStaticBlock {
    public static void main(String[] args) {
        //6.创建对象进行测试
        Person p = new Person();
        Person p2 = new Person();
        //7.触发局部代码块
        p.play();
    }
}

//1.创建Person类
class Person{
    //8.创建静态代码块
    /*位置:类里方法外
    * 执行时机:静态代码块也属于静态资源,随着类的加载而加载,优先于对象加载
    *         并且静态资源只会加载一次
    * 作用:用于加载那些需要第一时间就加载,并且只加载一次的资源*/
    static{
        System.out.println("我是静态代码块");
    }
    //2.创建构造代码块
    /*位置:类里方法外
    执行时机:每次创建对象时被触发,并且优先于构造方法执行
    作用:用于提取所有构造方法的共性功能*/
    {
        System.out.println("我是构造代码块");
    }
    //5.创建构造方法
    public Person(){
        System.out.println("我是无参构造");
    }
    //3.创建普通方法
    public void play(){
        System.out.println("我是一个普通方法");
        //4.创建局部代码块
        /*位置:方法里
        * 执行时机:执行本局部代码块所在的方法时才会执行
        * 作用:用于限制变量的作用范围*/
        {
            System.out.println("我是一个局部代码块~");
        }
    }

}


结论:执行顺序:静态代码块 --> 构造代码块 --> 构造方法 --> 局部代码块

final

3.1 概念

是java提供的一个关键字
final是最终的意思
final可以修饰类,方法,字段(属性)
初衷:java出现继承后,子类可以更改父类的功能,当父类功能不许子类改变时,可以利用final关键字修饰父类。

3.2 特点

被final修饰的类,不能被继承
被final修饰的方法,不能被重写
被final修饰的字段是个常量,值不能被修改
常量的定义形式:final 数据类型 常量名 = 值

被final修饰的类,不能被继承:string就使用的是final类
请添加图片描述

被final修饰的方法,不能被重写:object的getclass方法使用的就是final方法
请添加图片描述

final可以修饰成员变量和局部变量,被final修饰的变量是常量,一旦赋值不能被修改

请添加图片描述

变量可以赋值的地方:显示赋值,代码块赋值,构造器赋值

代码块赋值
在这里插入图片描述

构造器中赋值请添加图片描述

final和static 搭配使用修饰成员变量时,此成员变量称为全局常量

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

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

相关文章

使用递归SQL实现树形参数的转换(后传前)

1、什么是递归SQL 递归 SQL(Recursive SQL)是一种 SQL 查询语言的扩展,它允许在查询中使用递归算法。递归 SQL 通常用于处理树形结构或层次结构数据,例如组织结构、产品分类、地理位置等。 递归 SQL 语句通常包含两个部分&#xf…

大数据入门-大数据技术概述(一)

大数据入门系列文章 大数据入门-大数据是什么 一、概念 大数据技术是指在构架大数据平台的时候需要的技术。包含存储系统,数据库,数据仓库,资源调度,查询引擎,实时框架等。下面以我目前所了解到的一些技术做简要介绍…

React学习笔记十-生命周期(旧)

此文章是本人在学习React的时候,写下的学习笔记,在此纪录和分享。此为第十篇,主要介绍React非常重要的组件的生命周期(旧)。要学习react新的生命周期,那必须先学习旧的生命周期。 目录 1.引出生命周期概念 1.1案例 1.1.1案例卸…

snmp默认团体名/弱口令漏洞及安全加固

一、漏洞描述 SNMP(简单网络管理协议)被广泛用于计算机操作系统设备、网络设备等领域监测连接到网络上的设备是否有任何引起管理上关注的情况。在运行SNMP服务的设备上,若管理员配置不当运行默认团体名/弱口令访问,将导致敏感信息泄露。敏感…

Sentinel源码分析-ProceesorSlotChain调用链及树状资源节点

Sentinel 实现流控,隔离,降级等功能,本质要做两件事: 数据统计: 统计某个资源的访问数据(QPS,RT(响应时间),异常比例)等信息规则判断: 判断流控规…

攻略 | 如何拿下奖金534万的全国人工智能大赛?

全国人工智能大赛已连续成功举办三届,累计吸引全球20个国家、1万多支队伍参与竞技,已成为人工智能领域参与规模和影响力都名列前茅的顶级赛事。作为头部科技企业、高等院校和科研院所的链接平台,大赛在促进产学研融合、推动多项成果落地方面成…

比后缀Ti更香的N卡全能型号回归,40显卡终于不恶心了

NVIDIA RTX 40 系显卡上市有一段时间了,不过大家给出的一致看法是:除了 4090 外,其他型号暂时都不值得购买! 倒不是说他们性能多拉胯,主要是核心规格与价格属实不那么匹配。 特别是主流的 RTX 4060、4070 级别&#…

flask搭建在线音乐网系统

1.使用虚拟环境Virtualenv来创建项目 2. Flask框架介绍 Flask框架是一个用Python编写的轻量级Web应用程序框架,依赖于Werkzeug和Jinja2两个外部库。Werkzeug是一个WSGI工具包,用于接收和处理HTTP请求,匹配视图函数,支持Cookie和会…

基于Java社区文化宣传网站设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

2023年5月国产数据库大事记-墨天轮

本文为墨天轮社区整理的2023年5月国产数据库大事件和重要产品发布消息。 目录 5月国产数据库大事记 TOP105月国产数据库大事记(时间线)产品/版本发布兼容认证代表厂商大事记排行榜新增数据库厂商活动 5月国产数据库大事记 TOP10 5月国产数据库大事记&…

高考之后想学习网络安全,网络安全/信息安全是一个好的专业吗?

本人信息安全专业毕业,在甲方互联网大厂安全部与安全乙方大厂都工作过,有一些经验可以供对安全行业感兴趣的人参考。 或许是因为韩商言让更多人知道了CTF,也或许是因为网络安全越来越受国家重视,安全最近愈加火爆了。当然&#x…

C++初阶—list深度解剖及模拟实现

目录 ➡️0. 前言 😊1.简易框架实现 🐔1. list和__list_node分析实现 🐔2. 无参构造 😊2.迭代器实现 🐔1. list普通迭代器面临问题及解决方案 🐔2. __list_node\iterator\list三类分析 &#x1f41…

内网安全:Cobalt Strike 与 MSF 联动( 会话 相互转移 )

内网安全:Cobalt Strike 与 MSF 联动( 会话 相互转移 ) 在渗透中,有时候 Cobalt Strike 会话可能会受限制,所以我们需要把 Cobalt Strike 会话转移到 MSF 上进行后面的渗透。也有的时候会话在 MSF 上,但是…

大数据学习归纳

本文初衷是为了学习归纳,若有错误,请指出。 修改记录 时间内容2020年4月10日第一次发布2020年4月16日添加MaxCompute SQL部分2020年9月14日新增数仓部分笔记 大数据架构 基础知识题 大数据组件概念 集群:多个人做同样的事 分布式:…

Visual Studio Community 2022 + Win10 编译 OpenCPN 5.9.0 记录

前言 前两天尝试用vs2017编译OpenCPN5.0.0,前后折腾了两三天总算编译成功了。官网给出的编译过程比较简单,我在实际编译过程中遇上了很多很多的问题,最多的就是缺少库,好在最后编译通过了。 后来浏览OpenCPN官网的时候发现发布了…

【Spring】开发框架Spring核心技术含Resource接口详细讲解

前言 Spring 是 Java EE 编程领域的一款轻量级的开源框架,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,它的目标就是要简化 Java 企业级应用程序的开发难度和周期。 Spring 自诞生以来备受青睐,一直被广大开发人员作为 Java…

测试工程师常用的10个python库,面试必备哦

目录 前言 1、os库 2、sys库 3、time库 4、selenium库 5、unittest库 6、pytest库 7、email库 8、appium库 9、pymsql库 10、requests库 总结: 前言 今天给各位小伙伴带来的是测试工程师常用的10个python库,相信有些小伙伴肯定知道一些库&am…

aclocal-1.14 is missing on your system

在编译 bluez 的时候出现如下错误: 没有找到 aclocal-1.14, 但是有 aclocal-1.13 版本的,那最直接的方法就是修改 Makefile了,搜索出来 Makefile 指定了 aclocal-1.14,修改成 aclocal-1.13 即可。修改完还会有如下的错…

数据科学导论

《数据科学导论》 重点归纳 第1~4章 数据科学研究的问题边角广泛,只要是和数据收集、清洗整理、分析和挖掘有关的问题都是数据科学要研究的问题;数据科学的主要方法:有监督学习、无监督学习、半监督学习;有监督学习中&#xff…

初见PlayWright

PlayWright特色 跨浏览器:PlayWright支持所有现代的浏览器渲染引擎,包括Chromium、WebKit、Firefox,这意味着它可以驱动像Chrome、Edge、Firefox、Safari等主流浏览器跨平台:基于浏览器的特性,可以在Windows、Linux和…