首先我们要实现的任务:
首先将所需的类和接口构建好:
然后李雷重载韩梅梅重写:
这里说一下什么是重载,什么是重写:
重载体现的是Java的静态多态性:编译时多态,也就是本质上而言在父类方法上增加了自己的参数,可以自己修改参数类型数量,重载不需要使用override注解,因为@override注解更多是用来检查,确保你的确是在干重写的事情,重载本来就不需要检查。
重写体现的是Java的动态多态性:运行时多态,也就是本质上而言不可以变动父类方法的参数,然后自己在实现代码上面增添很多其余的步骤,用于实际情况
说一下自己的理解吧,首先自己发现了一个小技巧就是在IDEA中子类重载父类方法的时候这个方法其实是不会变亮显示的,但是重写就可以高亮,重载可以写很多很多参数不同名字相同的方法,也就是父类这个方法的名字,所以这么一看的话重载就像是字面意思说的一样,几乎全新的加载了这个方法,但是重写虽然有了很多自己独特的代码却脱离不开外面的父类方法框架!
最后简单演示一下代码结果:
然后自己仿照上面的写了一个关于动物猫和狗的例子,在写的时候又发现并解决了一个新的问题那就是:对于重载的方法我们如何调用?举个例子说明,现在有一个Cat类,里面有一个方法:
public void lick() {
System.out.println("猫猫都喜欢舔自己");
}
然后有一只叫做甜甜的猫这个类继承了Cat:并且实现了重载:添加了time参数
public class TianTian extends Cat{
/**
* 重载
*/
public void lick(int time) {
System.out.println("我是甜甜猫我通常每天舔自己"+time+"小时");
}
}
我们在测试类里面想要调用甜甜猫的lick方法:
public class Test {
public static void main(String[] args) {
TianTian tianTian = new TianTian();
tianTian.lick();
}
}
我们要是直接这样写其实并不会调用重载的方法而是会跳过甜甜猫直接去调用Cat里面的link方法,所以输出的是:猫猫都喜欢舔自己,我当时好奇为什么会这样,我们new对象的时候是new的Tiantian呀,后来通过自己的编码尝试发现:
对于重载的方法,怎样区别这些名字相同参数不同的方法就是通过在测试类里面传参!也就是说你要是括号里什么都不写就像这样: tianTian.lick();
那么它对应的lick方法就是重载之前的lick方法而不是重载时候的,具体你想要哪一个重载的方法就需要你填写对应它自己的参数后就可以了,比如: tianTian.lick(5);
这里我们传入了5这个time值,就会输出对应的重载方法啦!
下一个题目:
首先按照要求实现:![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/55b713e35c4fcc7594dc9c7a5f66b3b1.png)
然后第一个:类E同时实现接口A和B的时候会优先调用哪一个呢?
这里说一下自己首先判断的方法:IDEA在按下alt+insert的时候选择方法重写:
我们会发现只能调用Bb接口中的方法
第二个方法是自己查看同学得知的,这也打破了我对java接口的认知,接口居然可以写实体方法通过default:然后我网上了解了一下default:
这是一个java8的新特性,可以实现接口中写方法体,我们通过这个方法来测试一下优先级:
第二个情况,类 E 继承 D,同时实现接口 A 和接口 B 时,会调用哪个方法?答案是会调用类D中的方法:
说明类的优先级还是高于接口的
三:第三种情况:类 E 同时实现接口 A、接口 B 和接口 C 时,会调用哪个方法?答案是这个会根据你自己的super决定,也就是接口与接口之间是没有优先关系的:
第四种: E 继承 D,且同时实现接口 A、接口 B 和接口 C 时,会调用哪个方法?答案还是D,因为D是类优先级高于接口:
关于抽象类和接口的区别:
相同点:
- 两者都是抽象类,都不能实例化。
- interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法。
不同点:
- interface需要实现,要用implements,而abstract class需要继承,要用extends。
- 一个类可以实现多个interface,但一个类只能继承一个abstract class。
- interface强调特定功能的实现,而abstract class强调所属关系。
- 接口中中的每一个方法都是抽象方法,而且没有方法体只是声明,实现类必须全家实现,但是抽象类的子类可以有选择的去实现