听完饿汉式课程后的问题

听完饿汉式课程后的问题

1、创建SingletonOne私有静态实例,
private static SingletonOne instance=new SingletonOne();
我理解给对象加private修饰符,限定声明对象并实例化只能在本类实现,出了本类在其他类无法对象实例化。但是为什么加static。加了static后就不是普通的该类对象了,老师能把instance叫做静态对象、类对象吗?

2、既然只能实例化唯一对象,final含有终极的意思,使用final修饰:final static SingletonOne instance=new SingletonOne();可以吗?

3、实例化对象,就是具体化一个实在的、being、存在的、不是模板的实体,老师我的理解对吗?

5、既然实例化对象,却又不传值,private static SingletonOne instance=new SingletonOne();。老师,在我的理解里,此时的对象跟空的没有区别,就像从Animal类里实例一只动物,没有名字年龄,算哪门子的实例?

6、创建公有静态方法返回静态实例对象这里,public static SingletonOne getInstance(),我理解得把对象返回到其他类里,不然对象只能在本类使用。但是为什么要给此方法添加static,使此方法成为静态方法?

7、都说单例模式只能有一个对象,那么在测试类里出现了两个SingletonOne的对象:
SingletonOne one =SingletonOne.getInstance();
SingletonOne two=SingletonOne.getInstance();
通过类名.方法名的形式:SingletonOne.getInstance();返回对象,再赋值给one和two,此时就有了两个对象了,还说单例模式有且只有一个对象,这是怎么回事?

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

1、关于同学的第一个问题:为什么要加static,在类加载时,只创建一个对象是什么意思。

用static修饰的属性,会在加载这个SingletonOne类时,就执行这个 

private static SingletonOne instance=new SingletonOne(); 这个句话,并且只执行一次, 

换句话说,给你个场景想象一下:假如这个对象是一张图片

比如当你想引用一张图片时候,人家已经画好这个图片了(private static SingletonOne instance=new SingletonOne();),但是,这个是人家自己的版权(private),但是允许你使用

你可以直接通过 public static SingletonOne getInstance()这个方法拿到这个图片去用。

并且,你要想用图片,借来借去还是最初做好的这个图片,你再借多少遍,还是这张图片。

而static 修饰,就体现了,你在去借之前,人家已经做好了这个图片。人家构思这张图片的时候就做出来了。

2、关于同学说的第二个问题。

是的,创建实例是在 一开始就创建了的。同学可以理解为,你要在其他类中引用这个类的实例。

而java中有这样一个规定,同学这里可以先记住。使用static修饰的公有方法或公有属性,可以通过类名之间调用。退一步说,假如我们不给它用static修饰,它就得创建对象,用对象去调用方法,这就不符合我们的初衷了啊,我们的初衷就是不能让它可以随便就创建新的对象啊。所以,我们需要用static给它修饰一下,让它通过类名就可以调用,而不用创建对象。这里同学暂时记住就可以,可以通过类名直接调用static修饰的公有方法或static修饰的公有属性。

3、关于同学说的第三个问题是对的。

就好像,张三引用那张图片,李四也可以引用那张图片,但是无论多少个人引用这个图片,其实大家用的都是同一张图片。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!




好帮手慕珊 2019-05-06 19:54:45

你好!分别回答你的问题:

1、使用static修饰在类加载时加载,并且只创建一个对象。

2、使用当前的修饰符已经可以限制对象唯一了,不需要再加final了

3、你的理解是对的

5、和空是有区别的,空是没有在内存创建对象,而你说的动物没有名字年龄,只是没有为属性设置值,但是实例是存在的。

6、是的,getInstance()方法会在其他类中调用,用于创建实例。因为我们要用类名去调用getInstance()方法,所以需要是静态方法

7、虽然创建了两个对象,但他们的内存地址一样,所以不论调用多少次getInstance()方法,得到的都是一个对象。

祝学习愉快!

  • 提问者 鱼儿0001 #1
    首先感谢老师的回复。细细看了你的回复,对有的点还是不懂。1、private static SingletonOne instance=new SingletonOne();我的问题是为什么要加static。老师的回答:使用static修饰在类加载时加载,并且只创建一个对象。没看懂这句话,是什么意思?2、老师对我问题6的回答:是的,getInstance()方法会在其他类中调用,用于创建实例。这个我看的有点困惑,getInstance()返回对象的引用instance,怎么会在其他类用于创建实例?实例化对象只能在本类弄吧。3、老师,如果把getInstance方法不设置为静态方法,是不是无法在其他类返回对象引用? 4、我理解老师对我问题7的解答。老师,单例模式所说的单例指的是new SingletonOne()是唯一的,不是说存储它地址的引用是唯一的,我可以有许多引用指向SingletonOne,static限定的是SingletonOne是唯一对象,不是限定它的引用唯一,我的理解正确吗?
    2019-05-07 14:45:10
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师