static 关键字
首先我们从字面意思去分析它,它的意思是静态的,就是一直存在的。
生活上
那么在我们的生活中的表现有哪些:
比如说公交车:1 公共资源 ;2 运行与自己无关;3很常用,没有的话就很麻烦,需要你自己开私家车。
Java中
代码中也是如此,因为有些东西都需要用,如果多次编译的话会很占内存,这种时候就需要static关键字来形容了。
1 static修饰成员变量
static int age;
【注意事项】:
1.使用static修饰成员变量的时候,只需要记住一种调用方式
类名.属性名字
2.代码中没有创建任何类对象的时候,static修饰的成员变量已经加载。
3.分析内存:只要是static修饰的成员变量,都是在.class【字节码文件】文件,编译阶段,就直接加载到了内存的数据区。该过程是早于对象的创建的,整个数据区静态的成员属性是伴随着整个程序的结束而结束。
4.保存区域:
类对象 堆区。静态的成员属性保存在数据区
2 static修饰成员方法
声明方式:一个正常的方法前面加上static
public void eat(){}
public static void eat(){} 这个就是静态方法
注意事项:
static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是须依赖具体的对象才能够被调用。
虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。同时要注意,static方法不能被重写。
class Person {
//成员属性
String name;
int age;
static int test = 20;//静态的成员属性
//成员方法
public void eat () {
name = "小明";
testStaticMethod();
System.out.println("小明是高质量人类");
}
//静态方法
public static void testStaticMethod () {
//name = "小风";
//因为静态的方法早于对象的创建,非静态的属性非静态方法是对象创建的时候才调用
System.out.println("静态的成员方法");
//eat();
}
}
class XiaoLing extends Person {
// @Override//重写的严格限制,这个报错证明不是重写的,是你在自己定义的
// public static void testStaticMethod() {
// System.out.println("我是子类的静态方法");
// }
}
public class Demo1 {
public static void main(String[] args) {
Person.testStaticMethod();
Person person = new Person();
}
}
3 static可以修饰代码块
语法格式:
static {
代码
}
类文件只要加载,静态代码块一定加载。
静态代码也是优于对象的创建。
目的:为了在实例化对象之前,做一些准备工作。
静态代码块 > 构造代码块 > 构造方法
class StaticPerson {
public StaticPerson() {
System.out.println("我是构造方法");
}
{
System.out.println("我是构造代码块");
}
static {
System.out.println("我是静态的代码块");
}
}
public class Demo1 {
public static void main(String[] args) {
StaticPerson staticPerson = new StaticPerson();
}
}
那么上面的运行结果很明显就是
我是静态的代码块
我是构造代码块
我是构造方法
小总结
无论是静态成员变量,还是静态成员方法,如果有了static,都推荐使用类名称来进行调用,格式如下:
静态变量:类名称.变量名
静态方法:类名称.方法名