练习3:创建一个基类,让它包含抽象方法print(),并在导出类中覆盖该方法。覆盖后的方法版本可以打印导出类中定义的某个整型变量的值。在定义该变量之处,赋予它非零值。在基类的构造器中调用这个方法。现在,在main()方法中,创建一个导出类对象,然后调用它的print()方法。请解释发生的情形。
代码如下:
public class TestAbstract {
public static void main(String[] args) {
CmdPrint cmdPrint = new CmdPrint();
cmdPrint.print();
}
}
abstract class Print {
Print() {
print();
}
abstract void print();
}
class CmdPrint extends Print {
private int lineNum = 20;
@Override
void print() {
System.out.println("CmdPrint.print() lineNum=" + lineNum);
}
}
运行结果如下:
CmdPrint.print() lineNum=0
CmdPrint.print() lineNum=20
练习4:创建一个不包含任何方法的抽象类,从它那里导出一个类,并添加一个方法。创建一个静态方法,它可以接受指向基类的引用,将其向下转型到导出类,然后再调用静态方法。在main()中,展现它的运行情况。然后,为基类中的方法加上abstract声明,这样就不再需要向下转型。
需要向下转型的代码实现如下:
public class TestAbstract {
public static void main(String[] args) {
Animal animal = new Dog();
Dog.show(animal);
}
}
abstract class Animal {
}
class Dog extends Animal {
void eat() {
System.out.println("Dog.eat() food");
}
static void show(Animal animal) {
((Dog) animal).eat();
}
}
运行结果如下:
Dog.eat() food
不需要向下转型的代码实现如下:
public class TestAbstract {
public static void main(String[] args) {
Animal animal = new Dog();
Dog.show(animal);
}
}
abstract class Animal {
abstract void eat();
}
class Dog extends Animal {
@Override
void eat() {
System.out.println("Dog.eat() food");
}
static void show(Animal animal) {
animal.eat();
}
}
运行结果如下:
Dog.eat() food
此文仅作为记录。