【java】static和类的构造器要点

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中特殊的方法,所以构造器也常被称为构造方法。我们根据类来创建对象,就是使用类中的构造器来创建。





发布了26 篇原创文章 · 获赞 34 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章