学习大数据的第八天——随写(重写、重载、多态以及关键字abstract和Super)的用法
重写与重载:
重写的概念:
子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。
自己的理解:
重写就是子类继承父类,父类中的方法,可以在子类重写编写,不过方法必须得一致,参数形式也得一致,以及传出的值也得一样
比如:Animal中的move方法public void move(String name);子类若想重写必须和父类的方法一摸一样
所以子类Dog中move方法也得public void move(String name);方法体中的内容随意。
官方的回答:
参数列表与被重写方法的参数列表必须完全相同,返回类型与被重写方法的返回类型可以不相同,
父类的成员方法只能被它的子类重写。
声明为 final 的方法不能被重写。
声明为 static 的方法不能被重写,但是能够被再次声明。
构造方法不能被重写
Super关键字的作用
当需要在子类中调用父类的被重写方法时,要使用 super 关键字。
自己的理解:重写在创建子类对象时实现重写方法时只能调用子类重写的方法,但是想调用父类中的方法时,须在继承的子类中写
Super.方法名(参数类型 参数名);
官方的回答:第一行;
重载的概念:
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。最常用的地方就是构造器的重载。
自己的理解:
根据“一同两不同”,重载就是在同一个类中,方法名相同,但是参数类型不同,返回类型可以不同可以相同
但是有几种情况不是重写:
1、只改变参数名称,其余的不改变
public void move(String name,int num);
public void move(String num,int n);
官方的回答:
被重载的方法必须改变参数列表(参数个数或类型不一样);
被重载的方法可以改变返回类型;
被重载的方法可以改变访问修饰符;
被重载的方法可以声明新的或更广的检查异常;
方法能够在同一个类中或者在一个子类中被重载。
无法以返回值类型作为重载函数的区分标准。
重写与重载的不同之处:
区别点 重载方法 重写方法
参数列表 必须修改 一定不能修改
返回类型 可以修改 一定不能修改
异常 可以修改,可以减少或删除 一定不能抛出新的或者更广的异常
访问 可以修改 一定不能做更严格的限制(可以降低限制)
总结:
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。
class Animal{
public void move(String name) {
System.out.println(name+" 动物可以移动");
}
public void move(String name,int num){
System.out.println(name+" 动物可以移动,"+"可以走"+num+"步");
}
}
class Dog extends Animal{
public void move(String name){
//super关键字
// super.move(name);
System.out.println(name+" 狗可以跑和叫");
}
}
public class zy2 {
public static void main(String[] args) {
Animal a = new Animal();
Animal b = new Dog();
Animal c = new Animal();
a.move("小狗");
b.move("小猪");
c.move("小马",1000);
}
}
Java的多态
多态的概念:
多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作
多态的优点:
1、消除类型之间的耦合关系
2、可替换性
3、可扩充性
4、接口性
5、灵活性
6、简化性
多态存在的三个必要条件:
继承
重写
父类引用指向子类对象:Person p = new Child();
注意一个关键字:
abstract:
1、从上面的例子中我们可以看到抽象方法跟普通方法是有区别的,它没有自己的主体(没有{}包起来的业务逻辑),
跟接口中的方法有点类似。所以我们没法直接调用抽象方法
2、抽象方法不能用private修饰,因为抽象方法必须被子类实现(覆写),而private权限对于子类来说是不能访问的,所以就会产生矛盾
3、抽象方法也不能用static修饰,试想一下,如果用static修饰了,那么我们可以直接通过类名调用,
而抽象方法压根就没有主体,没有任何业务逻辑,这样就毫无意义了。
abstract class Animal1 {
abstract void eat();
// abstract void work();
}
class Cat extends Animal1 {
public void eat() {
System.out.println("吃鱼");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog1 extends Animal1 {
public void eat() {
System.out.println("吃骨头");
}
public void work() {
System.out.println("看家");
}
}
public class zy3 {
public static void show(Animal1 a){
a.eat();
if(a instanceof Cat){
Cat c = (Cat) a;
c.work();
}else if(a instanceof Dog1){
Dog1 d = (Dog1) a;
d.work();
}
}
public static void main(String[] args) {
show(new Cat());
show(new Dog1());
Animal1 a = new Cat();
a.eat();
Cat c = (Cat) a;
c.work();
}
}