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

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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值