Java 多态总结

版权声明:转载请注明! https://blog.csdn.net/smile_geek_sq/article/details/81844939

主要说一下遇到的很有意思的问题,具体的多态看上篇,应该就能理解多态了,这篇主要讲述遇到的另外一个有意思的机制

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是子类的,而作为参数会被认为是父类的。

猜你喜欢

转载自blog.csdn.net/smile_geek_sq/article/details/81844939
今日推荐