• Java基础笔记(十五)——封装(续)static关键字


    static 静态的,用static修饰的成员叫静态成员或类成员。类实例化的所有对象都会共用同一块静态空间。一个对象将值改变,其它对象的值也就随之改变了。

    如:public static int price;  //用static修饰成员属性

    public static void eat();  //用static修饰成员方法

    static+成员属性(也叫实例变量、成员变量)——>静态属性、类属性

    static+成员方法(也叫实例方法)——>静态方法、类方法

    static+类——>不存在  (类前不能加static,static是属于类的。类只能有3种修饰符:public、abstract、final)。

    static+方法内的局部变量——>不存在(final可以)

    static+构造代码块——>静态代码块

    static:

    (1)类对象共享。

    (2)类加载时产生,销毁时释放,生命周期长。

    对于普通(非静态)成员,随着一个对象的创建而产生,一个对象销毁,这个对象拥有的属性和方法也就销毁。

    但对于静态成员,类第一次加载就会产生,所有对象都不被使用,彻底被销毁,静态资源才被释放。

    静态成员比非静态成员多一种调用方式,可以用对象名去调用,最好用类名去调用(因为是类成员),包括:

    (1)对象.成员(或this.成员)

    (2)类.成员

    我们知道,普通成员(非静态)方法内可以直接调用其它成员方法,也可以通过this关键字代表当前对象,去调用成员属性和方法。

    非静态成员方法内可以直接访问类中静态成员(静态属性和静态方法)。

    在静态方法中不能直接访问同一个类中非静态成员,只能直接调用同一个类中的静态成员(属性和方法),也不能使用this关键字。

    【static代表类共享,里面当然不能有每个对象自己的实例,而每个对象实例可以去调用类共享的东西。】

    如果想在static方法里使用非static,需要在static方法里实例化对象,再用这个对象去调用非static方法,对象.成员方法(或属性)去访问非静态成员。

    public class Demo {
        char ch='c';
        static char getChar(){
            return ch;//编译出错,静态成员不能引用非静态成员
        }
        public static void main(String[] args){
            System.out.println(new Demo().getChar());
        }
    }

    静态代码块

    (1)普通代码块:方法中的一段代码  { }      顺序执行,先出现,先执行。分别占据独立作用空间。

    public void run(){
           {
               int temp=12;
               System.out.println("普通代码块1,temp="+temp);   //代码块1
           }
           
           {
               int temp=13;
               System.out.println("普通代码块2,temp="+temp);   //代码块2
           }
       }

      public void run(){
           {
               int temp=1;
               System.out.println("普通代码块1,temp="+temp);   //代码块1
           }
           int temp=3;
           {
               int temp=2;  //此处编译出错
               System.out.println("普通代码块2,temp="+temp);   //代码块2
           }
       }
     public void run(){
           int temp=3;
           {
               int temp=1;  //此处编译出错
               System.out.println("普通代码块1,temp="+temp);   //代码块1
           }
    
           {
               int temp=2;  //此处编译出错
               System.out.println("普通代码块2,temp="+temp);   //代码块2
           }
       }

    以上两段代码的int temp=3; 的作用范围都是从开始出现处到程序结束,同一作用范围内,不允许出现同一变量。

    public void run(){
        //   int temp=3;
           {
               int temp=1;
               System.out.println("普通代码块1,temp="+temp);   //代码块1
           }
            System.out.println(temp);  //编译出错,代码段结束,变量数据被回收,也就是作用范围不到这。
           {
               int temp=2;  
               System.out.println("普通代码块2,temp="+temp);   //代码块2
           }
       }

     (2)构造代码块:

    在类中与成员方法并列的一段代码{ }。

    创建对象时调用,优先于构造方法执行。

    若有多段构造代码块,按顺序执行。

    每次实例化对象都执行一次。

    给静态或非静态赋值均可。

    (3)静态代码块:

    构造代码块用static修饰。static{ }

    类加载时调用,优先于构造代码块执行。

    多个静态代码块,按顺序执行。

    无论实例化多少个对象,只执行一次。

    只能给静态属性赋值,非静态不可以。

    即:代码执行顺序为:静态代码块先执行(多个按出现顺序执行),都执行完后,执行构造代码块,然后构造方法。

    若有仅希望执行一次的代码可以放在静态代码块中。

  • 相关阅读:
    MySQL RR隔离 读一致性
    C++奥赛一本通刷题记录(高精度)
    CodeVs天梯之Diamond
    CodeVs天梯之Gold
    CodeVs天梯之Silver
    CodeVs天梯之Bronze
    【2018.1.14】本蒟蒻又回来了
    test
    UVa12545
    UVa1149
  • 原文地址:https://www.cnblogs.com/tendo/p/10500009.html
Copyright © 2020-2023  润新知