Java面向对象——static(静态)关键字

 

 static关键字:用于修饰成员(成员变量和成员函数);

被static 修饰后的成员具备以下特点:

1、随着类的加载而加载;

2、优先于对象存在;

3、被所有对象共享;

4、可以直接被类名调用。(写法是:类.静态成员)

 

注:静态方法只能访问静态成员;(静态函数和静态成员变量),因为静态加载到内存中时,非静态成员还不存在。所以静态方法无法访问非静态的成员。

静态方法中不可以写this,super关键字。同时,我们每次写代码时,用到的主函数也是静态的。

 

静态的好处:

数据对所有对象开放,它是多个对象的共性数据抽取出来的,有效的节省了空间,减少了在每一个对象中都存储的一分相同数据,同时被静态修饰的成员可以直接被类名调用。

 

静态的缺点:

共性数据的生命周期过长,因为他是随着类的加载而存在,随便着类的消亡而且消亡的。同时静态也会出现访问局限性,因为静态只能访问静态成员。

 

被静态修饰的变量被称为类变量;

成员变量和类变量的区别:

存储位置:

        类变量(静态变量):是随着类的加载而存在于方法区中。

             

 

注:当对象中出现共享数据时,该数据被静态所修饰。对象中的特有数据要定义成非静态存在于堆内存中。

当功能内部没有访问到非静态数据时(对象的特有数据或成员变量、成员函数),那么该功能可以定义成静态的。

 

静态的应用:

每一个应用程序中都有共性内容或功能,可以将这些功能进行抽取,独立封装以便复用。

如果一个工具类中没有使用到对象的特有数据,那么完全可以把该工具类用static静态修饰起来,在其它类中使用该工具时就不必在建立该工具的对象了,直接使用类名点上该方法就可以了,同时为了更为严谨,强制让该类不能建立对象,可以通过将构造函数私有化完成。

 

静态代码块的特点:随着类的加载而且执行,但只执行一次,用于给类进行初始化。

格式:

static
{
       //静态代码块中的执行语句;
}

 

静态代码块和构造代码块之间的区别:

只用static 修饰符开头的代码块是“静态代码块”,该代码块是随着类的加载而执行,只执行一次,它可以用来给类进行初始化。

只用{}一对花括号括住的代码块是“构造代码块”,是给所有该类对象进行统一初始化的,只要创建一个对象就执行一次。

 

示例:

//静态代码块:给类进行初始化,最先执行,优先级最高,类一进内存就执行,终生只执行一次,除非类被消亡后,重新加载类进入内存,才会在执行一次,(这就情况类似于重启一次电脑)
static
{
       System.out.println(“这是静态代码块”);
}
 
 
//构造代码块:给对象进行初始化,一创建对象就执行,优先于其它函数执行,所有new出来的对象都会执行一次,new一个对象就执行一次。
{
       System.out.println(“这是构造代码块”);
}
 
 
//构造函数:给对就对象进行初始化,谁使用该构造函数创建对象,它就给谁进行初始化。
Person(String name,int age)
{
       this.name = name;
       this.age = age;
}