黑马程序员技术交流社区

标题: 如何定义一个类使之不能创建对象。 [打印本页]

作者: 姚立明    时间: 2012-2-16 13:21
标题: 如何定义一个类使之不能创建对象。
记得定义类时只需要将构造函数私有化就不能创建对象了,可是我的程序为什么还能创建对象。
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());
        }
}
作者: 陈丹阳    时间: 2012-2-16 13:23
private void SingClass(){}
构造函数没有返回值 - - - - - -
作者: 丁晓宇    时间: 2012-2-16 13:26
楼主是要做单例模式吧~ 楼上说的对啊,你根本就没有写构造函数~~ {:soso_e183:}
作者: 冯祖焱    时间: 2012-2-16 13:28
楼上说得对,构造函数是没有返回值的
作者: 姚立明    时间: 2012-2-16 13:29
看到了,构造函数字母搞错了,开始我也是没加返回值类型,结果编译器提示缺少返回值类型,所以我就加上了。也没往这方面想,谢谢提示啊。
作者: 彭坤    时间: 2012-2-16 13:38
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. }
复制代码

作者: 黄锦成    时间: 2012-2-16 15:39
你还真写错了构造函数的格式。
作者: 戚雪晖    时间: 2012-2-16 22:53
构造函数----------------------类名(){}
作者: 王康    时间: 2012-2-17 10:20
你的类SingleModeTest没有写构造函数,当然可以被new了.
要在类SingleModeTest中加上
private void SingClass(){}

作者: 陈伟    时间: 2012-2-17 11:02
构造函数写错了;
所以你这个程序没有自定义构造函数,还是那个默认的构造函数。
而默认的那个构造函数前面没有private,所以仍然能创建对象
作者: 仵先进    时间: 2012-2-17 17:42
大家静一静!不能创建对象的类实际开发中用得到吗???
作者: 彭沛东    时间: 2012-2-17 18:13
仵先进 发表于 2012-2-17 17:42
大家静一静!不能创建对象的类实际开发中用得到吗???

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

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

public enum Singleton
{
SINGLETON;
//下面定义相关的方法代码块
}
作者: 温昌寿    时间: 2012-2-21 15:12
你写错了private void SingClass(){}并不是做为一个构造函数,而是一个普通的方法,JAVA的构建函数是不需要返回值的
作者: 朱皓    时间: 2012-2-21 15:31
单例模式啊

作者: 花开~的季节    时间: 2012-2-21 17:42
构造函数私有化
作者: tanlei200620    时间: 2012-2-22 14:24
也可以将不想实例化的类定义成抽象的,构造方法依旧可以定义,还可以定义其它的静态方法,在这个静态方法里即使是实现当前抽象类也是可以的。  到具体应用还需要改进完善,只是提个思路。

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(){
               
        }
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2