在刚刚学习java时接触了static,如类中主方法public static void main(String [] args),以前也是“不求甚解”,正所谓基础不牢地动山摇啊!
现在要对基础知识做一个深刻的理解
1、static关键字
static关键字用于修饰:属性、方法、内部类、代码块。
static修饰的资源属于类级别,是全体对象的共享资源
1)static修饰的属性(静态属性/类属性)
根据上面的说法静态属性应该是该类全体对象的共享属性
如下代码
package com.shxt.bishi;
class Person{
String name;
static String city;
int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person(String name, String city, int age) {
super();
this.name = name;
this.city = city;
this.age = age;
}
public String talk(){
return "名字:"+name+","+"国家:"+city+","+"年龄:"+age;
}
}
public class StaticDemo {
public static void main(String[] args) {
Person p1=new Person("张三", "中国",25 ) ;
Person p2=new Person("李四", "中国",20 ) ;
Person p3=new Person("王五", "中国",30 ) ;
System.out.println(p1.talk());
System.out.println(p2.talk());
System.out.println(p3.talk());
System.out.println("static属性的共享的体现");
Person.city="美国";
Person p4=new Person("张三", 25);
Person p5=new Person("李四", 20);
Person p6=new Person("王五", 30);
System.out.println(p4.talk());
System.out.println(p5.talk());
System.out.println(p6.talk());
}
如果没有static修饰,如果有50个对象,那么就得修改50次city这个属性
类加载的过程,类本身也是保存在文件中(字节码文件保存着类的信息)的,java会通过I/O把类的文件读入JVM,这个过程 称为类的加载
JVM会通过类路径(CLASSPATH)来找字节码文件,需要时进行类加载,生成对象是先加载后构造
注意:
static修饰的属性是在类加载时被创建并进行初始化,类加载的过程就一次,也就是类变量只会创建一次
2)static修饰的方法(静态方法/类方法)
会使这个方法成为整个类共有的方法,可以用“类名.方法名”调用
注意:
static修饰的方法不能访问本类中的非静态成员变量(非静态成员变量需要实例化才能用),但本类中的非静态方法,可以访问本类静态变量(类加载时初始化)
我们最熟悉的主方法之所以要使用static修饰的原因:就是因为在类加载是无法创建对象,而静态方法的调用不需要实例化(通过对象调用),所以在类加载时就可以
通过main方法来执行程序
3)static修饰的代码块
这是这个代码块叫做静态代码块,这个代码块只在类加载时执行一次
如下面的代码
从执行结果看出static修饰资源的过程