Java继承和多态之综合练习
一、成员类型
二、抽象类
抽象类(abstract class):一种父类,作为模板使用,可根据其格式创建和修改新的类
- 抽象类的方法:①带方法体的一般方法;②没有方法体的抽象方法
- 抽象方法:①只需要声明,不需要实现;②用;结尾,不用{}结尾;③意味该方法必须被子类方法覆盖
三、Override
四、接口
接口(interface):类似于抽象类,不同于其数据成员都是静态的且必须初始化(数据常量) 可以声明抽象方法外,还可以定义静态方法和默认方法
/**
* 按照动物、宠物、猫和蜘蛛的关系,通过编程实现各自的关系并声明自己的属性和方法。
*/
// 创建Animal类,它是所有动物的抽象父类
abstract class Animal{
// 声明一个受保护的字符串类型属性type、legs,分别记录动物的种类和腿的数目
protected String type;
protected int legs;
// 定义一个受保护的有参构造器,用来初始化type和legs属性
protected Animal(String type,int legs){
this.type=type;
this.legs=legs;
}
// 声明抽象方法eat,无返回值
public abstract void eat();
// 声明具体方法walk来打印动物是如何行走的(包括腿的数目)
public void walk(){
System.out.println(type+"用 "+legs+" 条腿走路");
}
}
// 定义蜘蛛类 Spider继承Animal类
class Spider extends Animal{
// 定义默认构造器,它调用父类构造器来指明动物类别是spider,且所有蜘蛛都是8条腿。
public Spider(){
super("spider",8);
}
// 实现eat方法,输出:spider eating
@Override
public void eat(){
System.out.println("spider eating");
}
}
// 创建pet接口
interface Pet{
// 提供setName(String name) 为该pet命名
public void setName(String name);
// 提供getName() 返回该宠物的名字,返回类型为String
public String getName();
// 提供 play()方法,无返回值
public void play();
}
// 定义公开的猫类 Cat 继承动物类并实现宠物接口
public class Cat extends Animal implements Pet{
// 定义一个name属性来存宠物的名字
private String name;
// 定义一个有参构造器,它使用String参数指定猫的名字
// 该构造器必须调用超类构造器来指明动物种类是cat,且所有的猫都是四条腿
public Cat(String name){
super("cat",4);
this.name=name;
}
// 另定义一个无参的构造器。该构造器调用前一个构造器(用this关键字)并传递一个空字符串作为参数
public Cat(){
this("");
}
// 实现 Pet接口的方法
// 设置猫的名称
@Override
public void setName(String name){
this.name=name;
}
// 获取猫的名称
@Override
public String getName(){
return name;
}
// 重写 Animal 类的play(),输出:Cat is playing
public void play(){
System.out.println("Cat is playing");
}
// 重写 Animal 类的eat(),输出:xx eating
@Override
public void eat(){
System.out.println(name+" eating");
}
}
Demo
public class Demo {
public static void main(String[] args) {
Spider spider = new Spider();
spider.walk();
Cat cat = new Cat("Kitty");
System.out.println("小猫的名字叫:"+cat.getName());
cat.walk();
cat.play();
cat.eat();
}
}