您的位置:首页 > 其它

课时42|封装--static关键字、设计模式之单例模式

2016-09-02 17:06 232 查看

Static修饰过的成员变量和成员方法叫做类变量(静态变量)类方法(静态方法)。

我们需要一种特殊的变量

我们在操作一个变量和方法时,一般会先引用某个类的对象,然后通过【对象名.属性名】,或者【对象名.方法名】进行操作。

但是,如果只想为某一特定变量或方法分配一块空间,使其不需要通过构建对象就能调用,这时候就要使用Static关键字。

从使用变量的目的上就能看出,Static变量,是变量声明之时,就会在内存里开辟出空间的一种变量。而普通变量呢?在声明的时候就存在吗?No!比如我们在一个类里面声明了两个变量,一个方法;

class Teacher{
String name;
int age;
public teaching();
}


它们都是非Static的,所以,在加载类的时候,内存还未对这些变量开辟空间,直到我们new一个对象:

Teacher t1=new Teacher();
Teacher t2=new Teacher();


一个new指令对应一份存储空间。这里的t1和t2各有自己的空间。

对比上面的普通变量,我们再来看静态变量:

class StaticTest{
static int i=47;
}


i现在是一个静态变量,在加载类StaticTest的时候,它也已经有了自己的内存空间。

StaticTest st1=new StaticTest();
StaticTest st2=new StaticTest();


因为i是静态变量,所以st1.i和st2.i实际上是同一块内存,对i的操作会同时改变st1和st2的属性。

因为i不再独立的属于一个个对象,它是和类绑定的,所以作为类变量,调用方式推荐:【类名.变量名】的方式。

静态变量的特点

Static关键字的特点:

1. 一旦用Static修饰后,变量和方法不用通过对象名调用。因为Static修饰的属性和方法属于多个对象共享的数据。调用方法:【类名】.【属性名】和【类名】.【方法名】;

2.当加载类的时候,静态变量即被加载,优先于对象存在;

3.可以修饰语句块,优先于构造方法存在,用来初始化静态变量。

Static关键字注意事项(静态成员优先于对象存在):

1. 静态方法中只能访问外部的静态成员。

2.静态方法中不能出现this关键字。

单例模式

单例模式(某一个类只有一个实例):

1.只有一个对象;

2.必须自行创建这个对象;

3.必须自此自行提供对外接口。

非静态方法可以访问静态变量,因为静态变量产生于非静态方法之前

一个类可以构造多个对象。每个对象都有各自独立的属性。对象A的属性发生变化后,对象B的属性不会随之变化。除非对象A和对象B的属性是一个静态变量

既然可以通过访问类名调用static变量,为什么还要new对象。

1.经常使用static关键字破坏了面向对象语言的封装性

2.属于某个对象的属性,在对象使用结束后就被释放,不会长期占用内存。

3.只有类里面没有任何属性或只有静态属性,此时才可以使用静态方法(这种方法一般为其他对象服务,自己没有属性)。比如arrays类。

public class singleInstance{
public static void main(String []args){
//static getInstance can be only called once
theInstance sin1=theInstance.getInstance();
theInstance sin2=theInstance.getInstance();
}
}
class theInstance{
//3.The action 'new' can only be used in this class
//private static theInstance ins1=new theInstance();
'''只有一个对象'''
private static theInstance ins1=null;
//1.constructor method
//2.private:should not be called by outside
private theInstance(){
System.out.println("**********");
}
//The interface for outside calling use
'''必须自行创建这个对象'''
'''.必须自此自行提供对外接口'''
public static theInstance getInstance(){
if(ins1==null){
ins1=new theInstance();
}
return ins1;
}
}


更多单例模式参考:http://blog.csdn.net/jason0539/article/details/23297037/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐