zoukankan      html  css  js  c++  java
  • Java 静态对象 static

    什么是静态变量

    大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立。

    然而在某些时候,我们更希望该类所有的对象共享同一个成员。此时就是 static 大显身手的时候了!!

    Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。

    静态成员可以使用类名直接访问,也可以使用对象名进行访问。当然,鉴于他作用的特殊性更推荐用类名访问~~

    使用 static 可以修饰变量、方法和代码块。

    public class Test1 {
        // static修饰的变量为静态变量,所有类的对象共享hobby
        static String hobby = "Tedu";
        
        public static void main(String[] args) {
            // 静态变量可以直接使用类名来访问,无需创建对象
            System.out.println("通过类名访问hobby:" + Test1.hobby);
            // 创建类的对象
            Test1 t1 = new Test1();
            // 使用对象名访问静态变量
            System.out.println("使用对象名访hobby:" + t1.hobby);
            // 使用对象名的形式修改静态变量的值
            t1.hobby = "cjj";
            // 再次使用类名访问静态白变量,值已经被修改
            System.out.println("通过类名访问hobby:" + Test1.hobby);
        }
    }

    运行结果:

    通过类名访问hobby:Tedu
    使用对象名访hobby:Tedu
    通过类名访问hobby:cjj

    注意:

    静态成员属于整个类,当系统第一次使用该类时,就会为其分配内存空间直到该类被卸载才会进行资源回收!~~ 

    static 使用之静态方法

    与静态变量一样,我们也可以使用 static 修饰方法,称为静态方法或类方法。

    其实之前我们一直写的 main 方法就是静态方法

    public class Test01 {
        //使用static关键字声明静态方法
        public static void print() {
            System.out.println("欢迎你:Cjj!");
        }
        
        public static void main(String[] args) {
            //直接使用类名调用静态方法
            Test01.print();
            //也可以通过对象名调用,当然更推荐使用类名调用
            Test01 t1 = new Test01();
            t1.print();
        }
    }

    运行结果:

    欢迎你:Cjj!
    欢迎你:Cjj!

    注意:

    1、 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。如:

    如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量。如:

     

    2、 在普通成员方法中,则可以直接访问同类的非静态变量和静态变量,如:

     

    3、 静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法。如:

    public class Test01 {
        String name = "Cjj"; //静态成员变量
        static String hobby = "study"; //非静态成员变量
        
        //普通成员方法
        public void print1() {
            System.out.println("普通成员方法~~~"); 
        }
        
        //静态成员方法
        public static void print2() {
            System.out.println("静态成员方法~~~");
        }
        
        public static void main(String[] args) {
            //普通成员方法必须通过对象来调用
            Test01 t1 = new Test01();
            t1.print1();
            //可以直接调用静态方法
            print2();
        }
    }

    3.static 使用之静态初始化块

    Java 中可以通过初始化块进行数据赋值。如:

    public class Test02 {
        String name; // 定义一个成员变量
        //通过初始化块为成员变量赋值
        {
            name = "cjj";
        }
    }

    依次执行这些代码块。如果使用 static 修饰初始化块,就称为静态初始化块。

    注意:

    静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量

    我们来看一段代码:

    public class Test02 {
        int num1;
        int num2;
        static int num3;
    public Test02() {// 构造方法 num1 = 11; System.out.println("通过构造方法为变量num1赋值"); }
    {
    // 初始化块 num2 = 22; System.out.println("通过初始化块为变量num2赋值"); }
    static {// 静态初始化块 num3 = 33; System.out.println("通过静态初始化块为静态变量num3赋值"); } public static void main(String[] args) { Test02 t1 = new Test02(); //创建对象 System.out.println("num1:" + t1.num1); System.out.println("num2:" + t1.num2); System.out.println("num3:" + num3); } }

    运行结果:

    通过静态初始化块为静态变量num3赋值
    通过初始化块为变量num2赋值
    通过构造方法为变量num1赋值
    num1:11
    num2:22
    num3:33

    通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法。由于静态初始化块只在类加载时执行一次,所以当再次创建对象 hello2 时并未执行静态初始化块。

    类是在第一次使用的时候才加载,加载之后就不会移除

  • 相关阅读:
    【转】 java中Class对象详解和类名.class, class.forName(), getClass()区别
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    107. Binary Tree Level Order Traversal II
    109. Convert Sorted List to Binary Search Tree
    108. Convert Sorted Array to Binary Search Tree
    110. Balanced Binary Tree
    STL容器迭代器失效问题讨论
    113. Path Sum II
    112. Path Sum
  • 原文地址:https://www.cnblogs.com/chuijingjing/p/9452893.html
Copyright © 2011-2022 走看看