• 【Java】状态修饰符 final & static


    目录

    final 修饰我们的成员方法、成员变量、类

    示例代码:

    final 修饰的局部变量

    示例代码:

    static

    示例代码:

    static 访问特点:

    示例代码:

    static关键字的用途

    示例代码:

    static 修饰常量

    示例代码


    1. final(最终态)

    2. static(静态)

    final 修饰我们的成员方法、成员变量、类

    特点:

    • 修饰变量:该变量的值,不能被修改,必须初始化(手动赋值)
    • 修饰方法:该方法,不能被重写
    • 修饰类:该类,不能被继承

    示例代码

    Parent.java

    1. package com.面向对象.Demo15;
    2. public class Parent {
    3. private int age; // 默认
    4. private final int age2 = 10; //final——必须初始化值
    5. /**
    6. * final 关键字修饰的 类、成员属性、成员方法
    7. * 1.被 final 关键字修饰的类 无法被继承
    8. * 2.被 final 关键字修饰的成员方法 无法被重写
    9. * 3.被 final 关键字修饰的成员属性 该变量的值(必须初始化值) 无法被修改
    10. */
    11. // public final void a1() { //报错, final——无法被重写
    12. // }
    13. public void a1() {
    14. // this.age2= 20; // 报错,final——无法被修改
    15. }
    16. }

    Student.java 

    1. package com.面向对象.Demo15;
    2. public class Student extends Parent {
    3. @Override
    4. public void a1() {
    5. }
    6. }

    final 修饰的局部变量

    • 基本数据类型:final 修饰的基本数据类型的值不能够被修改的;
    • 引用数据类型:final 修饰的引用数据类型 引用类型地址不能够发生变化的,但是引用类型的地址里面成员属性值是可以发生变化的。

    示例代码:

    Student.java

    1. package com.面向对象.Demo16;
    2. public class Student {
    3. public int age = 30;
    4. }

    StudentDemo.java

    1. package com.面向对象.Demo16;
    2. public class StudentDemo {
    3. public static void main(String[] args) {
    4. // 使用final关键字修饰局部变量
    5. final int age = 20;
    6. // age=30; //报错,使用 final 修饰的局部变量 是基本数据类型 不可以修改
    7. final Student student = new Student(); //引用类型
    8. student.age = 10; // 使用 final 修饰局部变量 是一个引用类型的 引用类型的地址 不能够被修改的,
    9. // 但是,引用类型的地址里面的属性值是可以修改
    10. // student = null; // 报错,引用类型的地址不可以修改
    11. // student = new Student(); // 报错,引用类型的地址不可以修改
    12. }
    13. }

    static

    • static (静态),可以修饰成员方法,成员变量
    • static 修饰的特点:被类的所有对象共享访问

    示例代码:

    Student.java

    1. package com.面向对象.Demo17;
    2. public class Student {
    3. public String name;
    4. // public String school = "清华大学"; //方法1——成员变量
    5. public static String school; //方法2——静态变量
    6. /**
    7. * 通过static关键字 修饰的 成员方法——静态方法
    8. * 通过static关键字 修饰的 成员变量——静态变量
    9. */
    10. public void show() { //成员方法
    11. System.out.println(name + "," + school);
    12. }
    13. }

    Test01.java

    1. package com.面向对象.Demo17;
    2. public class Test01 {
    3. public static void main(String[] args) {
    4. /**
    5. * 疑问 为什么s1对象. 没有静态变量 school 提示呢?
    6. * 解答:静态变量的方法特点:直接通过 类名.
    7. * Student.school="清华大学"
    8. * 下面的s1 s2 s3.school 都可以不需要
    9. */
    10. Student.school="清华大学";
    11. // 通过static 关键字修饰的 被类的所有对象 共享访问
    12. Student s1 = new Student();
    13. Student s2 = new Student();
    14. Student s3 = new Student();
    15. s1.name = "小明";
    16. // s1.school = "清华清华";
    17. // s1.school = "清华大学";//这里的s1没有school对象,但写出类不报错,
    18. // s2.school不需要赋值,如果不是static,s2.school没有赋值就为null
    19. s1.show();
    20. s2.name = "小军";
    21. // s2.school = "清华大学";
    22. s2.show();
    23. s2.school = "北京大学";
    24. s3.show(); //这里的s3.school为 北京大学
    25. /**
    26. * s1.school = "清华清华";
    27. * s2.school = "清华大学";
    28. * 冗余
    29. * 方法1.默认值的形式 优化代码 s1和s2 对象不需要给school赋值
    30. * 方法2.静态变量 static
    31. *
    32. */
    33. }
    34. }

    static 访问特点:

    非静态成员方法

    • 能够访问静态的成员变量
    • 能够访问非静态的成员变量
    • 能够访问静态的成员方法
    • 能够访问非静态的成员方法

    静态成员方法

    • 能够访问静态成员变量,但是不能够直接访问成员变量
    • 能够访问静态成员方法,但是不能够直接访问成员方法

    示例代码:

    Student.java

    1. package com.面向对象.Demo18;
    2. public class Student {
    3. /**
    4. * 成员属性 和 方法
    5. */
    6. private int age; //非静态
    7. public static int staticAge;//静态
    8. // 非静态
    9. public void a1() {
    10. // 在a1 非静态方法中 可以访问 非静态方法 静态方法 静态成员属性 非静态成员属性
    11. System.out.println(age); //访问 非静态成员属性
    12. System.out.println(staticAge); //访问 静态成员属性
    13. staticA2(); //访问 静态方法
    14. staticA3();
    15. a4(); //访问 非静态方法中
    16. }
    17. // 静态
    18. public static void staticA2() {
    19. // 在staticA2 静态方法中 访问 非静态方法 静态方法 静态成员属性 非静态成员属性
    20. /**
    21. * staticA2 静态方法中,非静态方法 和 静态方法 特点?
    22. * staticA2 静态方法中,不能够访问 非静态成员方法 但是可以访问 静态方法
    23. */
    24. // a1(); //报错,静态方法中,不能够方法 非静态成员方法,想要访问,只需要将a1()改为静态即可
    25. staticA3(); // 静态可以访问静态
    26. }
    27. public static void staticA3() {
    28. /**
    29. *staticA3 静态方法中,不能够访问 非静态成员属性 但是可以访问 静态成员属性
    30. */
    31. // System.out.println(age); //报错,不能够访问 非静态成员属性
    32. System.out.println(staticAge); //可以访问 静态成员属性
    33. }
    34. //非静态
    35. public void a4(){
    36. }
    37. }

    static关键字的用途

    • 一句话描述就是:方便在没有创建对象的情况下进行调用(方法/变量)
    • 显然,被static 关键字修饰的方法或变量 不需要依赖与对象来进行访问,只要类被加载了,就可以通过类名去进行访问。
    • static 可以用来修饰类的成员方法、类的成员变量,另外也可以编写static 代码块 来优化程序性能

    示例代码:

    Test01.java

    1. package com.面向对象.Demo18;
    2. public class Test01 {
    3. public static void main(String[] args) {
    4. /**
    5. * static 应用场景 不想通过new的形式 访问成员方法和属性的话
    6. * static 修饰成员方法和成员属性 变成 静态的成员属性和静态的成员方法
    7. */
    8. Student s = new Student();
    9. s.a1();
    10. // s.staticA2();//s没有staticA2这个对象,但是也不报错,官方不推荐
    11. Student.staticA2();
    12. /**
    13. * 通过 static 被类中所有对象共享
    14. * 类名.静态方法
    15. *
    16. * 总结:如果是通过 static 修饰的成员方法和属性
    17. * 我们可以直接通过 ”类名.“ 访问(成员方法和属性)
    18. *
    19. * 实例访问 成员方法和成员属性
    20. * 非静态的 成员方法 和 成员属性 必须通过 new 该对象 "实例." 成员方法和成员属性
    21. */
    22. }
    23. }

    static 修饰常量

    static 关键字的应用场景,java中的常量(Constant)

    示例代码:

    Constant.java

    1. package com.面向对象.Demo19;
    2. public class Constant {
    3. /**
    4. * 该类定义都是常量
    5. * 什么是常量?
    6. * 1.定义好之后,值不能够被修改(final)
    7. * 2.常量名称全部都是为大写
    8. * 2.1 写大写太麻烦,先写成小写,然后使用快捷键改为大写
    9. * 2.2 IDEA中的快捷键(鼠标光标(常量名称)Ctrl+Shift+u),再按就改为小写
    10. */
    11. public static final int CODE_200 = 200;
    12. public static final int CODE_404 = 404;
    13. public static final int CODE_500 = 500;
    14. /**
    15. * JavaWeb开发
    16. * CODE_200 表示 成功
    17. * CODE_404 表示 找不到
    18. * CODE_500 表示 错误
    19. */
    20. }

    Test01.java

    1. package com.面向对象.Demo19;
    2. public class Test01 {
    3. public static void main(String[] args) {
    4. // Constant constant = new Constant(); //后面直接用"类名." 访问
    5. int code = 200;
    6. if (Constant.CODE_200 == code) { // JavaWeb 开发时
    7. System.out.println("成功");
    8. return;
    9. }
    10. if (Constant.CODE_404 == code) {
    11. System.out.println("找不到");
    12. return;
    13. }
    14. if (Constant.CODE_500 == code) {
    15. System.out.println("错误");
    16. return;
    17. }
    18. }
    19. }

    下一篇文章:main方法的深入理解

  • 相关阅读:
    计算机网络--应用层(https)
    NDK 是什么 | FFmpeg 5.0 编译 so 库
    2024 年最新 windows 操作系统部署安装 redis 数据库详细教程(更新中)
    CTFHUB ICS(3)
    three图形控制页面
    独立站SaaS建站模式是什么
    Huggingface transformers 镜像使用,本地使用,tokenizer参数介绍
    kubernetes 之 Pod 控制器 Deployment
    谷粒学苑_第六天
    GitHub 已霸榜!阿里技术官肝了 3 个月才完成的 20 万字 Java 面试手册
  • 原文地址:https://blog.csdn.net/qq_57268251/article/details/133526656