A a 这个是声明一个a变量,但是并没有实例化。
A a=new A() 这个才是实例化(为A这个类创建了一个对象)
声明和实例化有什么区别,以这个地方为例:
确实 你提到的a.medth(),new A().medth()都能调medth方法,但是你想没想过在A a声明之后,如果没有new一个实例的话,我完全可以给变量a赋一个空值。当A a=null的时候,你如何用a.medth()来进行调用呢?
当程序中使用一个类:载入一个类,占用了一定内存空间,这部分与实例化的实例个数多少无关;
A a;声明一个对象
生成一个引用类型,占1字节内存,不管是什么类型(object o或From f)的引用都是占用1字节内存
A a= new A();
创建一个类实例,开辟一块内存(这块内存跟类本身的大小有关),并且让引用a指向这块内存的起始位置;
比如:
//程序中要使用一个类,.net framework运行支持就载入一个类程序,A ,增加内存占用量为X字节
A a;//增加内存占用1字节
A a1 ;
A a2 ;
A a3;
a=new A();//增加内存占用Y字节 (Y的大小与X无直接关系,但存在一定关系)
a1=new A();
a2=new A();
a3=new A();
//那么这时内存占用一共增加了: X+1*4+Y*1 字节
X的大小与类里面声明的属性,方法有直接关系,主要是类里面的程序写约多行X的值就越大,比如这个类的程序有几百行,那么X就很大了,不过由于X不会倍数增加,所以几乎可以忽略.
Y的大小与类的成员有直接关系,类的成员占用内存约大Y就越大
比如一个Form的控件成员越多这个Form的Y就越大
对于一般程序员来说,X的大小不可预计,因为毕竟是.net内核的东西,但是Y的大小是可以计算出来的.
X在堆栈上分配,理论上是不占内存的,或者说堆栈的内存不在内存占用计算之内。而Y则有垃圾回收的问题,而考虑到垃圾回收,Y就不仅仅是这个对象所占用的内存空间,还包括这个对象间接引用的对象,这样,Y就不是确定的,例如一个数组所占用的内存就是不确定的,当然你可以说这个数组里面的元素也必然是new出来的,但很多时候,这些元素不一定是由你得代码所创建的。
这些问题要看计算机基础书籍。
楼主的问题很有代表性,mark一下……
实例A a的时候你如果不“A a=new A()”这样,你如何实例?
二楼和三楼一结合,就是完美的答案,我就不复制了……
如果只调用一次的话a.medth(),new A().medth()没有什么区别,如果需要调用很多次的话new A().medth()会导致代码的执行效率非常低,应为.Net平台的垃圾回收机制,所以还是使用A a = new A();a.method()比较好