在声明类的实例时 计算机内部进行了什么样的操作 ?

takpod 2014-11-17 10:45:28

A是一个类,B是A的子类

A var1= new A();

A var2= new B();

1,这两句话的本质是什么意思?
2,执行这两句话计算机内部进行了什么样的操作?
3 ,A var2= new B();这种声名有什么意义?为不么不直接B var2= new B();
...全文
155 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
於黾 2014-11-17
  • 打赏
  • 举报
回复
引用 4 楼 takpod 的回复:
A var1= new A() 是创建了var1对象,并返回它们的引用,同时也在内存中开辟了一个空间给var1对象, 这个空间是不是与A var1= new B()开辟的空间一样呢?
类的实例是个引用类型 你先恶补一下值类型和引用类型 A var1= new A()是实例化了一个类A,并在内存中开辟空间存放里面的属性和字段,然后将引用保存在var1这个对象中 这跟A var1= new B()开辟的空间当然是不一样的
姓小名白丶 2014-11-17
  • 打赏
  • 举报
回复
内存的堆和栈里面,会分出相应的空间的
takpod 2014-11-17
  • 打赏
  • 举报
回复
比如 int[] v1=new int[5]; int[] v1的意思是定义一个整形的数组? 而new int[5];的意思就是开辟5个 整形大小的单元的空间 并返回引用给v1,? 我这样理解对吗? 而 A var1=new A();是不是一样的意思呢?
takpod 2014-11-17
  • 打赏
  • 举报
回复
A var1= new A() 是创建了var1对象,并返回它们的引用,同时也在内存中开辟了一个空间给var1对象, 这个空间是不是与A var1= new B()开辟的空间一样呢?
phommy 2014-11-17
  • 打赏
  • 举报
回复
在堆上找一个sizeof(B)的连续空间,把空间首地址传递给B的构造函数做初始化,最后找地方(可能是堆上栈上或寄存器里)把那个首地址存成一个int值 意义不好说,有需要自然就想到这个特性了。一个例子:例如两个类中有非重写的同名方法,第1种写法是调用到父类中的同名方法,第2种是调的子类中的
野树林 2014-11-17
  • 打赏
  • 举报
回复
1. 创建A,B两个对象,并返回它们的引用(类似指针) 2. 在托管堆上分配内存,进行类型安全检测以及相关初始化操作,最后返回他们的应用 3. 这里体现了多态的机制,在程序运行期在不需要改变代码的就可以动态改变类型(只要是A的子类型)
xdashewan 2014-11-17
  • 打赏
  • 举报
回复
参照面向对象中的多态
xdashewan 2014-11-17
  • 打赏
  • 举报
回复
引用 10 楼 takpod 的回复:
var1和var2分配的空间是一样的,但var1就可以实现多态,而var2不能,对吗?
可以那么认为,但有一点要明确A var1= new B();这仅仅是继承关系,并未完全体现多态特性,但多态特性是建立在继承的基础上,类似这样

public Interface IA
{
 void dosomething();
}
public class B:IA
{
 public void dosomething(){}
}
public class C:IA
{
 public void  dosomething(){}
}
IA a1= new B();
a1. dosomething();
IA a2= new C();
a2. dosomething();
takpod 2014-11-17
  • 打赏
  • 举报
回复
引用 9 楼 xdashewan 的回复:
[quote=引用 8 楼 takpod 的回复:] 是不是子类的空间一定是大于(或=)父类的空间呢?
为何不是呢,我很奇怪,为何你既然内存分配,也知道多态,那么为何还有这个疑问[/quote] 其实我是猜的,不知道对不对,来求证一下, 还有一问就是 A var1= new B(); 和 B var2= new B(); var1和var2分配的空间是一样的,但var1就可以实现多态,而var2不能,对吗?
xdashewan 2014-11-17
  • 打赏
  • 举报
回复
引用 8 楼 takpod 的回复:
是不是子类的空间一定是大于(或=)父类的空间呢?
为何不是呢,我很奇怪,为何你既然内存分配,也知道多态,那么为何还有这个疑问
takpod 2014-11-17
  • 打赏
  • 举报
回复
引用 7 楼 Z65443344 的回复:
[quote=引用 4 楼 takpod 的回复:] A var1= new A() 是创建了var1对象,并返回它们的引用,同时也在内存中开辟了一个空间给var1对象, 这个空间是不是与A var1= new B()开辟的空间一样呢?
类的实例是个引用类型 你先恶补一下值类型和引用类型 A var1= new A()是实例化了一个类A,并在内存中开辟空间存放里面的属性和字段,然后将引用保存在var1这个对象中 这跟A var1= new B()开辟的空间当然是不一样的[/quote] 我当然明白值类型和引用类型,引用类型其实就相当一个指针,指向堆里一块区域的首地址,这块区域就是开辟存放类属性和字段的空间嘛,我想知道 new A()和0 new B()开辟的空间不一样在哪里,是不是子类的空间一定是大于(或=)父类的空间呢?

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧