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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马李刚 黑马帝   /  2011-9-25 19:41  /  2523 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

private Son(){}
private static Son son=new Son();
public static Son getInstance(){
   return son;
}
红色部分(static)有什么作用啊?

评分

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

查看全部评分

14 个回复

倒序浏览
黑马网友  发表于 2011-9-25 19:46:05
沙发
static的对象一样可以被重定向啊,而单例除了static的引用外啊,最主要的是单例的构造器是private的啊,这样其他人都不可以new它了,不可以new这才是单例的核心思想所在吧

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-25 20:39:51
藤椅
因为下面getInstance方法是static 的(即不需要产生对象即可使用)
当它使用return son的时候就可以使用上面的同样不需要对象调用的son啦
回复 使用道具 举报
黑马网友  发表于 2011-9-25 20:54:18
板凳
static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。

 static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-25 21:52:44
报纸
使用static定义的话,每次被调用的时候,不一定要创建一个新的对象,把构造方法定义为private类型,staticl定义的变量引用该类的唯一实例。

评分

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

查看全部评分

回复 使用道具 举报
你不是单例吗,那就不能随便new对象啊,所以构造方法得私有的,但你得对外提供个getInstance方法
回复 使用道具 举报
静态,只存在一次,要是没有,会无限循环
回复 使用道具 举报
黑马网友  发表于 2011-9-26 18:17:45
8#
单例设计模式就是为了让所以的对象引用指向同一个对象实例,为了达到这个效果,我们就必须在一个类的内部进行对该类的构造函数进行私有化,这样其他的类就不能直接new这里类的对象了。此时我们就必须在这个类中创建该类的对象private static Son son=new Son(); 这里加上了private是为了不让外部直接访问son这个变量,因为变量一般是不能被直接访问的,这样可以增加安全性。至于说static的作用是因为你必须对外提供一个取得这个类的实例的方法,因为这个类在外部已经不能创建实例(构造函数被私有化了),所以你提供的这个函数必须是static的,这样你就可以在其他类中使用该类的名称去调用该类的函数,这时这个函数就必须是static的了,又因为这个函数是把这个类的对象实例传出去,所以此时你刚才创建的那个对象就必须是static的了,因为静态的函数访问的属性必须是静态的(静态的东西随着类的加载而加载)

评分

参与人数 1技术分 +1 收起 理由
admin + 1 答题有分!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-27 18:41:45
9#
public static Son getInstance(){
   return son;
} 因为这个方法是静态的,静态的只能访问静态的,所以private static Son son=new Son(); son这个成员变量要被标记为static
回复 使用道具 举报
黑马网友  发表于 2011-9-27 20:21:18
10#

static 在单例中的作用

其实这个问题你可以反推一下 就知道答案了
  单例既然是让一个类只有一个实例 而且构造函数是私有的 也就是说不能通过new创建对象
那么它是外界是通过什么得到这个类的实例的
肯定是方法 对吧 那么对象都不能创建了 也就是说对象不能娶调用方法  那么只有类去调用方法了
当一个类去直接调用一个方法  那么方法一定是static修饰的  静态方法访问的成员一定是静态的  所以为什么private static Son son=new Son(); 有static
静态变量 是类一创建就存在 而非静态是当创建了对象才存在
二个生命周期就不一样 静态变量的生命周期很长
其实我们平时说内存分为堆和栈,
其实内存中有很多区!其中就有一个是静态区 专门存放静态属性的!

评分

参与人数 1技术分 +1 收起 理由
admin + 1 答题有分!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-28 00:08:01
11#
就自己的理解,简单而言
private static Son son=new Son();
为什么要加static,?
1,首先要明白一个成员变量加上static与不加上static的区别
加上static表明这个成员变量是所有对象所共有的 ,反之则为每个对象都有自己独立的son变量.

2,因为是单例,必须要提供一个静态的方法来获取实例,既然这个方法是static,一个静态的方法不能使用静态的成员变量,否则无法编译通过,

评分

参与人数 1技术分 +1 收起 理由
admin + 1 答题有分!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-28 00:19:47
12#
其实我觉得应该是多线程的原因 ,所以要早期实例化
回复 使用道具 举报
黑马网友  发表于 2011-9-29 17:08:09
13#
static 是一种修饰符,用于修饰类成员(成员函数、成员变量)。一般用于修饰共享性数据,比如学生类的班号都一样,就定义一个static静态,在对象实例化的时候就可以直接调用。
回复 使用道具 举报
黑马网友  发表于 2011-10-1 19:19:41
14#
1. 理解静态的基本含义,比如我说湖面是静态的,那湖里的水就不会动,刮风也不动。那么JAVA中的静态基本概念就是,凡是静态的东西,都和对象(实例)无关,是固定的公有信息。

2. 静态方法只能访问静态成员变量,之所以要用静态的方法,也是因为该方法和对象无关,没有特有信息,只需类名.方法名即可。

3. 所以红色部分的static 其实只是为了配合静态方法而添加的。

评分

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

查看全部评分

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