Java面向对象(三)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{ } --- 静态代码块
创建子类时执行顺序: 父类静态---> 子类静态 ----> 父类非静态 ---->子类非静态 (规律: 静态优先于非静态,父类优先于子类)
类加载的时候执行,实际上静态代码块是随着类加载而加载到静态区,在类创建对象或者执行方法之前执行一次。而且只执行一次,后续不再执行。
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{ } --- 静态代码块
执行顺序: 父类静态---> 子类静态 ----> 父类非静态 ---->子类非静态