Java中类的继承时调用方法的小细节

我在复习备考时发现自己对部分细节还是不熟悉,所以写篇博客记录一下,希望能够帮到大家。

首先我写了三个类,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");

结果也和上面一种一样,这里就不解释了。

以上内容全部是个人通过代码实验出来的,如果有误,恳请斧正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值