Static关键字一.概念static最常用的功能就是修饰类的属性和方法,让他们成为类的成员属性和方法,通常将用static修饰成员称为类成员或者静态成员。
1.static变量static变量也称作静态变量,静态变量和非静态变量的区别:静态常量在内存中,当且仅当类初次加载时会被初始化。而非静态变量,在创建对象的时候被初始化。
注意1:初始化的时机不同,一个是在类加载过程初始化,一个是在创建对象的时候。
注意2:非静态方法中不能定义静态常量。
个人理解:非静态方法在创建对象后,在栈中被调用,静态常量在类加载时被调用。
2.static方法在static修饰的方法内部不能调用非静态方法,非静态方法内部可以调用静态方法。而且可以在没有创建任何对象前提下,仅仅通过类本身来调用static方法。
理解:在没有创建对象的情况下,使用类去调用方法/变量。静态常量和静态方法不依赖对象,依赖类。非静态常量和非静态方法依赖对象,所以静态方法中不能调用非静态方法和非静态常量,非静态常量和非静态方法可以调用静态常量和静态方法。
注意:我们常见的main方法就是static方法。所以我们没有创建main对象,就可以直接调用mian方法。
3.静态块stati用来修饰静态代码块以优化程序性能。static可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
[Java] 纯文本查看 复制代码 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();
}
}
用静态块优化:[Java] 纯文本查看 复制代码 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) {
}
}
使用静态块的用途:有些经常使用的变量,避免反复使用占用内存,使用静态块一次加载直到程序结束,只执行一次。
4.面试题[Java] 纯文本查看 复制代码 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);
}
[b][size=14px]} 输出结果是什么?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修饰的,依然只有本类可以使用。
|