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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 姚立明 初级黑马   /  2012-2-16 13:21  /  5887 人查看  /  18 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

记得定义类时只需要将构造函数私有化就不能创建对象了,可是我的程序为什么还能创建对象。
class  SingleModeTest
{
        public static void main(String[] args)
        {
                SingleClass a=new SingleClass();
                a.put();
                SingleClass b=new SingleClass();
                b.put();
        }
}

class SingleClass
{
        private static final SingleClass t=new SingleClass();
        private void SingClass(){}
        public static SingleClass getInstance()
        {
                return t;
        }
        public void put()
        {
                System.out.println(this.toString());
        }
}

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

18 个回复

倒序浏览
private void SingClass(){}
构造函数没有返回值 - - - - - -

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
楼主是要做单例模式吧~ 楼上说的对啊,你根本就没有写构造函数~~ {:soso_e183:}

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
楼上说得对,构造函数是没有返回值的

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
看到了,构造函数字母搞错了,开始我也是没加返回值类型,结果编译器提示缺少返回值类型,所以我就加上了。也没往这方面想,谢谢提示啊。
回复 使用道具 举报
1、如果不希望一个类被其他类直接new对象,可以直接把构造方法写成私有的。
2、如果希望向外界提供方法的话,那么可以把这些方法定义为static的,通过类名.方法名就可以调用
3、如果想确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,那么可以采用单例模式,代码如下:
  1. public class SingleClass {  
  2.     private SingleClass() {  //一个私有的构造方法
  3.     }  
  4.     private static SingleClass instance = new SingleClass();  //一个静态的、私有的SingleClass 类型的变量
  5.     public static SingleClass getInstance() {  //公共的静态方法,提供给其他类访问
  6.         return instance;  
  7.     }  
  8.     public void put(){
  9.         System.out.println(this.toString());
  10.     }
  11. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
你还真写错了构造函数的格式。
回复 使用道具 举报
戚雪晖 黑马帝 2012-2-16 22:53:58
8#
构造函数----------------------类名(){}
回复 使用道具 举报
王康 黑马帝 2012-2-17 10:20:48
9#
你的类SingleModeTest没有写构造函数,当然可以被new了.
要在类SingleModeTest中加上
private void SingClass(){}

评分

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

查看全部评分

回复 使用道具 举报
构造函数写错了;
所以你这个程序没有自定义构造函数,还是那个默认的构造函数。
而默认的那个构造函数前面没有private,所以仍然能创建对象

评分

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

查看全部评分

回复 使用道具 举报
大家静一静!不能创建对象的类实际开发中用得到吗???
回复 使用道具 举报
仵先进 发表于 2012-2-17 17:42
大家静一静!不能创建对象的类实际开发中用得到吗???

比如我俩做一个项目、你写的一个类不让我实例化。
回复 使用道具 举报
在很多地方都需要用到,例如枚举,只需要把这个 类的构造方法 前面加一个private关键字就可以了,这样,这个构造方法只能在这个类中使用,而不能被别的类调用,不能调用也就不能创建一个类的对象了,这个知识点在枚举那么出现过,这是那个视频的地址:JAVA基础加强三\第一部分\13_黑马程序员_张孝祥_Java基础加强_用普通类模拟枚举的实现原理    ,你可以去看看,看懂了基本上你就理解了这个问题
回复 使用道具 举报
使用单例的设计模式,可以重新看一下毕老师的单例的视频
回复 使用道具 举报
本帖最后由 【专】【属】 于 2012-2-21 09:20 编辑

也可以用枚举的方式去了。代码如下

public enum Singleton
{
SINGLETON;
//下面定义相关的方法代码块
}
回复 使用道具 举报
你写错了private void SingClass(){}并不是做为一个构造函数,而是一个普通的方法,JAVA的构建函数是不需要返回值的
回复 使用道具 举报
单例模式啊
回复 使用道具 举报
构造函数私有化
回复 使用道具 举报
也可以将不想实例化的类定义成抽象的,构造方法依旧可以定义,还可以定义其它的静态方法,在这个静态方法里即使是实现当前抽象类也是可以的。  到具体应用还需要改进完善,只是提个思路。

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class Test2 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Class clazz = Student.class;
                System.out.println(clazz.getName());
                Method d = null;
                try {
                        d = clazz.getMethod("main",String[].class);
                } catch (NoSuchMethodException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (SecurityException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                System.out.println(d);
               
                try {
                        d.invoke(null,(Object)null);
                } catch (IllegalAccessException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IllegalArgumentException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (InvocationTargetException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
               
        }

}
abstract class Student extends Person {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                System.out.println(Student.name);
        new  Student(){
                void print(){
                System.out.println("hehe");
                }
        }.print();
               
        }
        abstract void print();
}

class Person{
        static String name = "ffdd ";
        void shut(){
               
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马