主要说一下遇到的很有意思的问题,具体的多态看上篇,应该就能理解多态了,这篇主要讲述遇到的另外一个有意思的机制
package work0808;
class Wtf {
String name;
public void sound(Guitar g) {
System.out.println("用吉他演奏");
}
public void sound(Piano p) {
System.out.println("用钢琴演奏");
}
public void sound(Wtf wtf) {
System.out.println("Wtfde wtf");
}
}
class Guitar extends Wtf {
String logo;
public void sound(Guitar g) {
System.out.println("用吉他演奏");
}
public void sound(Wtf wtf) {
System.out.println("Guitar de wtf");
}
}
class Piano extends Wtf {
@Override
public void sound(Piano p) {
// TODO Auto-generated method stub
System.out.println("用钢琴演奏");
}
public void sound(Wtf wtf) {
System.out.println("Piano de wtf");
}
}
public class Work8 {
public static void main(String[] args) {
Guitar gt=new Guitar();
Piano pn=new Piano();
Wtf g = new Guitar();
Wtf p = new Piano();
System.out.println(g.getClass().getName());
g.sound(g);
p.sound(pn);
}
}
在这里 这个g 对象 编译是识别为 Wtf 类的对象的,但是你getClass getName 会发现 输出的是 Guitar 对象 ,这个原因跟调方法调的是子类的方法一样(前提是父类也有的),就是因为编译器编译时,载入的是父类,和子类 但是编译时会把 子类独有的 属性和方法屏蔽掉,然后才会 按照子类的模板生成对象。所以 getClass getName是子类的,而作为参数会被认为是父类的。