static关键字
一、关键字static
1.1当我们编写一个类
其实就是在描述其对象的属性行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这是系统才会分配内存空间给对象,其方式才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下。某些特定的数据在内存空间里只有一份,例如所有中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。
class Circle
{
private double radius;
public Circle(double radius){this.radius=radius;}
public double findArea(){return Math.PI*radius*radius;}
}
//创建两个Circle对象
Cidcle c1=new Circle(2.0);//c1.radius=2.0
Circle c2=new Circle(3.0);//c2.radius=3.0
Circle类中的变量radius是一个实例变量(instance variable),他属于类的每一个对象,不能被同一个类的不同对象所共享。
上例中c1的radius独立于c2的radius,存储在不同的空间。c1中的radius变化不会影响c2的radius,反之亦然。
1.2 static是一个关键字
1、用于修饰类的成员(属性,方法,内部类)。
2、若访问权限允许的情况下,static修饰的成员可以通过类名方法来访问,既可以再不创建对象的情况下访问。当然也可以通过对象点的方式来文本
3、static修饰的成员成为类成员, 为类的所有的实例所共享。
4、在static方法内部只能访问类的static属性,不能访问类的非static属性。反之,非static方法可以访问static成员。
5、因为不需要实例就可以访问static方法,因此static方法内部不能有this和super
6、如果在一个静态的方法中需要调用本类的非静态属性的话是不可以的,因为静态的方法是可以直接用类名点出来的,但是在这个静态方法中存在非静态的属性,非静态的属性需要对象去调用,例如:
class TestCircle(){
int age;
//这是一个错误的用法
static void test(){
age="12"
}
}
1.3非静态代码块
1、非静态代码块和赋值谁在前面谁就先执行,然后才会执行构造器里面的东西。
2、像一个不带参数的构造器,每一次都会执行。
1.4 静态代码块
1、static修饰的代码块,当类被加载时,且只被加载一次,作用为对静态属性进行初始化。
class Person{
public static int total;
static{
//这是静态代码块
total = 100;
System.out.println("in static block!");
}
public class Test{
public static void main(String[] args){
System.out.println("toatal = "+Person.total);
System.out.println("toatal = "+Person.total);
}
}
}
二、单子模式
1.1这是static最重要的一个模式
所谓的单子模式就是
所谓类的单态设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类智能存在一个对象实例。
1、在类的外部不能通过new构造器的方式创建实例,把构造器隐藏起来,即构造器私有化。
2、因为在类的外部不能创建类的实例,只能在类的内部创建。
3、为了让类的外部可以直接使用该实例,使用static修饰。
4、不能在类的外部可以修改该属性:私有化该属性,同时提供共有的get方法来访问。
public class Single {
private Single(){
}
private static Single instance = new Single();
public static Single getInstance(){
return instance;
}
}
``