关键字static,final的使用

news/2024/12/2 15:06:17/
  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.6System.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.ppmy.cn/news/387979.html

相关文章

IMX6ULL裸机篇之SPI实验-ICM20608代码实现

一. SPI 实验 SPI实验:学习如何使用 I.MX6U 的 SPI 接口来驱动 ICM-20608,读取 ICM-20608 的六轴数据。 本文学习 SPI通信实验中,涉及从设备的 SPI代码编写。 之前学习了 SPI 主控芯片代码的编写,如下所示: IMX6ULL…

收音机FM和AM的区别

1、频率区别 FM = Frequency Modulation 调频,微波;微波传输,信号质量高,传输成本低,发射功率小,覆盖范围小,受地理因素影响较大,一般作为城市广播的首选。比如你的家乡城市台,一般可以通过FM收听。 AM = Amplitude Modulation 调幅,微波;中波传输,信号质量稳定,传…

Java 十大必读经典书籍推荐

今天给大家推荐十本学习 Java 语言必读经典书籍,它们经过了无数人的口口相传,都已成为了 Java 领域顶级的经典名著。 1、Java核心技术卷 I基础知识 豆瓣评分:9.4 Java 领域极有影响力和价值的著作之一,与《Java编程思想》齐名&a…

收音机基础知识

一、无线电的传播 调幅制无线电广播分为长波、中波和短波三个大波段,分别由相应波段的无线电波传送信号。我国只有中波和短波两个大波段的无线电广播。中波广播使用的频段大致为550kHz-1600kHz,主要靠地波传播,也伴有部分天波;短波广播使用的频段约为2MHz-24MHz,主要靠天波…

[读论文]Referring Camouflaged Object Detection

摘要 In this paper, we consider the problem of referring camouflaged object detection (Ref-COD), a new task that aims to segment specified camouflaged objects based on some form of reference, e.g. , image, text. We first assemble a large-scale dataset, ca…

编程示例: 计算CRC校验码

编程示例: 计算CRC校验码 循环冗余检查(CRC)是一种数据传输检错功能,对数据进行 多项式计算,并将得到的结果附在帧的后面,接收设备也执行 类似的算法,进而可以保证在软件层次上数据传输的正确性…

经典文献阅读之--A Review of Motion Planning(轨迹规划回顾)

0. 简介 对于自动驾驶以及机器人而言,除了SLAM以外,另一个比较重要的部分就是轨迹规划了。而最近作者看到了几篇比较好的文章,分别为《A Review of Motion Planning Techniques for Automated Vehicle》、《A review of motion planning alg…

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

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