static关键字
概述:
static:就是对象共享一份数据。一旦使用了static修饰,那么被修饰的内容将不在属于对象,而是属于类。
比如,教室中的饮水机,我们每个人都可以使用它,但它并不是我们个人的东西。
Java中的static关键字可以修饰成员变量、成员方法、以及静态代码块
。
修饰成员方法:
语法格式
static 数据类型 变量名;
static String name;
注意事项:
1、被static修饰的成员变量叫
静态变量
。2、静态变量的调用:
类.静态变量
package com.lyc.lesson;
class Person{
String name; //成员变量
int age;
static String country; //静态变量
}
public class Lesson01 {
public static void main(String[] args){
//对象成员变量的调用
Person p = new Person();
p.name = "张三";
p.age = 28;
System.out.println(p.name+","+p.age);
//静态变量的调用
Person.country = "中国"; //静态变量的赋值
System.out.println(Person.country); //静态变量的取值
}
}
上述案例中,分别声明了成员变量和静态变量。对于成员变量的赋值和取值,我们一般都是通过对象的引用来完成,而对于静态变量的赋值和取值
,我们是直接通过类名.变量名
来完成的.
关于成员变量的内存问题:
我们知道,对于静态变量,我们即可以通过类来调用,也可以通过对象来调用的。如果我们在类调用静态变量赋值的基础上,再通过对象调用对静态变量赋值会怎么样?如下案例
package com.lyc.lesson;
class Person{
String name;
int age;
static String country;
}
public class Lesson01 {
public static void main(String[] args){
//对象成员变量的调用
Person p = new Person();
p.name = "张三";
p.age = 28;
System.out.println(p.name+","+p.age);
//静态变量的调用
Person.country = "中国";
p.country = "PRC";
System.out.println(Person.country); //PRC
}
}
输出结果为PRC。为什么会出现这种问题呢?我们对static的内存进行分析。
我们知道在整个内存中,不仅有栈,堆,还有方法区。而方法区中就可以存放static修饰的变量,而在堆和方法区之间存在一个通道,当我们调用对象对静态变量赋值时,在堆和方法区中的这一变量的值都会改变,所以输出的结果为PRC。
修饰成员方法:
语法格式
public static 返回值 方法名称(参数列表){
}
静态方法的调用
类名.静态方法名称();
package com.lyc.lesson;
class Dog{
//成员方法
public void eat(){
System.out.println("狗吃狗粮");
}
//静态方法
public static void sleep(){
System.out.println("狗狗快睡觉!");
}
}
public class Lesson02 {
public static void main(String[] args) {
//成员方法的调用
Dog dog = new Dog();
dog.eat();
//静态方法的调用
Dog.sleep();
}
}
修饰代码块:
语法格式
static {
语句体;
}
注意事项:
1、只要这个类加载,静态代码块就会执行
2、静态代码块、代码块、构造方法的执行顺序
静态代码块 ===》 代码块 ===》 构造方法
package com.lyc.lesson;
class Cat{
//构造方法
public Cat(){
System.out.println("这是构造方法");
}
//代码块
{
System.out.println("这是代码块");
}
//静态代码块
static {
System.out.println("这是静态代码块");
}
}
public class Lesson03 {
public static void main(String[] args) {
Cat cat = new Cat();
}
}
//输出结果
这是静态代码块
这是代码块
这是构造方法