JAVA从菜鸟到进阶(一)——static,this关键及类的初始化顺序

2019.1.24
①this关键字

(1)每个对象都有一个this类型的引用
(2)构造函数进栈区 this引用该对象
(3)成员变量进入堆区并初始化
(4)用this来调用构造函数,对this的调用必须是第一条语句

②static关键字
(1)被static修饰的数据能被所有对象所共享
(2)被static修饰的成员多了一种调用方式,类名.静态成员。
(3)static优先于对象存在,因为static随着类加载而存在。
(4)static修饰的数据是共享数据(存储在方法区中的静态区中),对象中存储的数据是特有数据(存储在堆中)
(5)成员变量与静态变量的区别
1.成员变量随着对象的创建而存在,随着对象的被回收而释放。
静态变量随着类的加载而存在。两个变量的生命周期不同。
2.调用方式不同

成员变量只能被对象调用
静态变量可以被对象调用,还可以被类名.静态变量调用
3.别名不同

成员变量也称为实例变量
静态变量称为类变量
4.数据存储位置不同

成员变量数据存储在堆内存的对象中
静态变量存储在方法区的静态区中

静态使用的注意事项
1.静态方法只能访问静态成员(非静态方法即可访问静态,也可访问非静态)
2.静态方法中不可以定义this(对象的引用非静态)或者super关键字
3.主函数是静态的
主函数特殊之处
1.格式固定
2.被jvm所识别和调用
public;最高权限
static;①因为main方法是静态的,jvm调用这个方法就不需要创建任何包含这个main方法的实例。
②如果main方法不声明为静态的,JVM就必须创建main所在类的实例,因为构造器可以被重载,JVM就没法确定调用哪个main方法。
void;无返回值
main;函数名,只是一个JVM识别的固定的名字
String[]args;主函数参数列表,是一个数组类型的参数,而且元素都是字符串类型。

静态变量什么时候用?
1静态变量
当分析对象中所具备的成员变量值都是相同的,这时这个成员变量可以被静态修饰。
只要数据在对象中都是不同的,就是对象的特有数据,必须存储在对象中(非静态)
如果相同数据对象不需要修改,只需使用,不需要存储在对象中定义静态的(节省空间)
2静态函数
函数中有静态变量时 只能用静态函数
函数中只有实例变量时 可用非静态函数和静态函数

静态代码块
在类加载时加载,仅加载一次(用来初始化类)。

构造代码块
在产生对象时加载,每产生一个对象加载一次(用来初始化对象)
构造方法
在产生对象时执行(用来初始化对象)
局部代码块
用来限制变量的作用域

在无子父类关系时如何初始化?


    class Person
    {
    static{}//静态代码块
        {    
            }//构造代码块
            Person()
            {
                   }//构造方法
    }
    class Demo{
    public static void main(String []args)
    {
        Person  p1=new Person();
     }
    }
    ```
    
    
    执行顺序  静态代码块>构造代码块>构造方法
    
    
    拓展:在有子父类关系时如何进行初始化?
    class FATHER
    {
    	int num=9;
    	void show()
    	{
    		System.out.println("F show run"+num);
    	}
    	FATHER()
    	{   show();
    		System.out.println("FATHER cons run"+num);
    	}
    	{
    		System.out.println("fu gou zhao run "+num);
    		num=10;
    	}
    }
    class SON extends FATHER
    {
    	int num=10;
    	void show()
    	{
    		System.out.println("SON show run"+num);
    	}
    	SON()
    	{
    		System.out.println("SON cons run"+num);
    		show();
    	}
    	{
    		System.out.println("ZI GOUZHAO run"+num);
    		num=20;
    	}
    }
    
    
    public class DuoTaidemo2 {
    
    	public static void main(String []args)
    	{
            FATHER s=new SON();
             s.show();
             System.out.println(s.num);
    			}
    }

//进入构造函数若有直接父类 调用构造函数中隐式的语句super();①
//进入父类构造函数,若有直接父类,继续调用super();
//若无进行成员变量显示初始化;②
//进行构造代码块初始化 ③
//初始化父类后回到子类继续重复以上步骤进行初始化。④



你可能感兴趣的:(java从菜鸟到进阶)