当前位置: 首页 > article >正文

Java基础 -- 关键字Static和Final

在这里插入图片描述

Java基础 -- 关键字Static和Final

    • 1. Static
      • 1.1 修饰成员变量
      • 1.2 修饰方法
      • 1.3 代码块
        • 1.3.1 代码块01
        • 1.3.2 代码块02
    • 2. Final
      • 2.1 初始化
      • 2.2 思考
    • 3. 类属性值的Null和非空判断
    • 4. Awakening


在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


1. Static

  • java static关键字可以用在变量、方法、代码块和嵌套类上
    1.静态变量
    2.静态方法
    3.静态代码块
    4.静态内部类

1.1 修饰成员变量

  • 被static 修饰的成员变量叫静态变量
    1.运行时,Java 虚拟机只为静态变量分配一次内存,加载类过程中完成静态变量的内存分配。
    2.在类的内部,可以在任何方法内直接访问静态变量。
    3.在其他类中,可以通过类名访问该类中的静态变量。
  • 没有被 static 修饰的成员变量叫实例变量
    1.每创建一个实例,Java 虚拟机分配一次内存
    2.在类的内部,可以在非静态方法中直接访问实例变量。
    3.在其他类中,通过实例对象调用。
  • 提高代码的可读性

1.2 修饰方法

  • 被static 修饰的方法叫静态方法
    1.静态方法,属于类,而不属于类的对象。
    2.静态方法中无法使用this,super。
  • 没有被static 修饰的方法叫成员方法
    1.可直接访问所属类的静态变量、静态方法、实例变量和实例方法。

1.3 代码块

  • 静态代码块在类加载的时候执行一次,是最早被执行的
  • 构造代码块在每一次创建对象时执行,始终在构造方法前执行。
  • 构造方法在新建对象时调用( 就是new的时候 )。

1.3.1 代码块01

  • 执行顺序:静态代码块 → main → 构造代码块 → 构造方法
    在这里插入图片描述
public class Demo01 {

    static{
        System.out.println("父类静态代码块开始执行!");
    }
    {
        System.out.println("父类构造代码块开始执行!");
    }
    public Demo01(){
        System.out.println("父类构造方法开始执行!");
    }
    public static void main(String[] args) {
        System.out.println("父类开始运行main");
        new Demo01();

    }
}

1.3.2 代码块02

  • 执行顺序:父类静态代码块 → 子类静态代码块 → main → 父类构造代码块 → 父类构造方法 → 子类构造代码块 → 子类构造方法
    在这里插入图片描述
public class Demo02 extends Demo01{
    static{
        System.out.println("子类静态代码块开始执行!");
    }
    {
        System.out.println("子类构造代码块开始执行!");
    }
    public Demo02(){
        System.out.println("子类构造方法开始执行!");
    }
    public static void main(String[] args) {
        System.out.println("子类开始运行main");
        new Demo02();
    }
}

2. Final

  • final关键字可用于修饰类,方法,变量(成员变量,局部变量,静态变量)
    1.被final修饰的类是一个最终类,不可以被继承。
    2.被final修饰的方法是一个最终方法,不可以被覆盖,但是可以被继承。
    3.被final修饰的变量只能是一个常量,只能赋值一次。

2.1 初始化

final修饰的属性又叫常量一般用 XX_XX_XX来命名

class A{
    //一、在定义时
    public final double TAX_RATE1 = 0.08;
    public final double TAX_RATE2;
    public final double TAX_RATE3;
    //二、在构造器中
    public A(){
        TAX_RATE2=1.1;
    }
    //三、在代码块
    {
        TAX_RATE3 = 1.8;
    }
}
 
//若final修饰的属性是静态的,则初始化
class B{
    //一、在定义时
    public static final double TAX_RATE1=99.9;
    public static final double TAX_RATE2;
    //二、在静态代码块
    static{
        TAX_RATE2=3.3;
    }
}

2.2 思考

  • 为什么当final修饰的属性为静态时,不可在构造器中初始化?
    构造器在创建对象的时候才会被调用,而静态变量的初始化在类加载时就要给值。
  • 为什么在静态方法里不能操作类成员变量?
    因为静态方法先加载,还没有实例化对象,哪来的这个属性。调用成员方法时,成员变量和方法已经是一个对象的了。

3. 类属性值的Null和非空判断

  • Utils Code

import java.util.Collection;


public class AttributeValidate {
   private static final String NOT_NULL_FAILURE_MESSAGE = "does not accept null args";
   private static final String NOT_EMPTY_FAILURE_MESSAGE = "does not accept empty args";

   public static void notNull(Object... args_) {
      if (args_ == null)
         throw new IllegalArgumentException(NOT_NULL_FAILURE_MESSAGE);

      for (Object arg : args_) {
         if (arg == null)
            throw new IllegalArgumentException(NOT_NULL_FAILURE_MESSAGE);
      }
   }

   public static void notEmpty(Object... args_) {
      if (args_ == null)
         throw new IllegalArgumentException(NOT_EMPTY_FAILURE_MESSAGE);

      for (Object arg : args_) {
         if (arg == null)
            throw new IllegalArgumentException(NOT_EMPTY_FAILURE_MESSAGE);
         if (arg instanceof Collection<?>) {
            if (((Collection<?>) arg).size() == 0)
               throw new IllegalArgumentException(NOT_EMPTY_FAILURE_MESSAGE);
         }
      }
   }
}

  • Test Code
 AttributeValidate.notNull(。。。。。。);

4. Awakening

         在一秒钟内看到本质的人和花半辈子也看不清一件事本质的人,自然是不一样的命运。
在这里插入图片描述


http://www.kler.cn/a/4513.html

相关文章:

  • (三)html2canvas将HTML 转为图片并实现下载
  • FPGA工程师成长四阶段
  • Stein算法
  • 蓝桥杯备赛:顺序表和单链表相关算法题详解(上)
  • 微信小程序在使用页面栈保存页面信息时,如何避免数据丢失?
  • 【Leetcode 热题 100】295. 数据流的中位数
  • docker-compose部署rabbitmq集群
  • 解决 Git 错误 error: failed to push some refs to ‘https://*****.git‘
  • 树莓派学习笔记(十三)基于框架编写驱动代码
  • 春分-面试
  • LeetCode:242. 有效的字母异位词
  • MySQL OCP888题解063-突然变慢的可能原因
  • 【Autoware规控】Lattice规划节点
  • CentOS挂载U盘拷贝文件
  • 【基础算法】1-2:归并排序
  • MyBatis-Plus联表查询(Mybatis-Plus-Join)
  • RabbitMQ高级
  • 使用c++超详细解释数据结构中的顺序栈和链栈
  • 大模型多模态Chatgpt+自动驾驶控制器设计方案
  • 入行芯片设计选模拟IC还是数字IC?一文为你讲解清楚
  • 树莓派云浇水--上层搭建自研版 :P
  • DJ2-5 读者-写者问题
  • 完全二叉树的4种遍历方式
  • 【Python语言基础】——Python 关键字
  • 一个PHP实现的轻量级简单爬虫
  • Java中的volatile关键字的作用