前言
- Static的一些理解
一、Static是什么?
1.1在java中,static是一个修饰符,用于修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能;被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。
1.2在《Java编程思想》P86页有这样一段话:
“static方法就是没有this的方法。
在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”
总而言之一句话:方便在没有创建对象的情况下进行调用(方法/变量)。
1.3静态变量
static修饰的变量也称为静态变量
静态变量和非静态变量的区别是:
静态变量被所有对象共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。tip:所以定义多次重复使用的变量为静态变量可以省内存资源呀~
1.4 静态代码块
static关键字还有一个比较重要的作用就是用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来依次执行每个static块,并且只会执行一次。
tip:可以用来优化程序性能
class Person{
private Date birthDate;
public Person(Date birthDate) {
this.birthDate = birthDate;
}
boolean isBornBoomer() {
Date startDate = Date.valueOf("1946");
Date endDate = Date.valueOf("1964");
return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
}
}
sBornBoomer是用来判断一个人是否是1946-1964年出生的,而每次isBornBoomer被调用的时候,都会生成startDate和birthDate两个对象,造成了空间浪费,如果改成下面这样效率会更高:
class Person {
private Date birthDate;
private static Date startDate, endDate;
static {
startDate = Date.valueOf("1946");
endDate = Date.valueOf("1964");
}
public Person(Date birthDate) {
this.birthDate = birthDate;
}
boolean isBornBoomer() {
return birthDate.compareTo(startDate) >= 0 && birthDate.compareTo(endDate) < 0;
}
}
二、静态变量基础案例
2.1
public class Duck {
public String name;
public static String color;
public void eat(){
System.out.println("鸭子爱吃蔬菜!");
}
public static void swimming(){
System.out.println("鸭子爱游泳!");
}
}
public class DuckExample {
public static void main(String[] args) {
//直接操作
//static :类名.属性名
Duck.color = "黄色";
System.out.println(Duck.color);
Duck.swimming();
//不是static就不能直接操作了!!!
}
}
2.2
Static修饰的方法称为静态方法,因为静态方法不依靠于任何对象进行访问,而this这个关键字的意思是:对调用方法那个对象的引用;所以既然没有对象,何谈使用this呢?
**
三.静态方法的特点
**
- 静态方法属于类,它不随着对象的变化而变化;
- 静态方法优先于对象而存在;
- 静态方法被所有该类对象所共享(不能超出本类,其他类不能引用);
- 在类中使⽤static修饰的静态⽅法会随着类的定义⽽被分配和装载⼊内存中;⽽非静态方法属于对象的具体实现
四.静态与非静态的区别
非静态方法既可以访问静态数据成员,也可以访问非静态数据成员
静态方法只能访问静态数据方法,因为它是在类的定义时创建;
*
*
- 4.1静态不能引用非静态这一特性,是由于静态的会随着类的定义而被分配和装载入内存中;如果静态引用了非静态的,根本无法从内存中找到非静态的代码段,势必会出错,这种做法Java虚拟机不允许
总结:
1.static是修饰符,修饰类的成员方法、成员变量;
被static修饰的变量叫静态变量,与非静态变量的区别是:静态变量属于类,通过类名.变量名调用,跟对象没关系;
2.静态变量随着类的加载而加载,1.8静态方法处于类的堆内存的静态空间中,可以共享,所以可以节省资源,但要注意,不同的类不能直接共享这个静态区域的内容;1.6处于方法区中。
3.静态方法,不能访问非静态方法;静态方法早于对象存在,非静态方法随着对象加载而加载