对于java中向上转型后调用.getClass()方法还是子类的原因
在java中有一个概念叫引用。
官方给的定义是这样的:在Java中,"引用"(Reference)是指一个变量,它存储了对象的内存地址,而不是对象本身。换句话说,引用是指向对象的指针或者句柄。在Java中,所有的对象都通过引用来访问和操作,而不是直接访问对象本身。 通俗的将就是一个指路人,当有人询问你之前new的Student对象时,他会带你指路帮你找到他在那里。
这里我们实例一个Student对象s,和一个变量 People p。我们将变量赋s赋值给p,这里称之为向上转型。这里我们可以形象的将s和p看做是两个指路人,向上转型后指路人变为了p。但其内核不变,也就是我定义一个对象的一些属性值(元数据和同步信息我们暂且不谈)还被存储在内存中。所以现在的局面就是引路人p,但地点是s的内核。
当调用.getClass();就是p引着路到s内核中去执行.getClass();行为。最后拿到的也就是Student了。
所以这使得我们考虑:向上转型到底转的是什么?
要想理解这个,我们首先要理解什么是向上转型。
官方的定义是这样的:在Java中,向上转型(Upcasting)指的是将一个子类的对象引用赋给一个父类类型的变量。这种类型的转型是安全的,因为子类对象可以视为父类对象的特例。具体来说,向上转型将子类对象引用转换为父类对象引用。因此向上转型就是一个引用的传递过程。
那转型有什么作用呢?
①转型后,可以使用父类类型的变量来访问继承自父类的方法和属性。 通俗的将就是p用自己的行为(方法)去s内核做一些事情。这里的属性依旧还是s的,只是你调用的人是p。
②转型后,可以调用被子类重写的父类方法,但不能直接调用子类特有的方法。也就是说,我调用咱两相同的方法时,只能调用s的。
所以向上转型后我们可以这样看p,他就是一个只能用别人重写了的方法,和自己特有的方法的类。我简称之为挂羊头卖狗肉。