java中的static关键字

一、static关键字的基本用法

关于static关键字的使用,最常见的使用是修饰成员变量和成员方法,使用时不需要创建对象再去调用变量和方法,直接类名.变量或方法就可以使用。

1.1、static修饰变量和方法

什么是静态变量(类变量)、静态方法(类方法)?

1、static关键字在修饰静态变量和静态方法时也被称为类变量和类方法,之所以被称为类变量和类方法,是因为静态变量和静态方法完全独立于该类的对象,静态变量和静态方法的加载早于该类的对象,也就是说在该类的对象创建之前,static修饰的类变量和类方法就已经出生存在了。
2、在使用静态变量和静态方法时,直接类名.静态变量或静态方法就可以使用,也可以创建对象,通过对象调用,非常不推荐第二种方法,容易混淆静态和非静态。这种写法也会在javac编译成类名.的调用方式。

什么时候用静态变量和静态方法?

1、静态变量
当你希望该类创建的对象中的成员变量的值都是相同的,该类的所有对象共同拥有同一个变量,这时就可以把这个成员变量定义为静态变量。

这句话看起来有点绕,举个例子就一目了然了。

例如我希望Person类创建的实例中的国家字段的默认值是中国,所以我把country 定义为静态变量

package Test;

public class Person {
	
	private String name;
	
	private int age;
	
	private static String country = "中国";
	
	//生成有参构造器
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	//生成toString方法
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age +",country="+ country + "]";
	}
	
	//测试main方法
	public static void main(String[] args) {
		Person p1 = new Person("张三", 20);
		Person p2 = new Person("李四", 18);
		System.out.println(p1);
		System.out.println(p2);

	}
}

输出结果:

Person [name=张三, age=20,country=中国]
Person [name=李四, age=18,country=中国]

2、静态方法
静态方法多用于工具类中,静态方法只能访问静态变量,不能访问非静态变量和方法,因为在静态方法加载时非静态变量和方法还没有初始化,同样静态方法不属于任何一个实例,所以不能使用this来调用静态方法。
在这里插入图片描述

1.2、静态代码块

1.静态代码块随着类的加载而执行,只会执行一次 ,多用于给静态成员变量赋值。
2.一个类中的可以有多个静态代码块,位置随便,多个静态代码块会按照静态代码块的位置依次执行。

package Test;

public class Person {
	
	private String name;
	
	private int age;
	
	static String country;
	
	//生成无参构造器
	public Person() {
		System.out.println("我是无参构造器");
	}
	
	//给静态变量赋值
	static{
		country = "未知";
		System.out.println("我是静态代码块,我只执行一次");
	}
	
	//测试main方法
	public static void main(String[] args) {
		Person p1 = new Person();
		Person p2 = new Person();
		System.out.println("输出赋值后的静态变量:"+Person.country);
	}
	
	
}

输出结果

我是静态代码块,我只执行一次
我是无参构造器
我是无参构造器
输出赋值后的静态变量:未知

从上面的例子可以看出,main方法中创建了两次Person对象,构造方法执行了两次,静态代码块在给静态变量赋值时只执行了一次,且执行顺序优先于构造方法。

1.3、静态内部类

static关键字在修饰类时只能修饰内部类,在创建静态内部类对象时,不需要创建一个外部类对象再创建一个静态内部类对象,直接用以下语法调用。
格式: 外部类.静态内部类 对象名 = new 外部类.静态内部类();

1.4、静态导包

静态导包 JDK1.5以后新特性, 这种方法的好处就是可以简化一些操作,但是降低了代码的可读性。

//静态导包
import static java.lang.System.out; 
public class Test {
	public static void main(String[] args) {
		//静态导包前
		System.out.println();
		//静态导包后
		out.println();
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值