• 关于static


    static是静态的意思;

    static修饰的成员变量,在内存中存在于方法区中,只有一份,非静态的成员变量在堆中,每个对象中都有一份

    public class Demo1 {
        public static void main(String[] args) {
            
            Test t1 = new Test();
            t1.classNo = "12";
            t1.id = 12;
            Test t2 = new Test();
            t2.classNo = "25";
            t2.id = 25;
            System.out.println("t1的id: "+t1.id+"  t1的classNo:"+t1.classNo +"  t2的id: "+t2.id+"  t2的classNo: "+ t2.classNo);
        }
    }

    class Test{
        int id;
        String name;
        static String classNo;
        
    }

    如上代码控制台会输出  " t1的id: 12  t1的classNo25  t2的id: 25  t2的classNo: 25 " ,静态成员变量存在于方法区内且只有一份,非静态的成员变量在堆中,每个对象中都有一份

    静态成员变量的访问方式:
       

       1:通过对象访问
              格式: 对象.成员变量
             
          2:通过类名访问
              格式: 类名.静态的成员变量

    public class Demo1 {
        public static void main(String[] args) {
            
            Test.classNo = "12";
            // Test.id = 12; 会报错,不是静态不可以直接通过类名调用
            
        }
    }
    
    class Test{
        int id;
        String name;
        static String classNo;
        
    }

    如果有数据需要被共享出去,就可以使用static修饰

    静态成员变量和非静态成员变量的区别:

      1:存储位置
            静态成员变量:在方法区
               非静态成员变量:堆中
           
           2:数量
               静态成员变量:在内存中只有一份
              非静态成员变量:有多少对象就有多少份
             
            3:访问方式
                静态成员变量:可以通过对象访问,也可以通过类名访问
                非静态成员变量:只能通过对象访问
               
            4:生命周期:
                静态成员变量:随着类文件的加载而存在,跟着类文件的消失而消失
                非静态成员变量:随着对象的创建而存在,对象被垃圾回收器回收时消失
     
            5:作用
               静态成员变量:共享一个数据给所有对象使用
               非静态成员变量:描述一类事物的公共属性

    当一个类被主动使用时,Java虚拟就会对其初始化(加载这个类,初始化为加载的最后一步),如下六种情况为主动使用:

        1、当创建某个类的新实例时(如通过new或者反射,克隆,反序列化等)
        2、当调用某个类的静态方法时
        3、当使用某个类或接口的静态字段时
        4、当调用Java API中的某些反射方法时,比如类Class中的方法,或者java.lang.reflect中的类的方法时
        5、当初始化某个子类时
        6、当虚拟机启动某个被标明为启动类的类(即包含main方法的那个类)

     static块的执行发生在“初始化”的阶段。初始化阶段,jvm主要完成对静态变量的初始化,静态代码块执行等工作。

         static修饰方法:
           访问方式:
              1:通过对象访问
              2:通过类名访问

        静态方法被调用时执行

         静态方法注意点:
               1:静态方法可以直接访问静态成员(变量,方法),不能直接访问非静态成员, 可以通过对象访问非静态成员
               2:非静态方法可以直接访问静态成员和非静态成员
               3:  静态方法中不能出现this关键字和super关键字
               4:静态方法可以通过类名或者对象调用,非静态方法只能通过对象调用

    public class Demo {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
               
            Person3.study();  // 通过类名调用静态方法
            
            new Person3("aa",20).study(); // 通过对象调用静态方法
            
              System.out.println(Person3.classNo);  // 通过类名访问静态成员变量
        }
    
    }
    
    class Person3{
        String name;
        int age;
        static String classNo = "52";
        
        static{
            
            System.out.println("静态代码块");
        }
        
        public Person3() {
             
        }
        
        public Person3(String name, int age) {
             
            this.name = name;
            this.age = age;
        }
        
        public static void study(){
    //        System.out.println("学习"+classNo);
            
    //        System.out.println("姓名:"+new Person3().name); // 静态的方法不能直接访问非静态的成员变量
             
    //        compare(new Person3());  // 静态的方法不能直接访问非静态的方法
            eat();  // 静态的方法可以直接访问静态的方法
        }
        
        public static void eat(){
            System.out.println("eat..."+classNo); // 静态的方法可以直接访问静态的成员变量
        }
    
        public void compare(Person3 p){
            eat();   // 非静态的方法可以直接访问静态的方法
            
            if(this.age > p.age){
                System.out.println(this.name+"比"+p.name+"大");
            }else if(this.age < p.age){
                System.out.println(this.name+"比"+p.name+"小");
            } else {
                System.out.println(this.name+"和"+p.name+"一样");
            }
        }
        
        public String toString() {
            return "Person3 [name=" + name + ", age=" + age + ", classNo="
                    + classNo + "]";
        }
        
        
    }
  • 相关阅读:
    通过模板类简单实现Spark的JobServer
    aggregate 和 treeAggregate 的对比
    IntelliJ Idea 常用快捷键列表
    dataframe 数据统计可视化---spark scala 应用
    用java api读取HDFS文件
    .net Core 简单中间件使用
    .Net Core Ocelot网关使用熔断、限流 二
    .Net Core Ocelot网关使用 一
    Docker 问题处理
    CentOS 创建用户
  • 原文地址:https://www.cnblogs.com/uoar/p/7123196.html
Copyright © 2020-2023  润新知