A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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修饰的,依然只有本类可以使用。


2 个回复

倒序浏览
我来占层楼啊   
回复 使用道具 举报
this is a test!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马