A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hel 中级黑马   /  2013-11-1 12:33  /  963 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Singleton {
     
    //私有,静态的类自身实例
    private static Singleton instance = new Singleton();
     
    //私有的构造子(构造器,构造函数,构造方法)
    private Singleton(){}
     
    //公开,静态的工厂方法
    public static Singleton getInstance() {
        return instance;
    }
}

为什么实例对象的时候是static? 不用static行不行?

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

5 个回复

倒序浏览
//公开,静态的工厂方法
public static Singleton getInstance() {
     return instance;
在静态方法中是不能调用实例变量的,就是说这个 intance != this.instance
如果成员变量instance不用static修饰,getInstance里return的instance就相当于(this当前对象的).instance
这个是this的用法的问题

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
因为单例模式,此类只能有一个对象,还在本类的内部实例化的,在其他的类中不能实例化此类对象,
所以要给外部提供访问此类的对象,那么就在本类中提供,因为只有静态方法只需要类名直接调用,不需要对象调用,所以必须要定义成静态的方法。
希望对你有帮助!
回复 使用道具 举报
必须要用到static修饰
public class SingerInstance {
private SingerInstance(){};
private static SingerInstance aa=new SingerInstance();
public static SingerInstance getsingerInstance(){
        return aa;
}
public void ff(){
        System.out.println("哈哈 成功了 yes");
}
}

private static SingerInstance aa=new SingerInstance();
如果不用static修饰   那么在getsingerInstance 方法中 返回值有错误 return aa ; 权限访问不到aa =new SingerInstance();
所以要必须用static 修饰新建对象。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
class Singleton {
     
    //私有,静态的类自身实例
    private static Singleton instance = new Singleton();
     
    //私有的构造子(构造器,构造函数,构造方法)
    private Singleton(){}
  /*   
    //公开,静态的工厂方法。  只能通过这个方法获取对象,所以没有本类对象能调用这个方法,所以只能交给类了,所以是静态的,然后它使用了成员变量instance,所以instance是静态的。
    public static Singleton getInstance() {
        return instance;
    }
*/
}
如果没有这个方法,可以将成员变量instance的一个修饰符private去掉。此时也实现了单例。与只有一个元素的枚举一样,只有一个元素的枚举就是单例的。
static是绝对不可以去掉的,因为构造函数式私有的,你不能自己创建对象,然后通过对象调用。这也不和逻辑——有对象了,还需要干什么?所以只有通过类来调用相关成员了。
回复 使用道具 举报
首先要搞明白单例模式的用途,和基本原理。单例模式就是为了让这个类只有一个对象。如何实现呢,那么只能在类的内部创建对象,而且是私有的,然后用公有的方法来访问,这一点也很好理解。那么,为了访问这个公有方法,就必须得创建一个对象,否则无法访问,对不对?而这一点恰恰与单例模式相反,那么如何解决这个问题呢?这个时候只能用static了,众所周知,static是静态的,凡是静态的,都是在类加载时候就已经存到内存中了,不用去实例化对象,解决了之前的矛盾。当你需要使用这个公有方法时,直接用类名就可以访问到。所以,结论就是static必须有。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马