黑马程序员技术交流社区
标题:
如何定义一个类使之不能创建对象。
[打印本页]
作者:
姚立明
时间:
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、如果想确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,那么可以采用单例模式,代码如下:
public class SingleClass {
private SingleClass() { //一个私有的构造方法
}
private static SingleClass instance = new SingleClass(); //一个静态的、私有的SingleClass 类型的变量
public static SingleClass getInstance() { //公共的静态方法,提供给其他类访问
return instance;
}
public void put(){
System.out.println(this.toString());
}
}
复制代码
作者:
黄锦成
时间:
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