• [java学习笔记]java语言核心----面向对象之static关键字


    • static关键字用处

      1. 用于修饰成员变量和成员函数

    • 被修饰后的成员具有以下特点:

        1. 随着类的加载而加载

        2. 优先于对象存在

        3. 被所有对象所共享

        4. 可以直接被类名调用

    • 使用注意

        1. 静态方法只能访问静态成员;非静态方法也可以访问静态成员

        2. 静态方法中不可以写this,super关键字

        3. 主函数是静态的

    • 实例变量(成员变量)和类变量(静态变量)的区别

      1. 生命周期不同

                               成员变量随着对象的创建而存在,随着对象的回收而释放;

                               静态变量随着类的加载而存在随着类的消失而消失

                       2.   调用方式不同

                               成员变量只能被对象调用
                               静态变量能被对象调用也能被类名调用(一般建议使用类名调用)

                       3.   别名不同

                              成员变量也叫实例变量
                              静态变量也叫类变量

                       4.   数据的存储位置不同

                              成员变量数据存储在堆内存中的对象中,所以是对象的特有数据 
                              静态变量数据存储在方法区(数据区或共享数据区)的静态区中,所以也叫对象的共享数据

    • 内存图解

          以下代码在内存中的执行:

    class Person{
    
        private String name;
        private int age;
        static String country = "CN";
        public Person(String name, int age){
            this.name = name;
            this.age = age;
        }
        public void show(){
            System.out.println(Person.country+":"+this.name+":"+this.age);
        }
        public static void method(){
            System.out.println(Person.country);
        }
    }
    class StaticDemo2{
        public static void main(String[] args){
            Person.method();
            
            Person p = new Person("java",20);
            p.show();
        }
    }

    内存图解为:

    static

    说明:

    1. 当执行StaticDemo2这个类时,就会在方法区中创建一个属于该类的区域,并且加载默认的构造函数,接着在StaticDemo2的静态区中加载main方法。
    2. main方法进栈,并开始执行第一句代码:Person.method(); 由于是类名的调用,虚拟机会在classpath环境变量下找Person类(没有配置classpath则在当前目录下找),找到后,就会把该类加载进方法区,同StaticDemo2也会分为静态和非静态区。
    3. 要执行method方法,所以method方法进栈,运行 System.out.println(Person.country);代码,输出“CN”。return掉该方法后,该方法出栈。
    4. 执行new Person对象的操作,该操作前上篇随笔(构造函数中)已有分析,这里不累述。
    5. 执行完所有代码后,main方法出栈。
    • 静态代码块
    static {
        System.out.println("这是静态代码块");
    }

        1.静态代码块

                  随着类的加载而执行,并且执行一次。属于类。

        2.作用

                  用于给类进行初始化。比如像javaAPI提供的Math类,全部为静态的方法,不允许创建对象,这个时候不能用构造 函数进行初始化,因为构造函数一般是给对象初始化,不能创建对象时不可使用。所以就要使用静态代码块来进行一些初始化的操作。

    • 构造代码块

    不同于静态代码块,是属于类的代码块,如:

    class Demo{
        {
            System.out.println("这是构造代码块");
        }
        //。。。
    }

    和对象有关

    可以给所有对象进行初始化,构造函数是给对应的对象进行针对性的初始化。

    每次创建对象时都会执行。静态代码块是在类加载时执行一次。

     

  • 相关阅读:
    MySQL too many connections
    【MySQL】 清除等待连接
    wmic 获得系统硬件信息
    Linux 修改用户名
    初步了解虚拟化
    MySQL show 语句
    php去除bom
    jq闭包
    git
    地址收藏
  • 原文地址:https://www.cnblogs.com/ma-fei/p/4872895.html
Copyright © 2020-2023  润新知