Java关键字----final与static
1.final关键字
在java中,final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。
final的基本用法:
1.1 final修饰类
当用final修饰一个类时,表明这个类不能被继承。
1.2 final修饰属性
当用final修饰一个属性时,表明只能在对象初始化时赋值,对象创建后不能再修改属性。
public class Car {
/*
* 定义属性时直接赋值
*/
private final String color ="red";
/*\
* 代码块赋值
*/
private final String color ;
{
this.color ="red";
}
/*
* 无参构造方法赋值/有参数构造方法赋值
*/
private final String color;
public Car() {
this.color="red";
}
public Car(String color) {
this.color=color;
}
}
1.3 final修饰方法
当用final修饰一个方法时,表明方法不能被覆盖(重写)。
1.4 final修饰基本类型
当用final修饰一个基本数据类型变量时,表明变量为只读,不能被改写。
1.5 final修饰引用类型
当用final修饰一个引用类型对象时,表明绑定的对象不能改变,也不能断开绑定(null),但是可以改变对象的内容。
2.static关键字
1)static:在java中,static是一个修饰符,用于修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能
2)用途:方便在没有创建对象的情况下进行调用(方法/变量)。
被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。
3)方法区:定义static修饰的属性、方法会进入到JVM的方法区,方法区不在栈或堆内存中,他是独立于JVM的一块区域。在继承关系中,当创建对象时,static修饰的属性、代码块和方法会最先被加载。
即:
1.类加载是初始化,只初始化一次
2.static空间在内存的方法区,被其它线程共享
3.使用方法: 类名.static方法/属性
2.1 static修饰属性变量
static修饰的属性变量称为静态变量,静态变量和非静态变量的区别:
·静态变量被所有对象共享,在内存中只有一个副本,在类初次加载的时候才会初始化
·非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响
银行取钱例子:
public class Bank {
public static double money = 10000.00;//银行中有10000.00元
public void savaMoney(double money) {//取钱
Bank.money+=money;
}
public void WithdrawMoney(double money) {//存钱
Bank.money-=money;
}
public static double getMoney() {
return money;
}
public static void main(String[] args) {
Bank A = new Bank();
A.WithdrawMoney(10000);//取出一万,余额为0
Bank B = new Bank();
B.savaMoney(200);//存入200,余额为200
System.out.println(B.getMoney()); //200,静态变量被所有对象共享
}
}
2.2 static修饰方法
static修饰的方法称为静态方法。
1)在静态方法中不能访问类的非静态成员变量和非静态方法,因为非静态成员变量和非静态方法都必须依赖于具体的对象才能被调用。
但在非静态成员方法中是可以访问静态成员方法和静态成员变量。
2)static方法是属于类的,非实例对象。在JVM加载类时,就已经存在内存中,不会被虚拟机回收掉,这样内存负荷会很大,但是非static方法会在运行完毕后被虚拟机回收掉,减轻内存压力
3)对于静态方法来说,是没有this的,因为不依附于任何对象
public static void main(String[] args) {
//方法体
}
2.3 static代码块
static修饰的代码块称为静态代码块
1) 静态代码块,用于类的初始化操作。
2)静态代码块可以置于类中的任何地方,类中可以有多个静态初始化块。
3)在类初次被加载时,会按照静态代码块的顺序来执行每个块,并且只会执行一次。
private static double money;
private String Name;
static {
money=1000.00;
}