Java学习笔记-Static修饰符用法

使用static可修饰类属性、方法、初始化块,可通过类名直接进行访问,用在类中公用的部分,需定义为static。

无static修饰的属性、方法称为实例属性、实例方法,每个实例对象都一一对应自己的属性或者方法;

由static修饰的属性或者方法称为类属性、类方法,每个实例对象都共享该属性或者方法。


静态代码块只能访问静态属性,不能够访问实例属性;或者说在静态方法中,可以访问静态属性,但不能访问实例属性和实例访问,反之成立;

Why?

因为静态属性、静态方法在Classloader时生效,相对形成靠前;而实例属性、实例方法在创建对象之后方可生效,相对靠后;两者之间为存在与不存在的关系;


一个子类在创建一个对象时父子类的JVM启动过程中的形成如下:

父类过程

1、初始化静态属性

2、调用静态初始化块

3、给属性分配内存空间,赋初始值

4、给属性赋缺省值

5、调用非静态初始化块

6、调用构造方法给属性重新赋值

子类过程:

7、初始化静态属性

8、调用静态初始化块

9、给属性分配空间,赋初始值

10、给属性赋缺省值

11、调用非静态初始化块

12、调用构造方法给属性重新赋值


创建子类对象之前,系统先创建父类,静态最先执行(原则:静态优先、父类优先)

则创建一个子类对象正确的顺序应该是:

1、2、7、8、3、4、5、6、9、10、11、12



小类型可以自动转换成大类型,即子类创建的对象可以赋值于父类引用,如:

public class Car{

}
public class QQ extends Car{

}
pulic class Main{
    public static void main(String args)
   {
         Car car = new QQ();
   }
}


静态方法不存在覆盖问题:

public class Person{
public static void test1()
        {---------}
        public void test2()
        {---------}
}
public class Student extends Person{
       public static void test1()
       {----------}
       public void test2()
       {----------}
}
public class Main{
public static void main(String args)
        {
                Person p = new Student();
                p.test1();//调用静态方法,以引用为准,调用引用所在的类方法,此处调用Person类test1方法
                p.test2();//调用实例方法,以对象为准,调用对象所在的类方法,此处调用Student类test2方法
        }
}


你可能感兴趣的:(Java)