Java类初始化问题

问题描述

需要在一个单例模式类里初始化另外一个类,只是让另外一个类初始化,不做任何操作,请问用new方式而不赋给另外一个值,会不会造成单例模式类永久持有新new的类?大家只需要初始化一个类而不用操作都是怎么做的呢?谢谢啦!public class TestA { private static Test instance; private TestA { [color=red]new TestB(); //这里[/color] } public static TestA getInstance() { if(instance == null) { instance = new TestA(); } return instance; }}class TestB { public TestB { //blablabla }} 问题补充:地狱牢笼 写道

解决方案

引用只是要通过类B初始化一些环境如果你只是想通过new testB() 来初始化一些所谓的环境变量(这个变量最好不是在b中的,而是在系统中的)那是可以的,但是单例类并不会持有改对象。
解决方案二:
那你把那些赋值写到static 方法,这边调一下不就行了。
解决方案三:
public class TestA { private static final Test instance=new TestA(); private TestA { new TestB(); // 单例类不会持有新new的类 } public static TestA getInstance() { return instance; } }
解决方案四:
“需要类B初始化一些环境,并不需要对它操作。” 那更不明白了。new 能初始化B。但是你又想在内存中B对象不要一直存在?而B的环境存在?不知道是不是?
解决方案五:
这个是有问题的,引用private TestA { new TestB(); //这里[/color] } 这里是一个匿名变量,这句执行完之后该对象即被垃圾回收了,可以这个样子:private static TestB testB = new TestB(); 这样就可以永久持有了。
解决方案六:
不操作模拟初始化做什么。申明不就行了。等到要操作的时候再初始化。

时间: 2024-11-29 18:50:23

Java类初始化问题的相关文章

关于java类初始化顺序的问题

问题描述 关于java类初始化顺序的问题 正常来说一个类的初始化过程应该是: 1.全局静态变量 2.静态代码块 3.全局变量 4.代码块 5.构造器 有这么一个例子: public class LoadTest { //全局静态变量 static int staticI = 10; //全局变量 int i = 20; //构造器 private LoadTest() { System.out.println("staticI="+staticI); System.out.printl

Java类初始化和实例化中的2个“雷区”_java

在考虑类初始化时,我们都知道进行子类初始化时,如果父类没有初始化要先初始化子类.然而事情并没有一句话这么简单. 首先看看Java中初始化触发的条件: (1)在使用new实例化对象,访问静态数据和方法时,也就是遇到指令:new,getstatic/putstatic和invokestatic时: (2)使用反射对类进行调用时: (3)当初始化一个类时,父类如果没有进行初始化,先触发父类的初始化: (4)执行入口main方法所在的类: (5)JDK1.7动态语言支持中方法句柄所在的类,如果没有初始化

Java 类中类属性和对象属性的初始化顺序

对象 边城狂人 Java 类中类属性 (static 变量) 和对象属性 (非 static 变量) 的初始化顺序可以用如下程序测试: /** * @(#) Test.java * @author fancy */ public class Test { static String a = "string-a"; static String b; String c = "stirng-c"; String d; static { printStatic("

解析Java类和对象的初始化过程

本文主要对类和对象初始化全过程进行分析,通过一个实际问题引入,将源代码转换成 JVM 字节码后,对 JVM 执行过程的关键点进行全面解析,并在文中穿插入了相关 JVM 规范和 JVM 的部分内部理论知识,以理论与实际结合的方式介绍对象初始化和类初始化之间的协作以及可能存在的冲突问题. 问题引入 近日我在调试一个枚举类型的解析器程序,该解析器是将数据库内一万多条枚举代码装载到缓存中,为了实现快速定位枚举代码和具体枚举类别的所有枚举元素,该类在装载枚举代码的同时对其采取两种策略建立内存索引.由于该类

java 初始化-Java类的初始化顺序问题

问题描述 Java类的初始化顺序问题 一般在Java对象能够调用方法之前,此类中的成员变量就已经初始化完毕,那如果这个成员是匿名内部类呢?也会等到这个匿名内部类中的代码全部跑完吗? 解决方案 Java初始化顺序1在new B一个实例时首先要进行类的装载.(类只有在使用New调用创建的时候才会被java类装载器装入)2,在装载类时,先装载父类A,再装载子类B3,装载父类A后,完成静态动作(包括静态代码和变量,它们的级别是相同的,安装代码中出现的顺序初始化)4,装载子类B后,完成静态动作类装载完成,

java规定初始化

如果想自己为变量赋予一个初始值,又会发生什么情况呢?为达到这个目的,一个最直接的做法是在类内部定义变量的同时也为其赋值(注意在C++里不能这样做,尽管C++的新手们总"想"这样做).在下面,Measurement类内部的字段定义已发生了变化,提供了初始值:   class Measurement { boolean b = true; char c = 'x'; byte B = 47; short s = 0xff; int i = 999; long l = 1; float f

java成员初始化

Java尽自己的全力保证所有变量都能在使用前得到正确的初始化.若被定义成相对于一个方法的"局部"变量,这一保证就通过编译期的出错提示表现出来.因此,如果使用下述代码: void f() { int i; i++; } 就会收到一条出错提示消息,告诉你i可能尚未初始化.当然,编译器也可为i赋予一个默认值,但它看起来更象一个程序员的失误,此时默认值反而会"帮倒忙".若强迫程序员提供一个初始值,就往往能够帮他/她纠出程序里的"臭虫". 然而,若将基本类

Groovy探索之MOP 十四 对Java类使用Groovy语言的MOP

既然Groovy语言是Java语言的扩展,那么我们在使用Groovy语言的时候,就很难与Java语言真正脱得了干系,那怕我们是在做一个纯Groovy语言的项目,如Grails项目.我们可能在Groovy代码中会用到遗留的Java类和包:也可能是为了性能的原因,我们不得不在Groovy语言中使用到Java类:等等. 如果我们要对于Java类使用Groovy语言的MOP,比如我们想给一个Java类的对象在运行期内添加一个方法.那么我们该怎么办呢? 比如,我们有如下的一个Java类: //(Java代

利用Java注解特性加载属性文件(properties)的值到Java类

在此之前我都是写个PropertyUtil类来加载配置文件,然后通过get方法,把key对应的值取出来. Spring提供一个PropertyPlaceholderConfigurer类,可以读取配置文件,然后在Spring配置文件通过${hibernate.dialect}这种方式注入到JavaBean中,有个不好的地方就是,要在代码中取的时候不是很方便. 然后在接触到Java注解特注解技术以后,感觉这个东东很好,hibernate映射,WebService都可以通过注解来完成,方便的很多,然