抽象类的练习
/*
猫狗案例
具体事物:猫,狗
共性:姓名,年龄,吃饭
分析:从具体分析到抽象的过程
猫:Cat
成员变量:姓名,年龄
构造方法:无参构造,有参构造
成员方法:吃饭(猫吃鱼)
狗:Dog
成员变量:姓名,年龄
构造方法:无参构造,有参构造
成员方法:吃饭(狗吃肉)
通过分析我们发现,两个类存在相同的内容,所以提取出一个抽象类:Animal6
抽象动物类:
成员变量:姓名,年龄
构造方法:无参构造,有参构造
成员方法:吃饭(该方法是抽象的,没有具体的实现)
*/
//定义一个抽象动物类
abstract class Animal6 {
//姓名
private String name;
//年龄
private int age;
//无参构造
Animal6() {
}
//有参构造
Animal6(String name, int age) {
this.name = name;
this.age = age;
}
// getXxx()和setXxx()方法
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;
}
//show方法,输出所有的成员变量值
public void show() {
//其中隐含了this关键字
System.out.println("姓名:" + this.name + ",年龄:" + this.age);
}
//吃饭的抽象方法
public abstract void eat();
}
class Dog6 extends Animal6 {
Dog6() {
}
Dog6(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("狗吃肉");
}
}
class Cat6 extends Animal6 {
Cat6() {
}
Cat6(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
public class AbstractTest2 {
public static void main(String[] args) {
//使用多态创建第一个对象
Animal6 a = new Dog6("小白", 3);
a.show();
a.eat();
//创建第二个对象,使用公共的getXxx和setXxx进行赋值
Animal6 a2 = new Dog6();
a2.setName("大黄");
a2.setAge(4);
a2.show();
a2.eat();
//创建第三个对象
Animal6 a3 = new Cat6("小黑",2);
a3.show();
a3.eat();
}
}
/*
老师案例
具体事物:基础班老师,大数据班老师
共性:姓名,年龄,讲课。
*/
abstract class Teacher{
private String name;
private int age;
public Teacher() {
}
public Teacher(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 teach();
}
class JavaTeacher extends Teacher{
public JavaTeacher() {
}
public JavaTeacher(String name, int age) {
super(name, age);
}
@Override
public void teach() {
System.out.println("教java SE基础");
}
}
class BigDataTeacher extends Teacher{
public BigDataTeacher() {
}
public BigDataTeacher(String name, int age) {
super(name, age);
}
@Override
public void teach() {
System.out.println("教大数据");
}
}
public class AbstractTest3 {
public static void main(String[] args) {
//创建一个对象,使用构造方法给成员变量进行赋值,并使用getXxx获取值
//抽象多态的形式创建对象
Teacher t1 = new JavaTeacher("小虎",18);
System.out.println(t1.getName()+"---"+t1.getAge());
t1.teach();
//创建一个对象,使用setXxx对成员变量进行赋值,并使用getXxx获取值
Teacher t2 = new BigDataTeacher();
t2.setName("火火");
t2.setAge(19);
System.out.println(t2.getName()+"---"+t2.getAge());
t2.teach();
}
}
/*
假如我们在开发一个系统时需要对员工类进行设计,员工包含3个属性:姓名、工号以及工资。
经理也是员工,除了含有员工的属性外,另为还有一个奖金属性。
请使用继承的思想设计出员工类和经理类。要求类中提供必要的方法进行属性访问。
分析:
普通员工:
成员变量:姓名,工号,工资
成员方法:工作(搬砖)
经理:
成员变量:姓名,工号,工资,奖金
成员方法:工作(做PPT)
实现:
员工类:(抽象类)
普通员工类:
经理:
*/
//定义一个员工类
abstract class Staff {
private String name;
private int age;
private String id;
private int salary;
public Staff() {
}
public Staff(String name, int age, String id, int salary) {
this.name = name;
this.age = age;
this.id = id;
this.salary = salary;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
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 work();
}
//定义一个具体的普工类
class CommonWorker extends Staff{
public CommonWorker() {
}
public CommonWorker(String name, int age, String id,int salary) {
super(name, age, id, salary);
}
@Override
public void work() {
System.out.println("搬砖");
}
}
class Manager extends Staff{
//私有的奖金属性
private int bonus;
public Manager() {
}
public Manager(String name, int age, String id, int salary, int bonus) {
super(name, age, id, salary);
this.bonus = bonus;
}
public int getBonus() {
return bonus;
}
public void setBonus(int bonus) {
this.bonus = bonus;
}
@Override
public void work() {
System.out.println("做PPT");
}
}
public class AbstractTest4 {
public static void main(String[] args) {
//多态创建第一个对象
Staff cw1 = new CommonWorker("李玉伟", 18, "Alibaba2000", 20000);
cw1.work();
//多态创建第二个对象
Staff s2 = new Manager();
s2.setName("杨旭");
s2.setAge(23);
s2.setId("TengXun1000");
s2.setSalary(30000);
// s2.setBonus(200000);
//将s2进行向下转型
Manager m = (Manager)s2;
m.setBonus(200000);
System.out.println(s2.getName()+"---"+s2.getAge()+"---"
+s2.getId()+"---"+s2.getSalary()+"----"+((Manager) s2).getBonus());
s2.work();
}
}