实际是什么就会得到什么具体值,比如说IAAA x = new SSS();那么这里的 x 的实实在在的东西当然是 SSS 类型的,而接口在此时(识别具体对象实例类型时)不过就是糊弄人的标题党。
接口是编译器用来检查兼容性用的。比如说代码A x = new B(); var y =(U)x;编译器会在编译时去检查 B 对象是否跟A兼容,而编译器产生的代码会在运行时去检查 A 是否跟U 兼容。强类型与弱类型的区别,不过就是加强了编译或者运行时的类型兼容性检查。原本你可能胡乱声明一个 object 弱类型变量也能引用对象,但是这不能尽早发现代码错误。强类型就可以尽早发现问题。但是说来说去,变量引用的实际的对象到底是什么类型的,那是骗不了人的。比如说代码var y =(U)x;这看似是把一个 A 类型变量引用的对象赋值给变量 y,但是实际上系统知道这个 y 变量的类型打印出来一定是 B,而不是什么 A 或者 U 那种标题党的东西。
而编译器产生的代码会在运行时去检查 A 是否跟U 兼容 --> 而编译器产生的代码会在运行时去检查 x 引用的实际的 B 类对象实例 是否跟U 兼容
类库 ccc,类 sss,所以 ccc.sss 是对的
var y =(U)x;编译器会在编译时去检查 B 对象是否跟A兼容,而编译器产生的代码会在运行时去检查 A 是否跟U 兼容。强类型与弱类型的区别,不过就是加强了编译或者运行时的类型兼容性检查。原本你可能胡乱声明一个 object 弱类型变量也能引用对象,但是这不能尽早发现代码错误。强类型就可以尽早发现问题。但是说来说去,变量引用的实际的对象到底是什么类型的,那是骗不了人的。比如说代码var y =(U)x;这看似是把一个 A 类型变量引用的对象赋值给变量 y,但是实际上系统知道这个 y 变量的类型打印出来一定是 B,而不是什么 A 或者 U 那种标题党的东西。