5、构造器、类变量和单例
来源:互联网 发布:我好想你网络歌手 编辑:程序博客网 时间:2024/05/19 16:07
跟c++类似,java中子类创建时会先调用父类的构造器,从最初的Object一直到自己的构造器,如果父类B的构造器全部都是private,则构造器全部不能被子类调用。
这时定义子类C继承自父类B,编译出错。
这时可以通过一个public static 的方法来构造对象,在这个方法中调用构造器。static修饰的方法不需要具体的对象就可以调用。
这样可以实现一个“单例”
class Singleton{private Singleton(){}private static Singleton instance;public static Singleton createSingleton(){if (instance == null) {instance = new Singleton();}return instance;}}public class Danli {public static void main(String[] args){Singleton s1 = Singleton.createSingleton();Singleton s2 = Singleton.createSingleton();System.out.println(s1 == s2);}}
结果将输出true,Singleton类的类方法createSingleton被调用了两次,但是返回的是同一个对象的引用,即类变量instance。
注意,尝试把这个过程写在构造器中,即
Singleton()
{
if (instance == null) {
instance = new Singleton();
}
}
运行时会出错。
原因是
Singleton s1 = Singleton.createSingleton();
时,createSingleton调用了构造器。而构造器中又有new Singleton();,那么构造器就会无限地被调用。
所以构造器里面不能有new 自己,这种写法。
把程序改成
class Singleton{Singleton(){System.out.println("constructor");}protected void test(){System.out.println("test");}private static Singleton instance;public static Singleton createSingleton(){if (instance == null) {instance = new Singleton();}return instance;}}public class Danli {public static void main(String[] args){Singleton s1 = Singleton.createSingleton();Singleton s2 = Singleton.createSingleton();}}结果是:
constructor
即是
Singleton s1 = Singleton.createSingleton();
调用了构造器的结果。
而s2则没有调用构造器,所以只有一行。
而单单加载类,不构造实例,是不会调用构造器的,但是会最先执行静态初始化块
0 0
- 5、构造器、类变量和单例
- Kotlin 构造器和单例模式
- 构造方法私有化和单例模式
- C++类中的变量和构造函数
- 2013-07-02 实例变量 、 属性 、便利构造器、设置器、 访问器、实例方法("-") 、类方法("+"静态方法)、单例
- Scala类的定义,主/辅构造器,以及方法中的变量定义,单例对象,伴生对象,Apply方法调用,应用程序对象
- java笔记之局部变量、成员变量和构造器
- 单例,静态工厂,构造器
- 类、匿名类、静态、构造、单例
- JOptionPane_构造函数和变量
- 单例模式的构造和析构问题
- 简单的单例模式和构造函数
- @Autowired写在变量上和构造器上的区别
- java 类和对象、方法内定义变量、 构造方法
- C++类成员变量和构造函数初始化
- Java 类的成员变量和方法以及构造方法
- java反射:获取类的成员变量和构造函数
- Python的构造函数和析构函数 对象的变量和类的变量不一样
- 两个页面之间Bundle传值
- 正则表达式笔记
- 玩转大数据系列之Apache Pig高级技能之函数编程(六)
- 挑战2.1 Smallest Difference
- 黑马程序员--多线程
- 5、构造器、类变量和单例
- c++运算符重载
- 116.Populating Next Right Pointers in Each Node
- Jquery面试题整合
- 跟Android说Hello World
- POJ 3461 Oulipo (简单kmp)
- Coredata的理解
- 黑马程序员--OC-多态与继承
- Masonry