一. 关键字static
- 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new 关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份,例如:所有中国人都有个国家名称,每个中国人都共享这个国家名称,不必在每个中国人的实例对象中都单独分配一个用于代表国家名称的变量。
- 类属性作为该类各个对象之间共享的变量。在设计类时,分析哪些类属性不因对象的不同而改变,将这些属性设置为类属性。相应的方法设置为类属性。
如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法,从而简化了方法的调用。 - 使用范围:在Java类中,可用static修饰属性、方法、代码块、内部类
被修饰后的成员具备一下特点:
随着类的加载而加载
优先于对象存在
修饰的成员,被所有对象所共享
访问权限允许时,可不创建对象,直接被类调用
public class Person{
private String name;
//private String country;
static String country;//类变量(静态变量)
get\set方法;
//多行注释的快捷方式:Ctrl+Shift+/
//单行注释的快捷键:Ctrl+/
}
public class TestPerson{
public static void main(String[] args){
Person p1 = new Person();
p1.setName(“张三”);
Person.country=“中国”;//每个对象都能访问,
//p1.setCountry(“中国”);
Person p2 = new Person();
p2.setName(“李四);
System.out.println(Person.country);
//p2.setCountry(“中国”);
}
}
- static方法:一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因此它不依附于任何对象。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都必须依赖具体的对象才能够被调用。
static变量:也称作是静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
Static代码块:static关键字还有一个比较关键的作用就是用来形成静态代码块以优化程序性能。Static块可以置于类中的任何地方,类中可以有多个static块。再类初次被加载是的时候,会按照static块的 顺序来执行每个static块,并且只会执行一次。
public class StaticDemo{
private int id;
static String name = “static”;
//静态代码块
static {
system.out.println(“我是静态块);//不管创建多少个对象,只执行一次
}
public static void method(){//静态方法
//静态方法里没有this、super关键字
//this.id=1;
//静态方法中不可以调用非静态成员
//id = 1;
system.out.println(“我是静态方法”);
}
}
class Test{
public static void main(String[] args){
//1.类名.方法名
StaticDemo. method();//建议使用
system.out.println(StaticDemo.name);
//2.
StaticDemo s = new StaticDemo();
s. method();//不建议使用,出现警告
system.out.println(s.name);
//3.
StaticDemo s1 = null;//也同样可以正常输出,与对象无关,存在于方法区,不建议使用
s1. method();
system.out.println(s1.name);
}
}