1.概念
static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问,方便在没有创建对象的情况下来进行调用(方法/变量)。如main方法。
2.特点
static修饰静态部分,由static修饰代码有如下性质:
1.static在jvm分配的static空间中。
2.static修饰的属性当且仅当在类初次加载时会被初始化一次,所以初始化顺序也早。
3.static修饰的(全局变量)/ 类的属性,对象可以公共访问,一般使用类名方式访问。(java中static不能修饰局部变量)
eg. Car.price = 1000.0;
4.static静态方法不能访问非静态方法。非静态成员方法中是可以访问静态成员方法/变量的。
3.运用
static变量/属性
static变量也称作静态变量,static修饰类的属性(变量),对象共享。静态变量和非静态变量的区别是:
静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。
而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
在C/C++中static是可以作用域局部变量的,但在Java语法的规定:static是不允许用来修饰局部变量。
在这里插入代码片
static代码块
static关键字还有一个比较关键的作用就是用来形成静态代码块以优化程序性能。(无需重复调用的代码可以写成static代码块
static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
static方法
static(静态)方法,由于静态方法不依赖于任何对象就可以进行访问,所以没有this. 。(this. 指当前对象)
在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
非静态方法可以访问static方法或者代码块或属性。
不创建对象的情况下调用某个方法,就可以将这个方法设置为static。
最常见的static方法就是main方法,因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。
4.案例(初始化顺序,static运用)
Bank.java
package com.wdy.oo;
import lombok.Data;
@Data
/**
* static特点
* 1.static在jvm分配的static空间中
* bank类创建对象可以公共访问
* 2.无论创建几次对象,static属性和方法都只初始化一次
* 3.static初始化顺序早
* 4.static修饰的属性一般用类名访问 如:Bank.balance
* @author wdy
*
*/
public class Bank {
private String name;
private static int balance =100000;//余额 static属性
{
System.out.println("代码块");
}
static {
System.out.println("static代码块");//static 代码块只调用一次
}
public Bank() {
System.out.println("无参数构造方法");
}
public void deposit(int money) {
Bank.balance+=money;
System.out.println("我是deposit方法");
}
public void withdraw(int money) {
Bank.balance-=money;
System.out.println("我是withdraw方法");
}
/*
* 余额 static方法
* static修饰的方法/属性,在类初始加载的时候初始化,且只初始化一次
* 因为static方法不依赖于任何对象就可以进行访问,而非静态必须依赖对象访问
* 所以static方法不能调用静态
*/
public static int getbalance(){
System.out.println("我是static方法");
return Bank.balance;
}
public Bank(String name) {
super();
System.out.println("有参构造方法");
this.name = name;
}
}
BankTest.java 测试类
public class BankTest {
@Test
public void test() {
Bank abc=new Bank();
abc.setName("中国农业银行");
abc.withdraw(10000);
Bank icbc=new Bank();
icbc.setName("中国工商银行");
icbc.withdraw(10000);
Bank ab1c=new Bank("hhh");
System.out.println("有参构造方法结果:"+ab1c.getName());
System.out.println("最终余额为:"+icbc.getbalance());
}
}
结果