第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");
}
}