Java的static、final关键字

一、 static关键字

  • 可以修饰成员变量和成员方法
  • static关键字特点
    • 随着类的加载而加载
    • 优先于对象存在
    • 被类的所有对象共享
      • 这也是我们判断是否使用静态关键字的条件
    • 可以通过类名调用
/** * Created by taoyali on 2016/10/25. */public class JavaKeyWorld {        
public static void main(String[] args) {            
JavaKeyWorldTest s = new JavaKeyWorldTest();            System.out.println(s.num);           
 s.resetNum2();
 System.out.println(JavaKeyWorldTest.num2);            JavaKeyWorldTest.resetNum2();            System.out.println(JavaKeyWorldTest.num2);           
 System.out.println(s.num2);        
}
}

class JavaKeyWorldTest {    
//非静态变量    
int num = 10;    
//静态变量    
static int num2 = 20;    
public static void resetNum2(){       
 num2 += (int)Math.random();   
 } 

public void resetNum2(int num){       
    num2 += (int)Math.random();    
}   

public int backInt(){       
    return (int)Math.random();  
 } 
public  void  backInt(int num){    
}
}
  • static关键字注意事项

  • 在静态方法中是没有this关键字的
  • 静态方法只能访问静态的成员变量和静态的成员方法

我们怎么理解呢?
1.静态是随着类的加载而加载,this是随着对象的创建而存在。
2.静态比对象先存在。
3.在静态方法:成员变量:只能访问静态变量成员方法:只能访问静态成员方法
4.非静态方法:成员变量:可以是静态的,也可以是非静态的成员方法:可是是静态的成员方法,也可以是非静态的成员方法。简单的理解就是静态只能访问静态。


我们学习了static关键字,那么来继续学习一下静态变量成员变量**的区别吧。

  • A:所属不同 静态变量:属于类,类变量成员变量:属于对象,对象变量,实例变量
  • B:内存位置不同 静态变量:方法区的静态区成员变量:堆内存
  • C:生命周期不同 静态变量:静态变量是随着类的加载而加载,随着类的消失而消失成员变量:成员变量是随着对象的创建而存在,随着对象的消失而消失
  • D:调用不同 静态变量:可以通过对象名调用,也可以通过类名调用成员变量:只能通过对象名调用

二、final关键字

final关键字是最终的意思,可以修饰类,成员变量,成员方法。
    修饰类,类不能被继承
    修饰变量,变量就变成了常量,只能被赋值一次
    修饰方法,方法不能被重写

我们可以写一个Demo来验证一下final关键字
class Fu {
     public int num = 10; 
     public final int num2 = 20; 
   /* public final void show() { } */
}
class Zi extends Fu { 
    // Zi中的show()无法覆盖Fu中的show()
    public void show() { 
        num = 100; System.out.println(num); 
      //无法为最终变量num2分配值 
      // num2 = 200; 
     //打开注释会报错 
     System.out.println(num2); 
   }
}
 public class FinalDemo{
    public static void main(String[] args) { 
         Zi z = new Zi(); z.show();
    }
}

那么final在继承中如何体现呢?

由于继承中方法有一个现象:方法重写。所以,父类的功能就会被子类覆盖掉。有时候为了不让子类去覆盖掉父类的功能,只能让他用,所以,针对这种情况,java就提供了一个关键字:final。

class Fu { 
     public final void show() { 
            System.out.println("这里是绝密资源,任何人都不能修改"); 
    }
} 
 class Zi extends Fu { 
     // Zi中的show()无法覆盖Fu中的show()
    // 
     public void show() {
    // System.out.println("这是一堆垃圾");//
    }
}

public class FinalDemo{ 
    public static void main(String[] args) {
       Zi z = new Zi(); 
       z.show(); 
    }
}

输出结果:
肯定是父类中的输出结果了。

你可能感兴趣的:(Java的static、final关键字)