Static关键字
一.概念
static最常用的功能就是修饰类的属性和方法,让他们成为类的成员属性和方法,通常将用static修饰成员称为类成员或者静态成员。
1.static变量
static变量也称作静态变量,静态变量和非静态变量的区别:静态常量在内存中,当且仅当类初次加载时会被初始化。而非静态变量,在创建对象的时候被初始化。
注意1:初始化的时机不同,类成员变量是在类加载过程初始化,对象成员常量是在创建对象的时候。
注意2:非静态方法中不能定义静态常量。
2.static方法
在static修饰的方法内部不能调用非静态方法,非静态方法内部可以调用静态方法。而且可以在没有创建任何对象前提下,仅仅通过类本身来调用static方法。
理解:在没有创建对象的情况下,使用类去直接调用方法/变量。静态常量和静态方法不依赖对象,依赖类。非静态常量和非静态方法依赖对象,所以类方法中不能调用对象方法和对象成员变量,对象成员变量和对象方法可以调用类成员变量和类的方法。
注意:我们常见的main方法就是static方法。所以我们没有创建main对象,就可以直接调用mian方法。
3.静态块
stati用来修饰静态代码块以优化程序性能。static可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
public class Number {
private int i;
public Number(int i){
this.i=i;
}
/*
* 判断数值大小的方法,每次调用这个方法都要新建m,n两个数值。
*/
public void isBornBoomer(){
int m = 5;
int n =10;
if(i>5 & i<10){
System.out.println("该数大于5小于10");
}
}
public static void main(String[] args) {
Number p =new Number(8);
p.isBornBoomer();
}
}
用静态块优化:
public class StaticNum {
private int i;
private static int m;
private static int n;
/*
* 使用一次,只在类加载的过程加载一次即可,为了JVM。
*/
static{
m=5;
n=10;
}
public StaticNum(int i){
this.i=i;
}
public void BooleanNumber(int i){
if(i>StaticNum.m & StaticNum.n<10){
System.out.println("静态块的使用");
}
}
public static void main(String[] args) {
StaticNum snum =new StaticNum();
sum.BooleanNumber();
}
}
使用静态块的用途:有些经常使用的变量,避免反复使用占用内存,使用静态块一次加载直到程序结束,只执行一次。
4.面试题
public class Test {
public int aMethod() {
static int i = 0;
i++;
return i;
}
public static void main (String args[]) {
Test test = new Test();
test.aMethod();
int j = test.aMethod();
System.out.println(j);
}
}
输出结果是什么?D
A.0
B.1
C.2
D.编译失败
解析:在aMehtod这个非静态方法中定义了静态常量,是编译错误。
下列哪种说法是正确的(D)
A 实例方法可直接调用超类的实例方法
B 实例方法可以直接调用超类的类方法
C 实例方法可直接调用其他类的实例方法
D实例方法可直接调用本类的类方法
解析:
实例方法:没有被static修饰的方法;
类方法:被static修饰的方法
A实例方法中无法直接调用父类的实例方法,需要创建父类的对象进行调用。
B父类中的类方法如果是private修饰的就无法被子类的实例方法调用。static修饰的方法和变量无法修改访问权限,被private修饰的方法常量,依旧是私有的。
C实例方法中无法直接调用父类的实例方法,需要创建父类的对象进行调用。
D可以。
本题考的是:
1.实例方法依赖对象,类方法依赖于类;
2.static修饰的方法,不会修改private public 等权限。被private修饰的,依然只有本类可以使用。
类方法中可以直接调用对象变量()
A错误
B正确
A错误 类方法无法直接调用对象的变量,如果new出对象的话,可以调用。