zoukankan      html  css  js  c++  java
  • static JAVA

    static 关键字:
    使用static修饰的变量是类变量,属于该类本身,没有使用static修饰符的成员变量是实例变量,属于该类的实例。
    由于同一个JVM内只对应一个Class对象,因此同一个JVM内的一个类的类变量只需要一块内存空间,但对应实例变量而言,该类每创建一次实例,就需要为实例变量分配一块内存空间.

    实例变量的初始化时机:

    1.定义实例变量时进行初始化;2,非静态初始化块中对实例变量指定初始值;3,构造器总对实例变量指定初始值。

    非静态初始化块将先获得执行的机会,在构造器执行之前执行。

     1 public class InitTest
     2 {
     3 
     4     public static void main(String[] args)
     5     {
     6         Cat cat = new Cat("Kitty",2);
     7         System.out.println(cat);
     8         Cat c2 = new Cat("Jatfield",3);
     9         System.out.println(c2);
    10     }
    11 }
    12 
    13 class Cat
    14 {
    15     String name;
    16     int age;
    17     
    18     public Cat(String name,int age)
    19     {
    20         System.out.println("执行构造器!");
    21         this.name =name;
    22         this.age= age;
    23     }
    24     
    25     //非静态初始化块总是在构造器执行之前获得执行。
    26     {
    27         System.out.println("执行非静态初始化块");
    28         weight=2.0;
    29         age =0;
    30         //System.out.println("weight =:"+weight);
    31     }
    32     
    33     double weight = 2.3;
    34     public String toString()
    35     {
    36         return "cat [name =  "+name+" age = "+age+" ,weight = "+weight+"]";
    37     }
    38     
    39 }

    运行:

      执行非静态初始化块
      执行构造器!
      cat [name = Kitty age = 2 ,weight = 2.3]
      执行非静态初始化块
      执行构造器!
      cat [name = Jatfield age = 3 ,weight = 2.3]

    隐式调用和显式调用:

    当调用某个类的构造器来创建JAVA对象时,系统总是会先调用父类的非静态初始化块进行初始化,这个调用是隐式执行的,而且父类的静态初始化块总是会先执行,接着会调用父类的一个或多个构造器执行初始化,这个调用既可以通过super显式调用,也可以隐式调用。

         类的继承关系: Object <---Parent<----Mid<---- Sub

    程序会按如下步骤进行初始化:

      1),执行Object类的非静态初始化块(如果有的话)

      2),隐式或显式调用Object类的一个或多个构造器进行初始化,

      3),执行Parent累非静态初始化块(如果有的话)

      4),隐式或显式调用Parent类的一个或者多个构造器进行初始化,

      5),执行Mid类非静态初始化块(如果有的话)

      6),隐式或显式调用Mid类的一个或多个构造器执行初始化,

      7),执行Sub类非静态初始化块(if have)

      8),隐式或显式调用Sub类的一个或多个构造器执行初始化。

    只要在程序创建java对象,系统总会先调用最顶层父类的初始化操作,包括初始化块和构造器,然后依次向下调用所有父类的初始化操作,最终执行本类的初始化操作返回本类的实例。对于调用父类的哪个构造器进行初始化,则分:

      1),子类构造器执行体的第一行代码使用super显式调用父类的 构造器,系统将根据super调用里出传入的实参列表来确定调用父类的哪个构造器;

      2),子类构造器中使用this显式调用本类中重载的构造器,系统将根据this调用里传入的实参列表来确定本类的另一个构造器;

      3),子类构造器中 既没有super 也没有this调用,系统将会在执行子类构造器之前,隐式调用父类无参数的构造器。

  • 相关阅读:
    6.11 修饰符的适用范围
    5.10 对象与垃圾回收
    5.9 枚举类
    5.8 java 11增强的Lambda表达式
    5.7 内部类
    5.6 接口
    5.5 抽象类
    5.4 final修饰符
    5.3 类成员
    5.2 Object类中两个需要被重写的方法
  • 原文地址:https://www.cnblogs.com/happinessqi/p/3439163.html
Copyright © 2011-2022 走看看