A a=new B();//你这里已经指定了用B去实例化a
B b=(B)a;//所以这里什么都没做,即使不强制转换,a本身就是B的实例化,而不是基类A
B b=(B)a;//所以这里什么都没做,即使不强制转换,a本身就是B的实例化,而不是基类A
解决方案 »
- json里面有数组怎么读取啊
- 今天写了个二维数组排序的算法,也就是根据冒泡排序实现的,大侠们看看是否还可简便或有更好的算法
- 初学C#用VS2005新建C#工程时提示库没注册,请问各位是什么原因啊?
- 关于Nhibernate一对多保存的问题,急!
- c#如何调用lame.dll
- 大家谁有自己写的C#垂直滚动条的代码??
- 100分!!求高手指点!!Bitmap GDI+封装位图后,封装后图片打印不清晰,封装位图过程图片有损失该怎么解决??
- 如何得到当前属性的名字
- 请问在.net中,可以做ocx控件吗?
- 关于datediff的一条sql语句,在线等待,给分
- Func<string, int> ParseInt = i => int.Parse(i);稍作修改
- 高分求帮忙, HMACSHA1问题
A a = new A();
B b = new B();
b = (B)a;
为何能编译通过,却运行抛出异常,此时运行时(B)a在做什么?为什么会抛出异常
B b=(B)a;//这个b才是真正意义上的B类实例...无论用b去调用什么方法.都是用B类的..
A a = new A();
B b = new B();
b = (B)a;
为何能编译通过,却运行抛出异常,此时运行时(B)a在做什么?为什么会抛出异常
以内存来说,a和b都是指向同一段内存,这是不会报错,所以你a=b在底层的语法中是没有错误的;报错得是编译器对类型的检测即c#语法,A是B的父类,所以可以定义b;
A a = new A();
B b = new B();
b = (B)a;
为何能编译通过,却运行抛出异常,此时运行时(B)a在做什么?为什么会抛出异常
因为 a是parent class的instance,b和a都属于A的类型,自然可以编译通过,但是一旦运行,
b = (B)a;违反了 设计模式的里氏替换原则(子可以替换父 , 父不可以替换子)
B b=(B)a;
上帝创建了一个狗,先用哺乳动物表示着,等到有一天,上帝觉得狗这个名称不错,就用狗来表示之前创建的那只A a = new A();//这里真正制造出来的是A,假设A=哺乳动物,B = 狗。
B b = new B();//这里真正制造出来的是B,假设A=哺乳动物,B = 狗。
b = (B)a;你觉得哺乳动物可以转换成狗么面向对象是一种用来分析世界的方法~
你可以多考虑现实中的例子
如果单单看A转B ,B转A的,很难明白了解面向对象的A a=new B();
B b=(B)a;
这个在内存上是没有变化的~ 只是穿马甲而已~float f = 10;
int i =(int)f;//虽然i也是10,但内存上已经被去掉了很多个bit了~
当然这是值类型的,像上面的引用类型的~真真正正的父转子是要报错的,
这种情况一般普遍的代码中的情况就是:ISomeInterface si = new SomeClass(); // SomeClass 实现了 ISomeInterface
// 这样,SomeClass 自己定义的很多东西都被过滤了,si 看不到了。si 只看到自己定义的、以及被 SomeClass 重载的那些东西。
A a = new A();
B b = new B();
b = (B)a;
为何能编译通过,却运行抛出异常,此时运行时(B)a在做什么?为什么会抛出异常强制类型转换,这就是告诉编译器你”强制定义类型“了。这实际上就突破了c#的强类型编程的限制。但是.net平台是强类型的系统,它会在给变量赋值时自动去检查一下对象的类型,保证声明兼容性。他不会像javascript那类垃圾动态语言那样,仅仅在你的代码已经走到迷宫里、你按照错误的类型而仿问属性或者函数执行时才崩溃,而是会提前在入口处就给你崩溃。