java 8-6 抽象的练习

时间:2023-03-08 22:48:25

1、 猫狗案例
具体事物:猫,狗
共性:姓名,年龄,吃饭

分析:从具体到抽象
猫:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:吃饭(猫吃鱼)

狗:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:吃饭(狗吃肉)

因为有共性的内容,所以就提取了一个父类。动物。
但是又由于吃饭的内容不一样,所以吃饭的方法是抽象的,
而方法是抽象的类,类就必须定义为抽象类。

抽象动物类:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:吃饭();

实现:从抽象到具体
动物类:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:吃饭();

狗类:
继承自动物类
重写吃饭();

猫类:
继承自动物类
重写吃饭();

 //定义抽象的动物类
abstract class Animal3{ //定义成员变量
private String name;
private int age; //抽象吃类,必须要进行的方法
abstract void eat(); //构造方法
//无参
public Animal3(){}
//有参
public Animal3(String name,int age){
this.name = name;
this.age = age;
} //get Xxx set Xxx
public String getName(){
return name;
}
public int getAge(){
return age;
}
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
} } //定义狗类
class Dog3 extends Animal3{
//无参 必须要 , 测试类才能够调用
public Dog3(){};
//有参构造方法
public Dog3(String name, int age){
super(name, age);
} public void eat(){
System.out.println("狗吃肉么");
}
//特有的方法
public void look(){
System.out.println("哈士奇能看门?");
}
} //定义猫类
class Cat3 extends Animal3{
//构造方法,无参,有参
public Cat3(){};//必须要
public Cat3(String name,int age){
super(name, age);
}
//成员方法
public void eat(){
System.out.println("猫吃鱼吖");
}
//特有的方法
public void pa(){
System.out.println("猫爬树厉害");
}
} //测试类 class AbstractTest1{
public static void main(String[] args){ //方法1 具体类用法
Cat3 c = new Cat3();
c.setName("波斯猫");
c.setAge(2);
System.out.print(c.getName()+"\t"+c.getAge()+"\t");
c.eat();
System.out.println("----------"); //方式2 具体类用法
Dog3 d = new Dog3("哈士奇",1);
System.out.print(d.getName()+"\t"+d.getAge()+"\t");
d.eat();
System.out.println("----------"); //方法3 多态方法
//先定义为猫
Animal3 a = new Cat3();
a.setName("短尾猫");
a.setAge(1);
System.out.print(a.getName()+"\t"+a.getAge()+"\t");
a.eat();
System.out.println("----------");
//向下转换 使其能调用猫类特有的方法
Cat3 a1 = (Cat3) a;
a1.pa();
System.out.println("----------"); //转换为狗类
a = new Dog3("二哈",1);
System.out.print(a.getName()+"\t"+a.getAge()+"\t");
a.eat();
System.out.println("----------");
//向下转换 使其能调用狗类特有的方法
Dog3 d1 = (Dog3) a;
d1.look();
}

2、 老师案例
具体事物:小学老师,大学老师
共性:姓名,年龄,讲课。
不同:大学老师比小学老师多了一条成员变量、
分析:
小学老师
姓名,年龄
讲课。
大学老师
姓名,年龄
讲课。
实现:
老师类
小学老师
大学老师

 //定义抽象的老师类
abstract class Teacher{ //成员变量
private String name;
private int age; //构造方法
//无参
public Teacher(){}
//有参
public Teacher(String name,int age){
this.name = name;
this.age = age;
} //getXxx,setXxx方法
public String getName(){
return name ;
}
public int getAge(){
return age;
}
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
} //抽象方法 方法为空
public abstract void teacher();
//成员方法
public void eat(){
System.out.println("吃饭");
} } //定义小学老师类
class xiaoTeacher extends Teacher{
//构造方法
//无参
public xiaoTeacher(){}
//有参
public xiaoTeacher(String name,int age){
super(name,age);
}
//成员方法
public void teacher(){
System.out.println("教小学");
}
//特有的方法
public void zhaogu(){
System.out.println("照顾小孩子");
}
} //定义大学老师类
class daTeacher extends Teacher{
//构造方法
private int money;//大学老师比小学老师多了一项收入,项目收入
public daTeacher(){}
public daTeacher(String name,int age,int money){
super(name,age); //这2项走父类Teacher的
this.money = money;//money走自己这边的
}
//money的set和get
public int getMoney(){
return money;
}
public void setMoney(int money){
this.money = money;
}
//成员方法
public void teacher(){
System.out.println("教大学");
}
//特有方法
public void yanjiu(){
System.out.println("做研究或项目");
}
} //测试类
class AbstractTest2{
//具体方法1
public static void main(String[] args){
xiaoTeacher x = new xiaoTeacher();
x.setName("张三");
x.setAge(24);
System.out.println(x.getName()+"\t"+x.getAge());
x.teacher();
x.zhaogu();
x.eat();
System.out.println("--------------"); //具体方法2
daTeacher d = new daTeacher("李四",32,5000);
System.out.println(d.getName()+""+d.getAge()+"\t项目收入:"+d.getMoney());
d.teacher();
d.yanjiu();
x.eat();
System.out.println("--------------"); //多态方法
//先小学
Teacher a = new xiaoTeacher();
a.setName("小张");
a.setAge(24);
System.out.println(a.getName()+"\t"+a.getAge());
a.teacher();
a.eat();
//向下转换
xiaoTeacher a1 = (xiaoTeacher) a;
a1.zhaogu();
System.out.println("--------------"); //转大学
a = new daTeacher("老李",32,5000);
a.teacher();
System.out.println(a.getName()+"\t"+a.getAge());
System.out.println("--------------");
//向下转型
daTeacher a2 = (daTeacher)a;
a2.yanjiu();
System.out.println(a2.getName()+"\t"+a2.getAge()+"\t项目收入:"+a2.getMoney());
a.eat();
}
}