如何让一个类不能被实例化

本文涉及的概念:

1.在面向对象编程中,在什么场景下会需要做到让一个类不能被实例化

2.让一个类不能被实例化的方法

什么样的场景会需要让一个类不能被实例化

工具类(utility class),实例化对它们没有意义的工具类。这时候,就要做到不让该类被实例化

java.lang.Math:

把与Math相关的基本类型的值和相关的方法组合到该Math类中。Math类不需要实例化,使用了私有构造器。不过,它可以在Math类中内部被实例化。

使用私有构造器,没有子类;使用final修饰,没有子类。

package java.lang;

import java.util.Random;

public final class Math {

/**

* Don‘t let anyone instantiate this class.

*/

private Math() {}

/**

* The {@code double} value that is closer than any other to

* <i>e</i>, the base of the natural logarithms.

*/

public static final double E = 2.7182818284590452354;

public static final double PI = 3.14159265358979323846;

public static double sin(double a) {

return StrictMath.sin(a); // default impl. delegates to StrictMath

}

....

public static double toRadians(double angdeg) {

return angdeg / 180.0 * PI;

}

public static float scalb(float f, int scaleFactor) {

return sun.misc.FpUtils.scalb(f, scaleFactor);

}

}

让一个类不能被实例化的方法

0.不写显式的构造器---不可行,编译器会自动提供一个公有的,无参的缺省的构造器

1.抽象类的方式---不可行

子类可以继承父类,从而实例化

public abstract class Parent {

public Parent() {

}

public static void main(String[] args){

// Parent one = new Parent();

}

}

public class Child extends Parent {

public Child() {

}

}

2.使用私有构造器----可行,需要在构造器中添加限制

在使用私有构造器的基础下,再在构造方法中返回一个异常,因为虽然外部类无法实例化该类,但是内部类可以实例化该类;另外,通过反射的方式,还是可以实例化该类:通过反射的方式来实例化Elvis类(Elvis类有私有构造器)

  1.     Class<?> classType = Elvis.class;  
  2.         Constructor<?> c = classType.getDeclaredConstructor(null);  
  3.         c.setAccessible(true);  
  4.         Elvis e1 = (Elvis)c.newInstance();  

public class Elvis{

private Elvis(){

throw new AssertionError();

}

...

}

引用:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Math.java

http://yqgao.blog.51cto.com/773490/170194

时间: 2024-10-10 23:45:35

如何让一个类不能被实例化的相关文章

.NET C# 三种实例化一个类的方式的性能比较

本文内容 实例化一个类的方式 用 New 关键字实例化一个类 用 Activator 实例化一个类 用 Assembly 实例化一个类 性能比较 环境 比较 分析 代码 在开发应用程序时,能够动态实例化一个类很有用.给出类的一个字符串名称,就能够创建这个类的一个实例.若这些需要实例化的类都继承同一个接口(如本例的 IPerson),那么实例化的 object 类型转换后可以赋值给这个接口.这很方便.否则,就得用 swtich-case 语句(估计会很长). 那么,接下来的问题,实例化一个类的性能

三种方式实例化一个类的性能情况

源内容:http://www.cnblogs.com/shouce/p/5558095.html#undefined 下面的内容是根据“源内容”进行了整改.补充. 三种方式实例化一类,包括无参数构造形式与有参数构造形式性能测试. 使用new关键字创建类实例(常用方式). 使用Activator激活器类创建类实例(Activator用以在本地或从远程创建对象类型,或获取对现有远程对象的引用). 使用Assembly程序集创建类实例(Assembly表示一个程序集,它是一个可重用.无版本冲突并且可自

一个类有多大

#include <iostream> using namespace std; class A{}; class B { int b; char c; }; class C { int c1; static int c2; }; int C::c2 = 1; class D:public C,public B{ int d; }; int main() { cout<<"sizeof(A)="<<sizeof(A)<<endl; cou

C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值

转自goldeneyezhang原文 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值总结: 对应某个类的实例化的对象tc, 遍历获取所有属性(子成员)的方法(采用反射): Type t = tc.GetType();//获得该类的Type //再用Type.GetProperties获得PropertyInfo[],然后就可以用foreach 遍历了 foreach (PropertyInfo pi

类实例 及 实例化对象 对象引用

类实例及成员引用 当我们创建完一个类,如果要使用这个类,必须在程序里创建类的实例对象,通过这个实例来引用类中所定义的方法成员,完成所需的工作.创建实例对象时,必须使用new关键字,这个关键字我们在集合和哈希表对象的创建时用到过,基本方法一致,就是用new关键字产生一个指向类实例对象所在位置的引用.实例化类对象的基本语法为: ClassName ObjName=new ClassName([参数]): 类的名字       对象名                           是否有参数.多

C++中设计一个类,使其不能继承

1.c11中可以直接使用final关键字使得该类不能被继承 2.派生类用调用基类的构造函数来初始化基类部分,若将基类构造函数声明为private,则实例化派生类成员时链接出错,但是这样基类也不能实例化,编译出错 3.将一个类的构造函数声明为private,则该类及其子类都不能实例化,但是若把子类声明为该类的友元,则该子类可以调用基类的private成员函数,也就是说此时子类可以实例化,而且这时候子类的子类也可以初始化,因为子类的子类初始化基类部分是调用子类的构造函数,而子类是可以正常初始化的,所

【PHP面向对象(OOP)编程入门教程】4.如何抽象出一个类?

上面已经介绍过了, 面向对象程序的单位就是对象,但对象又是通过类的实例化出来的,所以我们首先要做的就是如何来声明类, 做出来一个类很容易,只要掌握基本的程序语法定义规则就可以做的出来,那么难点在那里呢? 一个项目要用到多少个类,用多少个对象, 在那要定义类,定义一个什么样的类,这个类实例化出多少个对象, 类里面有多少个属性, 有多少个方法等等,这就需要读者通过在实际的开发中就实际问题分析设计和总结了. 类的定义: 1 2 class 类名 { } 使用一个关键字class和后面加上一个你想要的类

C#1(.net和C#的关系、VS与.net的对应关系、VS2012常用的几种应用程序、C#定义一个类的方法、类页面内容的解释、定义Person的类、调用Person类的方法、命名规范、数值类型)

1..net和C#的关系 .net是一个开发平台,C#是应用在.net平台上的一种语言.   2.VS与.net的对应关系  3.VS2012常用的几种应用程序 第一种是Windows窗体应用程序,也即是我们常用的C/S端的应用软件: 第二种是控制台应用程序,主要是用来学习调试C#代码的(老师上课应用的模式): 第三种是空Web应用程序,建立空的网页模式,B/S模式: 第四种是Web 窗体应用程序,建立后会生成一些常用的网页组件和功能,例如JS.image等,也是B/S模式. 4.C#定义一个类

探秘static——类不需实例化就能用?

一般情况下,需要用到某个类的时候,都必须先实例化这个类,才能对其进行调用.在编程过程中发现,有些类不用实例化就可以直接拿来使用,使用它的字段.方法等等. 这时候,靠的就是static作用.static英文意思为"静止的,静态的",在编程中可以作为修饰符,类.字段.属性.方法等被static修饰后,变为静态类.静态字段.静态属性.静态方法-- static修饰的类成为静态类,静态类中只能包含静态成员(被static修饰的字段.属性.方法),不能被实例化,不能被继承:非静态中可以包含静态成