目录
7.2、重载(Overloading)和重写(Overriding)的区别和联系
7.1、方法重写的概念
7.1.1、什么是方法重写
如果从父类继承的方法不能满足子类的需求,可以在子类中对父类的同名方法进行重写(覆盖),以符合要求。
(1)子类根据需求对从父类继承的方法进行重新进行编写
(2)重写时,可以用super.方法的方式来保留父类的方法
(3)构造方法不能被重写
7.1.2、方法重写的规则
(1)重写方法和被重写方法必须具有相同的方法名
(2)重写方法和被重写方法必须具有相同的参数列表
(3)重写方法的返回值类型必须与被重写方法的返回值类型相同
(4)访问权限不能严于父类
7.2、重载(Overloading)和重写(Overriding)的区别和联系
(1)重载涉及同一个类中的同名方法,要求方法名相同、参数列表不同,与返回值类型无关
(2)重写涉及的是子类和父类之间的同名方法,要求方法名相同、参数列表相同、返回值类型相同。
7.3、方法重写:(重写优化电子宠物系统为例)
7.3.1、使用重写优化电子宠物系统:
实现如下效果
父类Animal类:Dog类和Penguin类中都存在的属性
子类Dog类:Dog类自身所独有的属性,Penguin类中没有的属性
子类Penguin类:Penguin类自身独有的属性,Dog类中没有的属性
1、第一步:创建父类,用来存储子类中共有的属性和方法
父类Animal类:
//父类Animal类 package com.bdqn.demo01; public class Animal { private String name;// 宠物昵称 private int health;// 健康值 private int love;// 亲密度 public Animal() { super(); //调用父类Object类里的无参构造方法 } public Animal(String name, int health, int love) { super(); //调用父类Object类里的无参构造方法 this.name = name; this.health = health; this.love = love; } //getter()和setter()方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getHealth() { return health; } public void setHealth(int health) { this.health = health; } public int getLove() { return love; } public void setLove(int love) { this.love = love; } // 定义一个输出动物信息的方法 public void print() { System.out.println("宠物昵称:" + this.name + ",健康值:" + this.health + ",亲密度:" + this.love); } }
2、第二步:创建子类Dog类和Penguin类:自身所独有的属性提取出来
子类Dog类:
//子类Dog类 package com.bdqn.demo01; public class Dog extends Animal{ //Dog类自身所独有的属性,Penguin类中所没有的属性 private String strain; //宠物品种 public Dog() { super();//调用父类Animal类里的无参构造方法 } public Dog(String name, int health, int love, String strain) { super(name, health, love);//调用父类Animal类里的有参构造方法 this.strain = strain; } //getter()和setter()方法 public String getStrain() { return strain; } public void setStrain(String strain) { this.strain = strain; } /* * 方法重写: * (1)方法名相同、 * (2)参数列表相同、 * (3)返回值类型相同或者是其子类、 * (4)访问权限不能严于父类*/ public void print(){ super.print(); System.out.println("宠物品种:"+this.strain); } }
子类Penguin类:
//子类Penguin类 package com.bdqn.demo01; public class Penguin extends Animal{ //Penguin类自身所独有的属性,Dog类中所没有的属性 private String sex;// 宠物性别 public Penguin() { super();//调用父类Animal类里的无参构造方法 } public Penguin(String name, int health, int love, String sex) { super(name, health, love); //调用父类Animal类里的有参构造方法 this.sex = sex; } //getter()和setter()方法 public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } /* * 方法重写: * (1)方法名相同、 * (2)参数列表相同、 * (3)返回值类型相同或者是其子类、 * (4)访问权限不能严于父类*/ public void print(){ super.print(); System.out.println("宠物性别:"+this.sex); } }
3、第三步:创建测试类
测试类Test类:
//测试类Test类 package com.bdqn.demo01; public class Test { public static void main(String[] args) { //通过有参构造方法创建Dog类对象 Dog dog1=new Dog("旺财", 91, 85, "哈士奇"); dog1.print(); //通过有参构造方法创建Penguin类对象 Penguin penguin =new Penguin("QQ", 85, 90, "Q妹"); penguin.print(); } }
输出结果:
7.3.2、重写优化电子宠物系统部分解析
(1)从输出结果可以看出dog1.print()调用的是相应子类的print()方法,可以输出自身属性的strain属性,符合需求,任务完成。
(2)从输出结果可以看出penguin.print()调用的是相应子类的print()方法,可以输出自身属性的sex属性,符合需求,任务完成。
(3)补充:在Myeclipse中调用Print()时,按Ctrl+鼠标左键,即可追踪到方法的出处,查看重写前和重写后调用的print()方法。