-------
static(静态)关键字:
用于修饰成员(成员变量和成员函数),不能修饰局部变量。
当被static修饰后,成员不再放于对内存中,而是放于方法区(或叫共享区、数据区)中,在栈和堆之外的空间,同时多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用:类名.静态成员。事物所特有的变量或行为存放与对象当中,共有的存放于共享区中。
1、 特点:
a) 随着类的加载而加载(随着类的消失而消失,说明它的声明周期长);b) 优先于对象的存在(静态是先存在的,对象是后存在的);c) 被所有对象所共享;d) 可以直接被类名调用。
2、实例变量(成员变量)和类变量(静态变量)的区别:
1>存放位置:类变量随着类的加载而 存在于方法区中。
实例变量随着对象的建立而存在于堆内存中。
2>生命周期:类变量生命周期最长,随着类的消失而消失。
实例变量随着对象的消失而消失。
3、 static使用注意事项:
1>静态方法只能访问静态成员,非static方法既可以访问静态也可以访问非静态成员。
2>静态方法中不可以定义this,super关键字(因为static优先于对象存在,所以静态方法不可出现this)。
3>主函数是静态的。
4、 静态利弊:
利:对对象的共享数据进行了单独空间的存储,节省空间,没必要每一个对象中都存储一份。
弊:生命周期长,访问出现局限性(静态方法只能访问静态成员)。
5、静态的定义:
1>静态变量(类变量)的定义:当对象中出现共享数据(不是共享属性,是一个特定的值,属性是对象特有的),该数据被静态所修饰;对象中的特有数据(即属性,属性可以相同)要定义成非静态存在与堆内存中(对象内部)。
2>static函数的定义:当功能内部没有访问到非静态数据数据(对象的特有数据),那么该功能可以定义成static函数。(重点)
对象的出现是为了封装数据,函数是最小的封装体。
6、静态的应用——工具类:
工具类的出现,让程序更严谨,是不需要创建对象的。
将工具类的方法都用static修饰,直接用类名调用。
强制让工具类不能建立对象,可以将构造函数私有化。
7、静态代码块:格式:
static
{
静态代码块中的执行语句。
}
特点:随着类的加载而执行,只执行一次,并优先于主函数(若主函数存在的类中有静态代码块)、构造代码块、构造函数的执行,用于给类进行初始化。
8、设计模式:
java有23种设计模式,单利设计模式:解决一个类在内存中只存在一个对象。
保证对象唯一的方法:
1>为了避免其他程序过多建立该类对象,通过把构造函数私有化来禁止其他程序建立该类对象。
2>为了让其他程序可以访问到该类对象,那么在类中创建一个本类对象。
3>为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式(通过提供一个方法可以获取本类对象)。
class Person
{
private String name = "lisi"; //成员变量(实例变量)
private static String country = "CHINA"; //静态成员变量(类变量:是一个特定的值,生命周期最长)
//静态代码块,当调用该类时第一个执行,进行初始化操作。
static
{
System.out.println("Person code.");
}
//构造代码块。
{
System.out.println("name="+name+",country="+country);
}
//名字赋值方法体。
public void setName(String name)
{
this.name = name;
}
//获取名字。
String getName()
{
return name;
}
//静态方法体,可以直接通过类名调用。
public static void showcountry()
{
System.out.println("country="+country);
}
}
class StaticDemo
{
public static void main(String[] args)
{
Person p = new Person(); //建立对象
p.setName("李斯"); //赋值名字。
System.out.println("name="+p.getName());
Person.showcountry(); //静态函数调用。
}
}
上面代码段仅是为了展示static的简单用法。特别需要注意的是静态函数的定义是仅当该函数不会调用非静态成员时才能定义。且static用于工具类以及设计模式需要我们熟悉,理解设计模式的思想,方便自己写工具类以及一些设计模式,用来严谨代码块,增加代码复用性。