zoukankan      html  css  js  c++  java
  • java之static关键字

    static:

      1.翻译为“静态”

      2.所有static关键字修饰的都是类相关的,类级别的。

      3.所有static修饰的,都是采用“类名.”的方式访问。

      4.static修饰的变量: 静态变量

      5.static修饰的方法: 静态方法

    变量的分类:

      变量根据声明的位置进行划分:

        在方法体当中声明的变量叫做:局部变量

        在方法体外声明的变量叫做:成员变量

      成员变量又可分为:

        实例变量

        静态变量

     方法和变量是静态和非静态内存图是什么样子,看一下两幅图。

    当声明为静态变量的时候:
    public
    class Chinese { /** * 身份证号,唯一标识*/ public String idCard; /** * 姓名,一个人一份*/ public String name; /** * 国籍,加static的叫做静态变量 * 静态变量在类加载时初始化,不需要new对象,静态变量的空间就开辟出来了 * 静态变量存储在方法区*/ public static String country = "中国"; public Chinese(String idCard1,String name1){ idCard = idCard1; name = name1; } } -----------Statictest02.java------------------------------------------------------------ public class StaticTest02 { public static void main(String[] args) { /** * 访问中国人的国籍,静态变量应该使用类名.的方式访问*/ System.out.println(Chinese.country); Chinese c1 = new Chinese("1231456456456456","张三");
         System.out.println(c1.name);
         System.out.println(c1.idCard); Chinese c2
    = new Chinese("7897897896748564","李四");
        
    System.out.println(c2.name);
         System.out.println(c2.idCard);
    } }

    不是静态变量
    public class Chinese {
        /**
         * 身份证号,唯一标识*/
        public String idCard;
    
        /**
         * 姓名,一个人一份*/
        public String name;
    
        /**
         * 国籍*/
        public String country;
    
        public Chinese(String idCard1,String name1, String country1){
            idCard = idCard1;
            name = name1;
            country = country1;
        }
    }
    
    
    -----------------------------------------------------------------------
    public class StaticTest02 {
        public static void main(String[] args) {
    
            Chinese c1 = new Chinese("1231456456456456","张三","中国");
            System.out.println(c1.name);
            System.out.println(c1.idCard);
            System.out.println(c1.country);
            Chinese c2 = new Chinese("7897897896748564","李四","中国");
            System.out.println(c2.name);
            System.out.println(c2.idCard);
            System.out.println(c2.country);
        }
    }

     综上所述:什么时候用静态变量?

    如果这个类型的所有对象的某个属性值都是一样的,不建议定义为实例变量,浪费内存空间。建议定义为类级别特征,定义为静态变量,在方法区中只保留一份,节省内存开销。

     

    实例的:一定需要使用“引用.”来访问。

    静态的:建议使用“类名.”来访问,但使用“引用.”来访问也行(不建议这样使用)

        如果静态的使用“引用.”来访问会让程序员产生困惑,程序员以为是实例的。

    结论:空指针异常只有在什么情况下才会发生?

      只有在“空引用”访问“实例”相关的,都会出现空指针异常。

     综上所述:什么时候用静态方法

      当方法体当中,直接访问了实例变量,这个方法一定是实例变量。

      大部分情况下,如果是工具类的话,工具类当中的方法使用静态方法。

    静态代码块:

    /**
     * 1.使用static关键字可以定义:静态代码块
     * 2.什么是静态代码块,语法是什么?
     * static{
     *     java语句;
     *     java语句;
     *              }
     * 3.static静态代码块在什么时候执行呢?
     *      类加载时执行,并且只执行一次。
     *      静态代码块有这样的特征/特点
     * 4.注意:静态代码块在类加载时执行。并且在main方法执行之前执行。
     * 5.静态代码块一般是按照自上向下的顺序执行
     * 6.静态代码块有什么用?
     *      第一:静态代码块不是那么常用
     *      第二:静态代码块这种语法机制实际上是sun公司给我们java程序员的一个特殊的时刻,这个时机叫做:类加载时机
     * 
     * 具体的业务:
     *      项目经理说了,大家注意了,所有我们编写的程序中,只要是类加载了,请记录一下类加载的日志信息(那年那月那日几时几分几秒,那个类加载到
     *      了jvm当中)
     * 思考:这些记录日志的代码写到哪里呢?
     *      写到静态代码快当中*/
    public class StaticTest06 {
    
        //静态代码块(特殊的时机:类加载时机)
        static{
            System.out.println("A");
        }
        //一个类中可以编写多个静态代码块
        static{
            System.out.println("B");
        }
    
        public static void main(String[] args) {
            System.out.println("hello world");
        }
    
        static{
            System.out.println("C");
        }
    }

    结果:

    A
    B
    C
    hello world

    总结:方法执行顺序:

    第一:对于一个方法来说,方法体中的代码是有顺序的,遵循自上而下顺序执行。

    第二:静态代码块1和静态代码块2是有先后顺序的

    第三:静态代码块和静态变量是有先后顺序的。

  • 相关阅读:
    ndarray转PIL
    215. 数组中的第K个最大元素
    pytorch的分布式
    剑指 Offer 06. 从尾到头打印链表
    最长公共子序列
    剑指 Offer 57
    剑指 Offer 59
    剑指 Offer 48. 最长不含重复字符的子字符串
    Python线程池
    Python 常用内置函数
  • 原文地址:https://www.cnblogs.com/peiminer/p/13645222.html
Copyright © 2011-2022 走看看