一、 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();
}
}
输出结果:
肯定是父类中的输出结果了。
网友评论