初识static
static是静态的意思,这个大家应该都清楚,静态变量,静态方法大家也都能随口道来。但是真正理解静态变量和静态方法么?除了这些static还有什么用处?
static大体上有五种用法:
1.静态导入
2.静态变量
3.静态方法
4.静态代码段
5.静态内部类
静态导入
如何进行静态导入呢?下面我们由一段代码演示静态导入:
package com.example.learnjava:
public class Common{
public static fianl int AGE = 10;
public static void output(){
System.out.println("Hello World!");
}
}
上面是我们定义的一个类.
在另一个保重使用时候,如果不使用静态导入,是这样用的:
package com.example.learnjava2;
import com.example.learnjava.Common;
public class StaticImportTest{
public static void main(String[] args){
int a = Common.AGE;
System.out.println(a);
Common.output();
}
}
使用静态导入
静态导入的语法是:
import static 包名.类名.静态成员变量;
import static 包名.类名.静态成员函数;
注意导入的是成员变量和方法名。
如前面的程序使用静态导入后:
package com.example.learnjava2;
import static com.example.learnjava.Common.AGE;
import static com.example.learnjava.Common.output;
public class StaticImportTest{
public static void main(String[] args){
int a = AGE;
System.out.println(a);
output();
}
}
缺点:过度的使用静态导入会在一定程度降低代码的可读性。
静态变量与静态方法:
在这里先解释下静态对象是什么:
静态对象就是在代码编译前就已经存在于内存中的对象,所以不需要new,并且可以直接用类名调用。所以static只能修饰类的成员变量和方法,不能修饰方法类的局部变量。另外不能被继承,因为它仅属于某个类,但不是其对象。
静态变量和静态方法都属于静态对象,它与非静态对象差别分别在拥有属性上,内存分配上,分配顺序上。
从属性上,静态是类共同拥有的,非静态是类各对象独立拥有的。内存上,内存空间上是固定的,而非晶态是空间各个附属类里面分配,分配顺序:先分配静态对象的空间,继而再对非静态对象分配空间也就是初始化顺序是先静态再非静态.(java中内存大体上有四块:堆,栈,静态区,常量区)
静态代码块
静态代码块就是用static修饰的用{}括起来的代码块,它的主要目的就是对静态属性进行初始化,静态代码块可以有多个,位置可以随便放,它不在任何的方法体内,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
看下面代码
public class Person{
private Date birthDeate;
public Person(Date birthDeate){
this.birthdate = birthDate;
}
boolean isBornBoomer(){
Date startDate = Date.valueOf("1990");
Date endDate = Date.valueOf("1999");
return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate)<0;
}
}
当程序执行到isBornBoomer是用来判断这个人是否是1990~1999年出生的,而每次isBornBoomer被调用的时候,都会生成startDate和birthDate两个对象,造成了空间浪费,如果改成这样效率会更好:
public class Person{
private Date birthDate;
private static Date startDate,endDate;
static{
startDate = date.valueof("1990");
endDate = date.valueof("1999");
}
public Person(Date birthDate){
this.birthDate = birthDate;
}
boolean isBornBoomer(){
return birthdDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate)<0;
}
}
静态类部类
被static修饰的内部类,它可以不依赖与外部类实例对象而被实例化,而通常的内部类需要在外部类实例化后才能实例化。静态内部类不能与外部类有相同的名字,不能访问外部类的普通成员变量,只能访问内部类中的静态成员变量和静态方法(包括私有类型)。
注:只有累不累才能被static修饰,普通的类不可以。