Java头歌 9-4 抽象类的应用

第1关:选择题

任务描述

本关任务: 完成关于抽象类及其应用的选择题。

相关知识

为了完成本关任务,你需要掌握: 1.抽象类和抽象方法, 2.继承中的注意问题:比如构造方法的调用、方法重写、用父类的对象引用子类的对象、父类的私有成员的继承问题、final修饰符和static修饰符的使用等 。

抽象类

(1)抽象类是对多个相似的类的抽象; (2)抽象类用abstract定义;抽象方法用abstract定义且无函数体;抽象类中可以没有抽象方法,但包含抽象方法的类必须声明为抽象类。 (3)基于抽象类的子类中要给出抽象方法的具体实现(不同的子类有不同的实现方法——多态) (4) 抽象类不能实例化(即不能创建抽象类的对象,因为抽象方法无法执行),但可以声明抽象类的对象,用它引用不同子类的对象,从而实现:相同的语句(操作),实现不同的功能——多态

第2关:编程实现:动物发声模拟器

任务描述

本关任务:设计一个动物发生模拟器,用于模拟不同 动物 的叫声。比如狮吼、虎啸、狗旺旺、猫喵喵……。 定义抽象类Animal,包含两个抽象方法:获取动物类别getAnimalClass()、动物叫shout(); 然后基于抽象类Animal定义狗类Dog、猫类Cat,用getAnimalClass()方法返回不同的动物类别(比如猫,狗),用shout()方法分别输出不同的叫声。 最后编写AnimalShoutTest类测试,比如输出“狗的叫声是:汪汪”。

相关知识

为了完成本关任务,你需要掌握: 1.抽象类的定义,2.用抽象类定义子类,3.方法重写,4.对象的定义和使用。

参考案例

//定义抽象类 public abstract class Shape { //定义2个抽象方法 public abstract double GetArea();
public abstract double GetCircum(); //定义普通方法 public void print() { System.out.println("周长:"+GetCircum()+"面积:"+GetArea()); } } //基于Shape抽象类定义Circle类 public class Circle extends Shape{ public double radius; //新增数组成员:半径 //构造函数 public Circle(double r){ this.radius=r; } //重写继承的方法(抽象方法的具体实现) public double GetArea(){ return 3.14radiusradius; } public double GetCircum(){ return 23.14radius; } } //基于抽象类Shape定义Rectangle类 public class Rectangle extends Shape { //新增2个数据成员:长、宽 public double width; public double length; //构造函数 public Rectangle(double wid,double len){ this.width=wid; this.length=len; } //抽象方法的具体实现 public double GetArea(){ return widthlength; } public double GetCircum(){ return 2(width+length); } } //测试类Test public class Test { public static void main(String[] args){ Circle cir=new Circle(5); //创建圆的对象cir Rectangle rec=new Rectangle(2,4); //创建矩形的对象rec cir.print(); //输出圆的的信息 rec.print(); //输出矩形的的信息 Shape sh; //声明抽象类的对象,但不能创建 sh=cir; //用sh引用cir sh.print(); //输出圆的的信息 sh=rec; //用sh引用rec sh.print(); //输出矩形的信息 } }

编程要求

根据提示,在右侧编辑器的指定位置补充代码 。

测试说明

平台会对你编写的代码进行测试:

测试输入: 预期输出: 猫的叫声:喵喵 狗的叫声:汪汪

//动物发生模拟器。请在下面的【】处填写代码。
public class AnimalShoutTest {
 
	public static void main(String[] args) {
		//创建Cat类的对象cat、Dogz类的对象dog
		Cat cat=new Cat();
        Dog dog=new Dog();
		 
		 System.out.print(cat.getAnimalClass()+"的叫声:");
			cat.shout();
		System.out.print(dog.getAnimalClass()+"的叫声:");
			dog.shout();
	}
}
//定义抽象类Animal,包含两个抽象方法getAnimalClass()和shout()
abstract class Animal{
	public abstract String getAnimalClass();
	public abstract void shout();
}
//基于Animal类定义子类Cat
class Cat extends Animal{
	public String getAnimalClass() {
		return("猫");
	}
	
	public void shout(){
		System.out.println("喵喵");
	}
}
//基于Animal类定义子类Dog
class Dog extends Animal{
	public String getAnimalClass() {
		return("狗");
	}
	
	public void shout(){
		System.out.println("汪汪");
	}
}

第3关:动物发声模拟器-改进版

任务描述

本关任务: 同第2关,不同的是在main()方法中用Animal的对象引用猫、狗对象中的方法。 具体要求:设计一个动物发生模拟器,用于模拟不同 动物 的叫声。比如狮吼、虎啸、狗旺旺、猫喵喵……。 定义抽象类Animal,包含两个抽象方法:获取动物类别getAnimalClass()、动物叫shout(); 然后基于抽象类Animal定义狗类Dog、猫类Cat,用getAnimalClass()方法返回不同的动物类别(比如猫,狗),用shout()方法分别输出不同的叫声(比如喵喵、汪汪)。 最后编写AnimalShoutTest类测试,输出: 猫的叫声:喵喵 狗的叫声:汪汪

其中,在AnimalShoutTest类中,用speak(Animal animal){}方法输出动物animal的叫声,在main()方法中调用speak()方法,分别输出猫、狗对象的叫声。

相关知识

为了完成本关任务,你需要掌握: 1.抽象类的定义, 2.用抽象类定义子类, 3.方法重写, 4.对象的定义和使用, 5.用父类的对象引用子类对象中重写的方法

用父类的对象引用子类对象中重写的或继承的方法

比如,以下程序中,Shape是抽象类,Circle和Rectangle是子类,均重写了抽象方法 //定义抽象类 public abstract class Shape { //定义2个抽象方法 public abstract double GetArea();
public abstract double GetCircum(); //定义普通方法 public void print() { System.out.println("周长:"+GetCircum()+"面积:"+GetArea()); } } //基于Shape抽象类定义Circle类 public class Circle extends Shape{ public double radius; //新增数组成员:半径 //构造函数 public Circle(double r){ this.radius=r; } //重写继承的方法(抽象方法的具体实现) public double GetArea(){ return 3.14radiusradius; } public double GetCircum(){ return 23.14radius; } public void print(){ System.out.print("圆的"); super.print(); } } //基于抽象类Shape定义Rectangle类 public class Rectangle extends Shape { //新增2个数据成员:长、宽 public double width; public double length; //构造函数 public Rectangle(double wid,double len){ this.width=wid; this.length=len; } //抽象方法的具体实现 public double GetArea(){ return widthlength; } public double GetCircum(){ return 2(width+length); } public void print(){ System.out.print("矩形的"); super.print(); } } //测试类Test public class Test { public static void main(String[] args){ //创建圆的对象cir Circle cir=new Circle(5); //创建矩形的对象rec Rectangle rec=new Rectangle(2,4);
cir.print(); //输出圆的的信息 rec.print(); //输出矩形的的信息 Shape sh;//声明抽象类的对象,但不能创建 sh=cir; //用sh引用cir sh.print(); //输出圆的的信息 sh=rec; //用sh引用rec sh.print(); //输出矩形的信息 } }

问题:用sh输出圆的信息和输出矩形的信息的程序语句中,除了对象名,其他都是完全相同的。即出现重复代码的情况。

优化:在测试类中,将输出图形的信息用一个方法实现。 public static void show(Shape sh) { sh.print(); }

则main()方法中的后5行代码可以优化为: show(cir);
show(rec); 优化的目标: 用一条语句实现对多个子类对象的操作,将子类对象作为参数即可。

编程要求

根据提示,在右侧编辑器补充代码 .

测试说明

平台会对你编写的代码进行测试:

测试输入: 预期输出: 猫的叫声:喵喵 狗的叫声:汪汪

 //动物发生模拟器.  请在下面的【】处添加代码。
public class AnimalShoutTest2 {
	public static void main(String[] args) {
		 Cat cat = new Cat();
		 Dog dog = new Dog();
		//  speak(cat);
		//  speak(dog);
        cat.speak();
        dog.speak();
	}
	//定义静态方法speak()
}
//定义抽象类Animal
abstract class Animal{
	public abstract String getAnimalClass();
    public abstract void speak();
}
//基于Animal类,定义猫类Cat,并重写两个抽象方法
class Cat extends Animal{
	public String getAnimalClass(){
        return ("猫");
    }
    public void speak(){
        System.out.println("猫的叫声:喵喵");
    }
}
//基于Animal类,定义狗类Dog,并重写两个抽象方法
class Dog extends Animal{
public String getAnimalClass(){
        return ("狗");
    }
    public void speak(){
        System.out.println("狗的叫声:汪汪");
    }
	
}


第4关:改错题

任务描述

本关任务: 关于final的作用。 修改给定的程序,使得程序能顺利运行,且结果如下: speedlimit=120 running safely with 100kmph running safely with 100kmph

相关知识

为了完成本关任务,你需要掌握: 1.抽象类及抽象方法, 2.final的用法。

final

1.修饰类,则该类是最终类,即不能作为父类再定义新的子类; 2.修饰方法,则该方法为最终的方法,不能被重写; 3.修饰成员变量,则该成员为常量,其值不能被改变。

编程要求

根据提示,在右侧编辑器中根据编译的错误提示修改源程序。

测试说明

平台会对你编写的代码进行测试:

测试输入: 预期输出: speedlimit=120 running safely with 100kmph running safely with 100kmph

/* 请在下面的 Begin 和 end之间修改源程序。 
  不可以修改 final 变量的值
  final方法,不可以重写
  不可以定义final 类
*/
public class finalTest {
    public static void main(String args[]) {
        Bike1 obj = new Bike1();
        obj.run();
 
        Honda honda = new Honda();
        honda.run();
 
        Yamaha yamaha = new Yamaha();
        yamaha.run();
    }
}
 
    /********** Begin *********/
    class Bike1 {
     int speedlimit = 90;
 
    void run() {
        speedlimit = 120; 
        System.out.println("speedlimit=120");
    }
 
}
 
class Bike2 {
     void run() {
        System.out.println("running");
    }
}
 
class Honda extends Bike2 {
    void run() { 
        System.out.println("running safely with 100kmph");
    }
 
}
 
 class Bike3 {
}
 
class Yamaha extends Bike3 { 
    void run() {
        System.out.println("running safely with 100kmph");
    }
 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值