• Java 面向对象(三)static 关键字


    一、static 

      1、概述

        static 的意思的静态的,也是一种修饰符。

        关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单属于某个对象的。

        用 static 关键字修饰的,属于类,就可以不依靠创建对象来调用了。

      2、可以修饰什么

        (1)方法

        (2)成员变量

        (3)代码块

        (4)内部类

    二、修饰变量与方法

      1、类变量(静态变量)

        ① 当 static 修饰成员变量时,该变量称为 类变量。该类的每个对象都共享同一个类变量的值。

        ② 用 static 修饰的成员变量的值,存储在方法区中;static 修饰的成员变量的 get/set 也是静态的。

        ③ 任何对象都可以更改该类变量的值,但也可以在不创建该类的对象的情况下对类变量进行操作。

        ④ 如果在方法中有局部变量与 static 修饰的成员变量同名时,在静态变量前面加 "类名." 进行区别(这里不能使用this关键字)

        ⑤ static 不能修饰局部变量

        类变量:使用 static 关键字修饰的成员变量。

        定义格式:

    static 数据类型 变量名;
    

          Demo:

     1 public class Student {
     2   private String name;
     3   private int age;
     4   private int sid;
     5   private static int numberOfStudent = 0;
     6  
     7    public Student(String name, int age){
     8         this.name = name;
     9         this.age = age;
    10         // 通过 numberOfStudent 给学生分配学号
    11         this.sid = ++numberOfStudent;
    12     }   
    13  
    14 }  

      2、类方法(静态方法)

        当 static 修饰成员方法时,该方法称为 类方法 静态方法

        静态方法在声明中有 static,建议使用类名来调用,而不需要创建类的对象来调用。

        类方法:使用 static 关键字修饰的成员方法,习惯称为 静态方法

        定义格式:

    修饰符 static 返回值类型 方法名 (参数列表){
        // 执行语句
    }

         Demo:在上面的 Student 类中定义一个静态方法

    1 public static void showNum() {
    2     System.out.println("num:" + numberOfStudent);
    3 }

        注意事项:

        •  静态方法可以直接访问静态变量和静态方法。(原因:因为在内存当中是【先】有的静态内容,【后】有的非静态内容。)
        •     静态方法不能直接访问普通成员变量或成员方法。反之,成员方法可以直接访问静态变量或静态方法。
        •     静态方法中,不能使用 this,super 关键字。(原因:this代表当前对象,通过谁调用的方法,谁就是当前对象。)

        小结:静态方法只能访问静态成员,非静态方法即可以访问非静态成员也可以访问静态成员。

      3、调用格式

        static 修饰的成员可以并且建议通过 类名直接访问。虽然也可以通过对象名访问静态成员,原因即多个对象均属于一个类,共享使用同一个静态成员,但是不建议,会出现警告信息。

        调用格式:

    // 访问类变量
    类名.类变量名;
    
    // 调用静态方法
    类名.静态方法名(参数);

    三、静态原理图解

      static 修饰的内容:

      •  是随着类的加载而加载的,且只加载一次;
      •     存储与一块固定的内存区域(静态区),所以,可以直接被类名调用;
      •     它优先于对象存在,所以,可以被所有对象共享。

      图解:

    四、静态代码块

      (1)静态代码块:定义在成员位置,使用 static 修饰的代码块 { }。

        位置:类中方法外。

        执行:随着类的初始化而且执行且仅执行一次,优先于 main 方法和构造方法的执行。

        特点:

          ① 每一个类的静态代码块只会执行一次。

          ② 静态代码块在第一次使用这个类之前执行,即在类的初始化时执行。

      定义格式:

    public class ClassName{
        static {
            // 静态代码块的内容
        }
    }
    

             作用:用来一次性给静态成员变量进行初始化赋值。

      (2)类初始化即执行类初始化方法: <clinit>()

         类初始化方法,一个类只有一个。它也是由编译器编译生成的,由两部分代码组成:

          ① 静态变量的显示赋值代码

          ② 静态代码块的代码

          注意:上面的 ① 和 ② 是按照顺序执行的。

          提示:注意与非静态代码块(实例初始化的区别)

      (3)继承中的静态代码块

           一个类初始化时会先检查它的父类是否初始化,如果父类没有初始化,那么会先初始化父类。因为一个类只要初始化一次。

         父类的初始化<clinit>()

          ① 父类的静态变量的显示赋值

          ② 父类的静态代码块

         子类的初始化<clinit>()

          ① 子类的静态变量的显示赋值

          ② 父类的静态代码块

         注意:静态方法是不能被重写的。

          Demo:

     1 public class TestClassInit {
     2     public static void main(String[] args) {
     3         /*Father f = new Father();
     4         System.out.println("-------------------");
     5         Son s = new Son();*/
     6         
     7         Son s = new Son();
     8         
     9         /*Father f = new Son();//多态引用
    10         System.out.println("----------------");
    11         f.assign();//静态方法在编译期间就确定了,不需要在运行时动态绑定
    12 */    }
    13 }
    14 class Father{
    15     private static String info = assign();
    16     static{
    17         System.out.println("(1)父类的静态代码块");
    18     }
    19     public static String assign(){
    20         System.out.println("(3)assign()方法");
    21         return "Father";
    22     }
    23 }
    24 class Son extends Father{
    25     private static String info = assign();
    26     static{
    27         System.out.println("(2)子类的静态代码块");
    28     }
    29     public static String assign(){
    30         System.out.println("(4)assign()方法");
    31         return "Son";
    32     }
    33 }

      小结:static 关键字,可以修饰变量、方法和代码块。在使用的过程中,其主要目的还是想在不创建对象的情况下,去调用方法。

  • 相关阅读:
    【重构学习】12 重构学习感想
    【重构学习】11 大型重构
    【重构学习】10 继承关系的重构
    【重构学习】09 函数调用的重构
    【重构学习】08 条件表达式的重构
    嵊州D4T1 翻车 rollover 真的翻车了
    计算圆内格点数
    嵊州D3T2 福尔贝斯太太的快乐夏日 summer
    嵊州D3T3 light
    嵊州D3T1 山魔 烙饼问题
  • 原文地址:https://www.cnblogs.com/niujifei/p/11353244.html
Copyright © 2020-2023  润新知