上部分代码编译运行均不报错,下面代码运行报错
首先new了一个String(),堆内存中包含了String的结构,可以将对象s向上转型为String的父类obj对象,且可以将obj再向下转型为String对象。
而下面的代码new出了Object对象,显然是不能转型为String的,因为String是Object子类,子类必然比父类的结构更加丰富,而"东西"更少的父类不能直接转为子类对象。
所以来看转型仅仅影响了对象某些结构的"可见性",对象s在内存中的结构都是没变的,在向上转为对象obj后仅仅是String的部分结构变得"不可见"了,这个时候再把obj转为String是合乎情理的,只是可见性和不可见性的相互转化。(猜的)