在下面代码中有3个类 主类Test 另外2个就是子类和副类的关系了
在下面代码中画有(/////////////不懂)的记号 请大家帮我看看
class Supers

int i =1;
Supers(){System.out.println("Supers()");}
void a(){ System.out.println("a()in Supers()");}
void b(){ System.out.println("b()in Supers()");}
void speak(Supers p ){System.out.println("I am Supers");}
}class Sub extends Supers
{
int i=2;
Sub()
{
System.out.println("Sub()");
}
void a()
{
System.out.println("a()in Sub()");
}
void speak(Sub s )
{
System.out.println("I am sub");
}
}public class Test
{
public static void main(String args[])
{
Supers b=new Sub();
Sub c=new Sub();
System.out.println(b.i);  /////////不懂结果是1
b.a();
b.b(); //////////没有重写b方法所以执行复类的b方法
b.speak(c); //////////////////不懂结果是 I am supers
c.speak(c);
}
}

解决方案 »

  1.   

    System.out.println(b.i);  /////////不懂结果是1
    b.a();
    b.b(); //////////没有重写b方法所以执行复类的b方法
    b.speak(c); //////////////////不懂结果是 I am supers
    1. 这里有个向上转型Supers b=new Sub();,自然调用的是父类的i了.
    2  因为b方法被覆盖了
    3  要覆盖这个方法,必须参数类型也是相同的,而这里speak的参数类型明显父类和子类是不同的,所以不是覆盖,而是重载,2个完全独立的方法. 经过向上转型 自然调的是父类的那个speak