目录
在学习继承的实现前,我们需要先了解继承的概念和特点:
程序中的继承
- 一种类与类之间的关系
- 使用已存在的类的定义作为基础建立新类
- 新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类
- 满足“A is a B”的关系,就可以形成继承关系
继承的实现
通过extends实现继承方法
编写父类:
class Animal{
//公共的属性和方法
}
编写子类,继承父类:
注:一个子类只有唯一的父类(只能继承一个父类)
(extends 父类名:必选参数,用于指定要定义的子类继承于哪个父类)
class Dog extends Animal{
//子类特有的属性和方法
}
class Cat extends Animal{
}
通过编写一个动物类来实现简单的继承关系,建立两个包,此处父类命名为Animal,子类命名为Cat和Dog,调用测试类为Test。
在父类中我们定义公共属性,昵称,月份,品种,定义eat()的成员方法
package com.imooc.animal;
public class Animal {
private String name;//昵称
private int month;//月份
private String species;//品种
public Animal() { //默认构造方法
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public String getSpecies() {
return species;
}
public void setSpecies(String species) {
this.species = species;
}
//吃东西
public void eat() {
System.out.println(this.getName()+"在吃东西");
}
}
定义Cat类,该类继承于父类Animal,既Cat类是Animal类的子类
package com.imooc.animal;
public class Cat extends Animal {
private double weight;//体重
public Cat() { //无参构造
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
//跑动的方法
public void run() {
System.out.println(this.getName()+"是一只"+this.getSpecies()+"的猫,它在快乐的奔跑");
}
}
再定义Dog类,该类继承于父类Animal,既Dog类是Animal类的子类
package com.imooc.animal;
public class Dog extends Animal {
private String sex;//性别
public Dog(){
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void sleep() {
System.out.println(this.getName()+"是一只"+this.getMonth()+"月大
的"+"小"+this.getSex()+"狗,"+"它在睡觉。");
}
}
最后在Test类测试调用
package com.imooc.test;
import com.imooc.animal.Cat; //ctrl+shift+o导包快捷键
import com.imooc.animal.Dog;
public class Test {
public static void main(String[] args) {
Cat one=new Cat();//创建Cat类的对象并为其分配内存
one.setName("喵喵");
one.setSpecies("中华田园猫");
one.eat();
one.run();
System.out.println("================================");
Dog two=new Dog();
two.setName("黑子");
two.setMonth(6);
two.setSex("雌");
two.eat();
two.sleep();
//子类可以无偿访问父类的非私有成员,而父类无法访问子类特有的成员
}
}
运行结果:
方法的重写
以上Dog类的eat方法是调用父类实现的,如果我们不想沿用父类中的eat方法,而想有自己独立的eat()的方法,这里我们可以通过方法的重写实现
重写是指父子类的关系,当子类继承父类中所有可能被子类访问的成员方法时,如果子类的方法名与父类的方法名相同,那么子类就不能继承父类的方法。
此时,称为子类的方法重写了父类的方法,重写体现了子类补充或者改变父类方法的能力。通过重写,可以使一个方法在不同的子类中表现出不同的行为。
语法规则
- 在有继承关系的子类中定义,重写父类当中的方法
- 方法名相同,参数列表相同(参数顺序,个数,类型)都要与父类继承的方法相同
- 与方法的参数名无关
- 访问修饰符,访问范围需要大于等于父类的访问范围 ( private < 默认 < protected < public )
- 当方法返回值是void或基本数据类型时,必须相同;当返回值是引用类型时,可以是父类或其子类
下面,在Dog类中重写父类的方法eat
package com.imooc.animal;
public class Dog extends Animal {
private String sex;//性别
public Dog(){
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void sleep() {
System.out.println(this.getName()+"是一只"+this.getMonth()+"月大的"+"小"+this.getSex()+"狗,"+"它在睡觉。");
}
public void eat() { //重写父类的方法
System.out.println(this.getName()+"这只狗很听话诶~");
}
}
运行结果:
我们看到,由于Dog类重写了父类的方法eat( ),所以执行的是子类的eat( )方法
但是Cat类没有重写父类的方法,所以执行的是父类中的eat( )方法