1.static的最主要作用是:
方便在没有创建对象的情况下进行调用(方法/变量),可以直接通过类名来访问。
2.在静态方法里不可以调用非静态方法,但是在非静态方法里可以调用静态方法。
3.我们最常见的static方法就是main方法,是因为想在不创建对象的情况下调用该方法,所以main方法必须是static类型的。
4.即使没有显示的声明为static方法,类的构造器实际上也是静态方法。
5.static变量:
静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
6.static代码块:
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
例如:
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;
}
}
isBornBoomer是用来这个人是否是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;
}
}
7.java 中static关键字不会影响访问权限,与之有关的只有private,public,protected关键字。
8.可以通过this来访问静态成员变量。
9.静态方法中不可以使用this来访问类的成员变量或者方法,但是在非静态方法中可以。
10.在java中,static不允许来修饰局部变量。
一个问题:下面这段代码的输出是什么?
public class Test extends Base{
static{
System.out.println("test static");
}
public Test(){
System.out.println("test constructor");
}
public static void main(String[] args) {
new Test();
}
}
class Base{
static{
System.out.println("base static");
}
public Base(){
System.out.println("base constructor");
}
}
答案是:
base static
test static
base constructor
test constructor
原因:编译器开始执行的时候,要先去找main方法,找main方法之前会先加载Test类,而在加载Test类的时候发现它继承自Base类,于是开始要先加载Base类,加载Base类的时候,
发现有static块,便先执行static块,然后回去加载Test类,发现有static块,也是先执行块。加载完所有的类以后,开始执行main方法。在main方法中执行new Test()的时候会先调用父类的构造器,然后再调用自身的构造器。(只有在new 类的时候会调用构造器,调用构造方法)
下面说一下构造器:
在java中,每一个类都至少有一个构造器。可以这么理解,构造器就是java中特殊的方法,所以构造器也常被称为构造方法。我们根据类来创建对象,就是使用类中的构造器来创建。