Java面向对象(三)Static

来源:互联网 发布:苹果手机电池修复软件 编辑:程序博客网 时间:2024/03/29 21:44



    static本身是一个修饰符,可以修饰变量、方法、代码块、内部类。

一、static修饰变量 --- 静态变量

    static修饰 变量后这个变量称之为静态变量或类变量。

    静态变量随着类的加而加载到方法去中的静态区,并且在静态区中自动赋予初始值。

    由于静态变量是先于对象存在的,所以静态变量可以 有对象调用,也可由类名调用。

    由于该类 创建的所有对象存储的是静态属在静态区中的地址,所以晶太属性是被所有对象所共享的


问:

1. 静态变量可以定义在函数中么?

解: 不可以

静态变量需要在类被加载的时候加载并被初始化,但是定义在函数中随着类的加载被加载到方法区,并没有被执行,所以静态变量不能被加载。

2. 在构造方法中可以定义静态变量么?

解; 不可以

静态变量需要在类被加载的时候加载并被初始化,但是定义在函数中随着类的加载被加载到方法区,并没有被执行,所以静态变量不能被加载。

3. 在构造代码块中能初始化静态变量么?

解: 可以

静态变量先被加载,在对象创建时执行构造代码块,静态变量被初始化。

4. 可以用this来调用静态变量么?

解: 可以

this是当前活跃对象的引用,静态变量可以由对象后者类调用,所以this可以调用静态变量。

二、静态方法

static修饰方法可以称之为静态方法或类方法。

静态方法是随着类的加载被加载到方法区中的静态区。

静态区中的元素不属于某一个对象,而是归属于类。

静态方法是属于类的,可以通过类调用,也可以通过对象调用。

例: System.arraycopy() 、 Arrays.sort() 、Arrays.toString()

System.out.println() 不是静态方法   ,out是一个对象

问:

1. 静态方法中可以定义静态变量么? 

解: 不可以

静态变量需要在类被加载的时候加载并被初始化,但是定义在函数中随着类的加载被加载到方法区,并没有被执行,所以静态变量不能被加载。

2. 静态方法中可以直接调用本类的非静态函数么?

解: 不可以

任何非静态的函数或属性都需要通过对象来调用。而静态的属性或函数只需要类就可以调用。当通过类调用含有非静态函数的静态函数时,非静态函数没有被对象调用却要执行,产生矛盾!

3. 静态函数可以重载么?

解: 可以

重载要求方法名一致,参数列表不同,与static无关。

但不是真正意义上的 重载。

4. 主函数中可以使用this么?

解: 不可以

this相当于当前活跃对象的引用,而主函数执行是没有对象,所以矛盾。

5. 静态函数可以重写么?

解: 不可以

多态针对的是对象中的方法,从对象的层面来看,而静态是从类的层面来看的。

6. 父子类中可以存在方法签名一致的方法么?

解: 可以

父类有static修饰,子类也必须有static修饰。

静态看的是声明类,非静态看的是实现类。

父子类中存在了方法签名一致的方法的时候,要么都是静态,要么都是非静态。

三、静态代码块

在类内 用static{ } --- 静态代码块

创建子类时执行顺序: 父类静态---> 子类静态 ----> 父类非静态 ---->子类非静态   (规律: 静态优先于非静态,父类优先于子类)

类加载的时候执行,实际上静态代码块是随着类加载而加载到静态区,在类创建对象或者执行方法之前执行一次。而且只执行一次,后续不再执行。



    static本身是一个修饰符,可以修饰变量、方法、代码块、内部类。

一、static修饰变量 --- 静态变量

    static修饰 变量后这个变量称之为静态变量或类变量。

    静态变量随着类的加而加载到方法去中的静态区,并且在静态区中自动赋予初始值。

    由于静态变量是先于对象存在的,所以静态变量可以 有对象调用,也可由类名调用。

    由于该类 创建的所有对象存储的是静态属在静态区中的地址,所以晶太属性是被所有对象所共享的


问:

1. 静态变量可以定义在函数中么?

解: 不可以

静态变量需要在类被加载的时候加载并被初始化,但是定义在函数中随着类的加载被加载到方法区,并没有被执行,所以静态变量不能被加载。

2. 在构造方法中可以定义静态变量么?

解; 不可以

静态变量需要在类被加载的时候加载并被初始化,但是定义在函数中随着类的加载被加载到方法区,并没有被执行,所以静态变量不能被加载。

3. 在构造代码块中能初始化静态变量么?

解: 可以

静态变量先被加载,在对象创建时执行构造代码块,静态变量被初始化。

4. 可以用this来调用静态变量么?

解: 可以

this是当前活跃对象的引用,静态变量可以由对象后者类调用,所以this可以调用静态变量。

二、静态方法

static修饰方法可以称之为静态方法或类方法。

静态方法是随着类的加载被加载到方法区中的静态区。

静态区中的元素不属于某一个对象,而是归属于类。

静态方法是属于类的,可以通过类调用,也可以通过对象调用。

例: System.arraycopy() 、 Arrays.sort() 、Arrays.toString()

System.out.println() 不是静态方法   ,out是一个对象

问:

1. 静态方法中可以定义静态变量么? 

解: 不可以

静态变量需要在类被加载的时候加载并被初始化,但是定义在函数中随着类的加载被加载到方法区,并没有被执行,所以静态变量不能被加载。

2. 静态方法中可以直接调用本类的非静态函数么?

解: 不可以

任何非静态的函数或属性都需要通过对象来调用。而静态的属性或函数只需要类就可以调用。当通过类调用含有非静态函数的静态函数时,非静态函数没有被对象调用却要执行,产生矛盾!

3. 静态函数可以重载么?

解: 可以

重载要求方法名一致,参数列表不同,与static无关。

但不是真正意义上的 重载。

4. 主函数中可以使用this么?

解: 不可以

this相当于当前活跃对象的引用,而主函数执行是没有对象,所以矛盾。

5. 静态函数可以重写么?

解: 不可以

多态针对的是对象中的方法,从对象的层面来看,而静态是从类的层面来看的。

6. 父子类中可以存在方法签名一致的方法么?

解: 可以

父类有static修饰,子类也必须有static修饰。

静态看的是声明类,非静态看的是实现类。

父子类中存在了方法签名一致的方法的时候,要么都是静态,要么都是非静态。

三、静态代码块

在类内 用static{ } --- 静态代码块

执行顺序: 父类静态---> 子类静态 ----> 父类非静态 ---->子类非静态