第2节案例猫和狗/抽象类
需求:请采用多态的思想实现猫和狗的案例,并在测试类中进行测试
思路:1、定义动物类(Animal)
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:get/set方法,吃饭()
2、定义猫类(Cat),继承动物类
构造方法:无参,带参
成员方法:重写吃饭()
3、定义狗类(Dog),继承动物类
构造方法:无参,带参
成员方法:重写吃饭()
4、定义测试类(AnimalDemo),写代码测试
package itheima_09; public class Animal { public String name; public int age; public Animal(String name, int age) { this.name = name; this.age = age; } public Animal() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void eat(){ System.out.println("动物吃东西"); } }
package itheima_09; public class Cat extends Animal{ public Cat(String name, int age) { super(name, age); } public Cat() { } @Override public void eat() { System.out.println("猫吃鱼"); } }
package itheima_09; public class Dog extends Animal{ public Dog(String name, int age) { super(name, age); } public Dog() { } @Override public void eat() { System.out.println("狗吃骨头"); } }
package itheima_09; /* * 测试类 * */ public class AnimalDemo { public static void main(String[] args) { //创建猫类对象进行测试 Animal a=new Cat(); a.name="加菲猫"; a.age=1; a.setName("加菲"); a.setAge(2); System.out.println(a.name+","+a.age); System.out.println(a.getName()+","+a.getAge()); a.eat(); a=new Cat("加菲猫",4); System.out.println(a.getName()+","+a.getAge()); //创建狗类对象进行测试 Animal b=new Dog(); b.setName("大黑狗"); b.setAge(3); System.out.println(b.getName()+","+b.getAge()); b.eat(); b=new Dog("狗子",15); System.out.println(b.getName()+","+b.getAge()); } }
抽象类概述
在java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类
package itheima_10; public abstract class Animal { // public void eat(){ // System.out.println("吃东西"); // } public abstract void eat(); }
package itheima_10; public class AnimalDemo { public static void main(String[] args) { // Animal a=new Animal(); // a.eat(); } }
抽象类的特点
package itheima_10; public abstract class Animal { public abstract void eat(); public void sleep(){ System.out.println("睡觉"); } }
package itheima_10; public class Cat extends Animal{ @Override public void eat() { System.out.println("猫吃鱼"); } }
package itheima_10; public abstract class Dog extends Animal{ }
package itheima_10; public class AnimalDemo { public static void main(String[] args) { // Animal a=new Animal(); // a.eat(); Animal a=new Cat(); a.eat(); a.sleep(); } }
- 抽象类和抽象方法必须使用abstract关键字修饰
- public abstract class 类名{}
- public abstract void eat();
- 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
- 抽象类不能实例化
- 抽象类如何实例化呢?参照多态的方式,通过子类对象实例化,这叫抽象类多态
- 抽象类的子类
- 要么重写抽象类中的所有抽象方法
- 要么是抽象类
抽象类的成员特点
- 成员变量
- 可以是变量
- 也可以是常量
- 构造方法
- 有构造方法,但是不能实例化
- 那么,构造方法的作用是什么呢?用于子类访问父类数据的初始化
- 成员方法
- 可以有抽象方法:限定子类必须完成某些动作
- 也可以有非抽象方法:提高代码复用性
案例:猫和狗
需求:请采用抽象类的思想实现猫和狗的案例,并在测试类中进行测试
思路:1、定义动物类(Animal)
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:get/set方法,吃饭();
2、定义猫类(Cat),继承动物类
构造方法:无参,带参
成员方法:重写吃饭(){....}
3、定义狗类(Dog),继承动物类
构造方法:无参,带参
成员方法:重写吃饭(){.....}
4、定义测试类(AnimalDemo),写代码测试
package itheima_12; public abstract class Animal { private String name; private int age; public Animal() { } public Animal(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public abstract void eat(); }
package itheima_12; public class Cat extends Animal{ public Cat() { } public Cat(String name, int age) { super(name, age); } @Override public void eat() { System.out.println("猫吃鱼"); } }
package itheima_12; public class Dog extends Animal{ public Dog() { } public Dog(String name, int age) { super(name, age); } @Override public void eat() { System.out.println("狗吃骨头"); } }
package itheima_12; /* * 测试类 * */ public class AnimalDemo { public static void main(String[] args) { //创建对象,按照多态的方式 Animal a=new Cat(); a.setName("加菲猫"); a.setAge(15); a.eat(); System.out.println(a.getName()+","+a.getAge()); a=new Cat("加菲",12); System.out.println(a.getName()+","+a.getAge()); Animal b=new Dog(); b.setName("狗梦"); b.setAge(24); System.out.println(b.getName()+","+b.getAge()); b.eat(); b=new Dog("大狗梦",25); System.out.println(b.getName()+","+b.getAge()); } }

浙公网安备 33010602011771号