一、static可以修饰的元素
1、类属性(只能是类中的属性,不能是方法里面的)
2、方法
3、代码块
二、静态成员变量
//static 修饰类属性
static String country;
1、所有对象共享,也称为类变量
2、用static修饰的成员变量,它们在类被载入时创建,只要类存在,static变量就存在。
3、两种访问方式:
直接访问:类名.属性
实例化后访问:对象名.属性
4、静态成员变量只会分配一个内存空间,并且是在创建对象中分配的内存空间;而非静态成员变量每new一个就分配一个空间。
证明:静态成员与非静态成员空间分配
/**
*定义一个Person类
*属性:名字,年龄
*行为:say(说话)
*/
public class Person {
public String name;
public int age;
//非静态的count
public int count1;
//静态的count
public static int count2;
public Person()
{
//计算分配内存的次数
count1++;
count2++;
}
}
class Test {
public static void main(String[] args) {
//创建三个对象
Person p1=new Person();
Person p2=new Person();
Person p3=new Person();
//打印创建时分配内存的次数(一个数字表示一次,不是数字的大小)
System.out.println(p1.count1);
System.out.println(p2.count1);
System.out.println(p3.count1);
System.out.println(Person.count2);
}
}
图解静态成员与非静态成员空间分配
三、静态方法
//static 方法
static void sing()
{
System.out.println("北京欢迎你!");
}
1、不需要实例化,可以直接访问,也称为类方法。
2、两种方式访问:
直接访问:类名.方法名()
实例化后访问:对象名.方法名()
3、static方法的作用
简化方法的使用;便于访问静态属性。
4、在同一个类中,静态成员和非静态成员的访问规则
(1)静态成员只能直接访问静态成员(类属性,方法),而不能直接访问类中的非静态成员(但可以通过new 类名.方法名();访问)。
(2)非静态成员可以访问非静态的成员,也可以访问非静态的成员。
(3)静态方法不能使用this,super关键字。
5、如何区分定义变量为静态还是非静态的
当只针对对象所有的/存储的是数据的:定义为非静态的
当只针对类所有的/做事情的:定义为静态的
四、静态代码块
只会执行一次,类第一次加载的时候执行。
可用于连接数据库,这样的话就可以保证一直都可以用。
static{
//代码
}
证明:静态代码块只会执行一次,类第一次加载的时候执行。
/**
*定义一个Person类
*属性:名字,年龄
*行为:say(说话)
*/
public class Person {
public String name;
public int age;
//非静态的count
public int count1;
//静态的count
public static int count2;
public Person()
{
//计算分配内存的次数
count1++;
count2++;
}
static {
System.out.println("I am Static");
}
}
class Test {
public static void main(String[] args) {
//创建三个对象
Person p1=new Person();
Person p2=new Person();
Person p3=new Person();
//打印创建时分配内存的次数(一个数字表示一次,不是数字的大小)
System.out.println(p1.count1);
System.out.println(p2.count1);
System.out.println(p3.count1);
System.out.println(Person.count2);
}
}