我在复习备考时发现自己对部分细节还是不熟悉,所以写篇博客记录一下,希望能够帮到大家。
首先我写了三个类,animal,dog,husky。
代码如下,非常简单。
public class animal {
public void eat() {
System.out.println("eat 100");
}
public void run(int p) {
System.out.println("run 100");
}
}
public class dog extends animal {
public void eat() {
System.out.println("eat 200");
}
public void run(String p) {
System.out.println("run 200");
}
}
public class husky extends dog {
public void run(int p) {
System.out.println("run 300");
}
}
我们创建对象时,有三组,共六种方式:
animal a=new animal();
animal b=new dog();
animal c=new husky();
dog d=new dog();
dog e=new husky();
husky f=new husky();
第一个
animal a=new animal();
a.eat();
a.run(0);
这里显然只能这样调用,输出结果是eat 100和run 100没有疑问。
第二个
可以看到,虽然dog类中run方法的参数类型是String,但这里只支持int的参数,也就是父类animal的run方法。这是因为这种定义方法,编译器将b静态解析成animal类,所以只能调用animal中的方法。运行一下试试
animal b=new dog();
b.eat();
b.run(0);
输出结果为:eat 200 (换行)run 100。
可以看到,eat方法虽然静态解析成animal中的方法,但运行时还是dog的eat方法。run方法,因为参数是int型,所以运行时只能调用animal的run方法。
第三个
animal c=new husky();
c.eat();
c.run(0);
正如刚才所说,静态检查下是animal的方法。
输出结果为eat 200(换行)run 300。husky中只重写了run方法,所以调用eat时默认运行的是父类dog的eat方法,而调用run方法就是husky的run方法。
第四个
dog d=new dog();比较容易, 就不再阐述了。
第五个
这里的静态解析,将e解析成dog类,可以调用dog类中的方法和其父类animal类中的方法。
dog e=new husky();
e.eat();
e.run(0);
e.run("0");
输出结果为eat 200(换行)run 300(换行)run 200。因为husky中没有些eat,所以这里调用的是父类dog中的eat。然后husky中有run(int p),所以参数为int时调用husky中的run。参数为String时向父类搜索,调用dog中的run。
第六个
husky f=new husky();
这种情况类似于上一种。
husky f=new husky();
f.eat();
f.run(0);
f.run("0");
结果也和上面一种一样,这里就不解释了。
以上内容全部是个人通过代码实验出来的,如果有误,恳请斧正。