这个代码真的很有趣,我试着写一下 public class Test9 { public static void main(String[] args) { AA b = new BB(); b.show(); b.show('j'); } } class BB extends AA { public void show(char a) { System.out.println("char a =" + a); } public void show() { System.out.println("char a = null"); } }class AA { public void show(int a) { System.out.println("int a = " + a); } } 上面的代码是错的,原因是 “尽管多态是在编译时确定对象的类型,但在编译时,还是根据父类的方法声明进行程序检查。因此,如果子类中定义的方法,在父类中没有定义,则会出项编译错误。”按照这个思路,楼主你可以理解下,其实你在 BB 这个子类写的 show 方法其实编译是过不了的,因为父类 AA 中没定义(方法名和参数没有完全一样,即重写),编译器没出错的原因我猜是你的方法名跟父类的方法名一样。
你的理解没错,是这个代码实际上编译出错了编译没有问题,AA中定义了方法,你传char过去是没问题的,可以向上转型。 public void show(int a) { System.out.println("int a = " + a); }
你的理解没错,是这个代码实际上编译出错了编译没有问题,AA中定义了方法,你传char过去是没问题的,可以向上转型。 public void show(int a) { System.out.println("int a = " + a); } 是自动向上转型了吗?但找到子类的char方法后,还要去父类寻找这个向上转型的方法吗?谢谢!
是的,这种的确是编译不了,但上面这个程序为什么会输出:int a = 106 还有我的那个第一个问题,是(1)正确不?
按照这个解释,2)先从父类开始寻找,如果找不到,直接报错;如果找到,然后再去子类寻找,若方法被重写,则调用子类的方法,否则,调用父类的方法a; 应该就是这么做的,先去父类找,a.show('j');去A类中找到了show(int a)方法,然后向上转型了,就调用了这个方法。 这也就解释了为什么4楼举的那个列子了,b.show()方法在父类AA中没有定义,所以直接报编译错误了。 AA b = new BB(); b.show(); b.show('j');
public class Test1 { public static void main(String[] args) { Fc fc = new Zc(); Dc dc = new Dc(); fc.m(dc); } }class Fc { public void m(Dc dc) { System.out.println("Dc = "); } public void a() { System.out.println("Fc:"); } }class Zc extends Fc { public void a() { System.out.println("Zc:"); } }class Dc {
public class Test9
{
public static void main(String[] args)
{
AA b = new BB();
b.show();
b.show('j');
}
}
class BB extends AA
{
public void show(char a)
{
System.out.println("char a =" + a);
}
public void show() {
System.out.println("char a = null");
}
}class AA
{
public void show(int a)
{
System.out.println("int a = " + a);
}
}
上面的代码是错的,原因是 “尽管多态是在编译时确定对象的类型,但在编译时,还是根据父类的方法声明进行程序检查。因此,如果子类中定义的方法,在父类中没有定义,则会出项编译错误。”按照这个思路,楼主你可以理解下,其实你在 BB 这个子类写的 show 方法其实编译是过不了的,因为父类 AA 中没定义(方法名和参数没有完全一样,即重写),编译器没出错的原因我猜是你的方法名跟父类的方法名一样。
public void show(int a)
{
System.out.println("int a = " + a);
}
public void show(int a)
{
System.out.println("int a = " + a);
}
是自动向上转型了吗?但找到子类的char方法后,还要去父类寻找这个向上转型的方法吗?谢谢!
还有我的那个第一个问题,是(1)正确不?
这也就解释了为什么4楼举的那个列子了,b.show()方法在父类AA中没有定义,所以直接报编译错误了。
AA b = new BB();
b.show();
b.show('j');
如果有,再去调用子类的该同名方法。楼主看下博客文章吧http://www.cnblogs.com/mengdd/archive/2012/12/25/2832288.html
{
public static void main(String[] args)
{
Fc fc = new Zc();
Dc dc = new Dc();
fc.m(dc);
}
}class Fc
{
public void m(Dc dc)
{
System.out.println("Dc = ");
}
public void a()
{
System.out.println("Fc:");
}
}class Zc extends Fc
{
public void a()
{
System.out.println("Zc:");
}
}class Dc
{
}那这种情况呢?