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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王琪 中级黑马   /  2014-6-8 15:54  /  1570 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王琪 于 2014-6-8 20:52 编辑
  1. class Single{
  2.         private Single(){
  3.         }
  4. <b>        public  Single getSingle(){
  5.                 Single s= new Single();
  6.                 return s;
  7.         }</b>
  8.         public void print(){
  9.                 System.out.println("Hello word..");
  10.         }
  11. }
  12. public class SingleDemo {
  13.         public static void main(String[]args){
  14.                 Single d=null;
  15. <b>                d=d.getSingle();
  16.                 d.print();</b>
  17.         }
  18. }
复制代码
为什么会出现
  1. Exception in thread "main" java.lang.NullPoint
  2.         at SingleDemo.main(SingleDemo.java:15)
复制代码
但是这样就对了
  1. class Single{
  2.         private Single(){
  3.         }
  4.         public static Single getSingle(){
  5.                 Single s= new Single();
  6.                 return s;
  7.         }
  8.         public void print(){
  9.                 System.out.println("Hello word..");
  10.         }
  11. }
  12. public class SingleDemo {
  13.         public static void main(String[]args){
  14.                 Single d=null;
  15.                 d=d.getSingle();
  16.                 d.print();
  17.         }
  18. }
复制代码
hello word..



评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

12 个回复

倒序浏览
我发现,Single d没有实例化,所以不能调用非静态方法
  1. class Single{
  2.         private Single(){
  3.                 System.out.println("###");
  4.         }
  5.         public static Single getSingle(){
  6.                 System.out.println("***");
  7.                 Single s= new Single();
  8.                 return s;
  9.         }
  10.         public void print(){
  11.                 System.out.println("Hello word..");
  12.         }
  13. }
  14. public class SingleDemo {
  15.         public static void main(String[]args){
  16.                 Single d=null;
  17.                 d.getSingle();
  18.         }
  19. }
复制代码

***
###
静态方发什么时候加载的呢?
回复 使用道具 举报
这个问题不清楚,先mark一下,等会儿哪位大神来解决了 我也来看看
先帮LZ顶一个
回复 使用道具 举报
出现空指针异常时因为你调用d.getSingle()时,对象d实际为空。既然为空,那肯定调用不了对象的方法啦!

当你把方法getSingle()定义为静态时,在类Single被读到内存中时,静态方法getSingle()也被分配到内存了,实际上调用d.getSingle()等同于直接类型调用,Single.getSingle();
回复 使用道具 举报
静态方法在加载类字节码的时候就在数据区开辟了一块空间,存放静态方法。其实正确的调用静态方法的是
类名.静态方法名,静态方法与对象是否创建无关。
回复 使用道具 举报
tiuwing 发表于 2014-6-8 16:53
出现空指针异常时因为你调用d.getSingle()时,对象d实际为空。既然为空,那肯定调用不了对象的方法啦!

当 ...

嗯,谢谢你,我明白了,嘻嘻
回复 使用道具 举报
123_yaya 发表于 2014-6-8 16:59
静态方法在加载类字节码的时候就在数据区开辟了一块空间,存放静态方法。其实正确的调用静态方法的是
类名. ...

嗯,谢谢你,我知道了
  1. class Single{
  2.         private Single(){
  3.                 System.out.println("###");
  4.         }
  5.         public static Single getSingle(){
  6.                 System.out.println("***");
  7.                 Single s= new Single();
  8.                 return s;
  9.         }
  10.         public void print(){
  11.                 System.out.println("Hello word..");
  12.         }
  13. }
  14. public class SingleDemo {
  15.         public static void main(String[]args){
  16.                 Single d=null;
  17.                 d=Single.getSingle();
  18.                 d.print();
  19.         }
  20. }
复制代码

d=Single.getSingle();
这样就对了,可能我对静态的基础知识不牢固,谢谢你
回复 使用道具 举报
  Single d=null; 既然是单例的,你获取这个对象应该通过类名来获取,不是通过对象
回复 使用道具 举报
liujie445012100 发表于 2014-6-8 19:52
Single d=null; 既然是单例的,你获取这个对象应该通过类名来获取,不是通过对象 ...
  1.         class Single{
  2.         static Single s= new Single();
  3.         private Single(){
  4.                 System.out.println("**");
  5.         }
  6.         public static Single getSingle(){
  7.                 System.out.println("##");
  8.                 return s;
  9.         }
  10.         public void print(){
  11.                 System.out.println("Hello word..");
  12.         }
  13. }
  14. public class SingleDemo {
  15.         public static void main(String[]args){
  16.                 Single d=null;
  17.                  d=Single.getSingle();
  18.                 d.print();
  19.         }
  20. }               
复制代码


这样对吗?>.< 我的基础不太好嘻嘻
单例设计模式
回复 使用道具 举报
王琪 发表于 2014-6-8 20:25
这样对吗?>.< 我的基础不太好嘻嘻
单例设计模式

你这样问我搞的我很不好意思的,哈哈,我得技术分没有你多,现在绝对对了,建议static Single s= new Single(); static 前面加个私有更好了,你说是吗?

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1 赞一个!

查看全部评分

回复 使用道具 举报
哦,谢谢,嘻嘻
回复 使用道具 举报
唉,学习学的好慢哦,看到你们这么厉害,好担心
回复 使用道具 举报
黄梁梦想享 发表于 2014-6-10 20:34
唉,学习学的好慢哦,看到你们这么厉害,好担心

加油,相信自己
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马