zoukankan      html  css  js  c++  java
  • 面向对象(static关键字)

    static关键字:用于修饰成员(成员变量和成员函数)

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

       随着类的加载而加载

       优先于对象存在

       被所有的对象共享

       可以直接被类名调用

    使用注意:

       静态方法只能访问静态成员

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

       主函数是静态的

     static关键:

      1、被static修饰的成员变量,被所有的对象所共享

      2、静态随着类的加载而加载,随着类的消失而消失

      3、优先于对象的存在

      4、静态成员可以直接被类名所调用

    static的使用注意事项:

       1、静态方法只能调用静态成员,不能调用非静态成员,非静态方法可以调用静态成员也可以调用非静态成员

       2、在静态方法中不允许出现this super关键字,this代表对象,而静态方法执行时还没有对象呢

       3.主函数是静态的

       4、静态是有访问局限性的,只能访问静态的内容

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

        1、非静态成员变量又称为实例变量,静态成员变量又称为类变量

        2、非静态成员变量随着对象的创建而创建,随着对象的消失而消失,静态成员变量随着类的加载而存在,随着类的消失而消失

        3、非静态变量存在于对象堆内存中,静态成员变量存在于方法区中

        4、非静态变量只能被对象所调用,而静态变量可以被类名调用也可以被对象调用。

    静态什么时候用:

        1、成员变量是否需要static修饰呢?该成员变量的值如果每一个对象都相同的话就用static来修 饰,如果不是的话就不用static来修饰了,让这些不相同的存储到每个对象中。

        2、成员函数是否需要被静态修饰呢?

      当函数中访问到了对象中的特有属性时,该函数不能被静态修饰,如果函数中没有访问到对象的特有属性,就可以被静态修饰。如果方法没有访问过特有属性那么可以直接被静态化。简单的说,如果函数中访问了成员变量(实例变量),不能静态,否则可以静态,直接被类名所调用。如果一个类中定义的方法都是静态的,说明这个类是不需要对象的。

    静态代码块

         随着类的加载而执行,而且只执行一次

    优先于主函数执行

    package com_package2;
    
    public class StaticCode
    {
         private String name;
         private static String country;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public static String getCountry() {
            return country;
        }
        public static void setCountry(String country) {
            StaticCode.country = country;
        }
         public void show()
         {
             System.out.println("name="+name);
             System.out.println("country="+country);
             
         }
        
    }
    package com_package2;
    
    public class StaticCodeDemo {
        
        public static void main(String[]args)
        {
            StaticCode p = new StaticCode();
            p.setName("hejinjin");
            p.setCountry("cn");
            //StaticCode p1 = new StaticCode();
            //p1.setCountry(country)
            p.show();
        }
    }
    package com_package2;
    
    public class StaticCode
    {
         private String name;
         private static String country="cn";
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public static String getCountry() {
            return country;
        }
        public static void setCountry(String country) {
            StaticCode.country = country;
        }
         public void show()
         {
             System.out.println("name="+name);
             System.out.println("country="+country);
             
         }
        
    }
    package com_package2;
    
    public class StaticCodeDemo {
        
        public static void main(String[]args)
        {
            //StaticCode p = new StaticCode();
            //p.setName("hejinjin");
            //p.setCountry("cn");
            //StaticCode p1 = new StaticCode();
            //p1.setCountry(country)
            //p.show();
            System.out.println(StaticCode.getCountry());没有创建对象就可以调用静态的对象,由此可以看出,静态成员变量随着类的加载而存在。
            
        }
    }
    package com_package2;
    
    public class StaticCode
    {
         private String name;
         private static String country="cn";
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public static String getCountry() {
            return country;
        }
        public static void setCountry(String country) {
            StaticCode.country = country;
        }
         public static void show()
         {
             System.out.println("name="+name);//这样是不对的因为静态方法无法访问非静态变量
             System.out.println("country="+country);
             
         }
        
    }
     
    package com_package2;
    
    public class StaticCode
    {
         private String name="kakaka";
         private static String country="cn";
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public static String getCountry() {
            return country;
        }
        public static void setCountry(String country) {
            StaticCode.country = country;
        }
         public  void show()
         {
             System.out.println("name="+name);
             System.out.println("country="+country);
             
         }
         public static void function()
         {
             
             System.out.println("kokokookokok");
         }
         public static void guojia()
         {
             System.out.println("country"+country);
             
         }
         
        
    }
    
    
    


    package
    com_package2; public class StaticCodeDemo { public static void main(String[]args) { //StaticCode p = new StaticCode(); //p.setName("hejinjin"); //p.setCountry("cn"); //StaticCode p1 = new StaticCode(); //p1.setCountry(country) //p.show(); System.out.println(StaticCode.getCountry()); speak(); } public static void speak() { StaticCode p = new StaticCode(); p.setName("hejinjinhaha"); System.out.println(p.getName()); StaticCode.function();//这两个方法没有访问到静态成员变量,所以直接静态化 StaticCode.guojia();//这两个方法没有访问到静态成员变量,所以直接静态化 } }

    静态代码块
    package com_package2;
    
    public class StaticCode
    {
        static
        {
            System.out.println("A");
            
        }
        public void show()
        {
            System.out.println("run");
            
        }
    }
    
    
    package com_package2;
    
    public class StaticCodeDemo {
        static 
        {
            System.out.println("B");
            
            
        }
        public static void main(String[]args)
        {
            StaticCode p = new StaticCode();
            p.show();
            
        }
        static 
        {
            
            System.out.println("C");
        }
        
    }
    
    

    B
    C
    A
    run

    注意执行顺序,先从带主函数的类进入,由于静态代码块随着类的创建而创建,所以优先于主函数执行,然后再执行主函数,在执行主函数的时候用到了StaticCode类,StaticCode类中也有静态代码块,而这个静态代码块也是随着类的建立而存在,所以比show()要执行的早。
    静态代码块的特点就是:随着类的加载而执行并且只执行一次,优先于主函数执行
  • 相关阅读:
    写一个迷你版Smarty模板引擎,对认识模板引擎原理非常好(附代码)
    工作1个月+1个星期
    矫正骨盆前倾!平坦小腹!解决腰痛!
    《非暴力沟通》
    了不起的盖茨比
    X战警系列
    Docker常用命令大全
    学习笔记12
    电子公文传输系统1个人贡献
    实验四 Web服务器2
  • 原文地址:https://www.cnblogs.com/mmlovejj/p/4438292.html
Copyright © 2011-2022 走看看