请问java里面为啥有时候声明对象的时候不用new??

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问java里面为啥有时候声明对象的时候不用new??相关的知识,希望对你有一定的参考价值。

Thread currentThread = Thread.currentThread();
currentThread.getName();

声明了thread类 没有用new thread();那内存不就没有在堆里面分配内存传递过去了吗?

这个问题和java编程里用到的一些常用模式有关,有的时候你用new会出错,这主要是为了编程方便很安全两方面考虑。一般不用new的有两种最常用的模式,一是工厂模式,另一个是单例模式,工厂模式是通过工长类来得到一个实例,一般是AA aa=Fatory.getAA();这里就没用new。还有一种情况就是单例模式,这里主要是出于安全考虑了,在单例模式中,类的实例只允许有一个,并且有它自己自动提供这个实力。外部不能创建它的实例,因为它的构造函数是private的,所有使用new的时候会出错。当然它还要有一个静态的返回实例的方法。 参考技术A 1,Thread currentThread = Thread.currentThread();
currentThread.getName();

2,new Thread();
作用是不同的;

1,是用来获得当前正在执行的线程对象的引用。这样用的是当前正在执行的线程对象,所以不用开辟新的内存。
2,是用来获得重新产生一个新的线程对象。

一个是获得已有的对象,一个是重新创建一个对象。
参考技术B 这个问题我遇到过的。以前我开发项目的时候也用new的。可交任务的时候,公司就让我们把new的地方全改成
Thread currentThread = Thread.currentThread();
currentThread.getName();
你的这种形式了。这样做的唯一好处就是不用new开辟个新的内存,这样就不占内存了。程序的运行效率提高了。其实你用new和不用实现的功能是一样的。
参考技术C 虽然是用的方法currentThread();
但是最后还是在currentThread(); 方法中new的对象
参考技术D 静态方法创建,原理没什么区别

一个关于java的new对象的问题,以及怎么有效减少不必要的内存占用

假如我有十个类,而这十个类都有一个成员对象a,而且这十个类中的成员对象是一样的,请问我可以选择再开发一个类,里面new一个对象a,然后再在另外十个类中通过赋值的方法把该类中的a赋值给成员对象a,而不需要在十个对象中new十个成员对象a来赋值的方法。请问这样子做,可以有效减少不必要的内存占用吗?
还有一个问题就是关于静态变量初始化问题,如果我要引用数学类中Math.PI,那么是在使用的时候装载该静态量到内存中吗?还是在其它什么时候装载。看了一个关于new对象的文章,文章中说new对象之后就会装载该对象的静态变量。而类中的静态变量不是可以直接引用,而不需要new出来就可以用的吗?也就是说问下究竟静态成员变量是什么时候装载到内存中的?

赋值有利于减少内存占用。
静态成员变量 和 静态方法一样,在类被载入中就已经加载到内存空间里了。
类被载入的可能性
1:是java.lang 在JVM初始化时就被载入
2:类的某个子类初始化
3:存在于某个初始化的类的import中(例如使用java.sql.* 就会浪费空间,但是对于复杂的sql应用则可以提高运行速度)
等等
java本来就不是内存优化的好语言。
java在内存优化上的优势在于自动和手动 回收机制的配合。就是 我想优化就优化,不优化系统也会帮我优化。
参考技术A 你说的这个办法是可以的,只要成员对象a可以被你定义的类访问,或者提供访问成员a的接口就可以
静态变量是java虚拟机在程序运行的时候装载到内存中的,
参考技术B 可以考虑把对象a设置为单例的,但是同时你也要考虑单例情况下的并发处理。
Math.PI是一个常量,在类加载的准备阶段就会被分配到常量池的内存中,如果单单是使用Math.PI是不会产生实例对象的,并未对一个Math类的实例进行初始化构造。

以上是关于请问java里面为啥有时候声明对象的时候不用new??的主要内容,如果未能解决你的问题,请参考以下文章

JAVA啥时候需要NEW个对象,啥时候不用NEW可以直接用类名.方法?

c#里为啥有的使用时函数需要new一个对象而有的不用?为啥不直接调用就好?

java static学傻了,;类方法中给成员变量赋值必须先new个对象,普通方法却不用,为啥呢?

启动tomcat服务的时候为啥会将我MyEclipse里面的工程都发布一遍,导致启动服务很慢,请问怎么解决??

为啥在java中使用了static修饰词就不用NEW 对象了?(初学者求助)

java一个疑问,为啥有些异常throw出去需要在函数头用throws声明,一些就不用。