面向对象--接口--接口的例题

接口的例题

/*
        猫狗案例,加入额外的跳高功能

        分析:
            猫:姓名,年龄,吃饭,睡觉
            狗:姓名,年龄,吃饭,睡觉
        由于猫和狗存在共性,所以我们提取出来到一个抽象类中
            动物:
                姓名,年龄,吃饭(),睡觉()
            猫:继承自动物
            狗:继承自动物

        由于跳高是一个额外的功能,不是动物特有的,所以我们利用接口的方式定义

            接口:
                跳高
            部分的猫:实现接口
            部分的狗:实现接口
*/
abstract class Animal3{
    private String name;
    private int age;

    public Animal3() {
    }

    public Animal3(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 gae) {
        this.age = age;
    }

    //抽象方法
    public abstract void eat();
    public abstract void sleep();
}

class Cat3 extends Animal3{

    public Cat3() {
    }

    public Cat3(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    @Override
    public void sleep() {
        System.out.println("猫趴着睡");
    }
}

class Dog3 extends Animal3{

    public Dog3() {
    }

    public Dog3(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }

    @Override
    public void sleep() {
        System.out.println("狗侧着睡");
    }
}

//定义跳高的接口
interface Jump{
    public abstract void jump();
}

//定义部分会跳高的猫
class JumpCat extends Cat3 implements Jump{

    public JumpCat() {
    }

    public JumpCat(String name, int age) {
        super(name, age);
    }

    @Override
    public void jump() {
        System.out.println("猫跳高");
    }
}

//定义部分会跳高的狗
class JumpDog extends Dog3 implements Jump{
    public JumpDog() {
    }

    public JumpDog(String name, int age) {
        super(name, age);
    }

    @Override
    public void jump() {
        System.out.println("狗跳高");
    }
}

public class InterfaceTest1 {
    public static void main(String[] args) {
        //创建不会跳高的狗
        Animal3 a1 = new Dog3("小白",2);
        a1.eat();
        a1.sleep();
        //多态创建一个会跳高的狗
        Dog3 d1 = new JumpDog("大黄",3);
        d1.eat();
        d1.sleep();
    //多态无法访问子类的特有方法,需要向下转型  
//      d1.jump();
    //用到了向下转型和匿名对象
        ((JumpDog) d1).jump();

    //接口多态创建对象
        Jump j1 = new JumpDog("小黑",4);
    //接口中没有eat(),sleep()方法需要向下转型
//        j1.eat();
    //  ((JumpDog) j1).eat();也可以转换成((Dog3) j1).eat();
    //  因为  JumpDog extends Dog3
        ((JumpDog) j1).eat();
//        j1.sleep();
        ((JumpDog) j1).sleep();
    //多态访问成员方法的特点
          j1.jump();
    }
}
/*
        老师和学生案例,加入抽烟的额外功能

        分析:
            老师:姓名,年龄,吃饭,睡觉
            学生:姓名,年龄,吃饭,睡觉

            由于老师和学生有着共性内容,提取出来一个抽象类

            人:
                姓名,年龄,吃饭(),睡觉(){}

            由于抽烟不是所有的学生和老师都会的,只有部分老师和学生才会

            定义一个抽烟接口

            部分老师抽烟:实现抽烟接口
            部分学生抽烟:实现抽烟接口
*/

//抽烟接口
interface Smoking{
    //抽烟的抽象方法
    public abstract void smoke();
}

//定义抽象类---人
abstract class Person{
    private String name;
    private int age;

    public Person() {
    }

    public Person(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();

    //定义一个具体的睡觉方法
    public void sleep(){
        System.out.println("睡觉");
    }
}

class Teacher extends Person{

    public Teacher() {
    }

    public Teacher(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("老师喝粥");
    }
}

class Student extends Person{

    public Student() {
    }

    public Student(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("学生吃山珍海味");
    }
}

//定义部分抽烟老师类
class SomkeTeacher extends Teacher implements Smoking{

    public SomkeTeacher() {
    }

    public SomkeTeacher(String name, int age) {
        super(name, age);
    }

    @Override
    public void smoke() {
        System.out.println("老师抽烟");
    }
}

//定义部分抽烟学生类
class SmokeStudent extends Student implements Smoking{
    public SmokeStudent() {
    }

    public SmokeStudent(String name, int age) {
        super(name, age);
    }

    @Override
    public void smoke() {
        System.out.println("学生抽烟");
    }
}

public class InterfaceTest2 {
    public static void main(String[] args) {
        //创建一个不抽烟的学生对象
        Person p = new Student("潘磊",15);
        p.eat();
        p.sleep();

        //创建一个抽烟的学生对象
        Student s = new SmokeStudent("刘生发",18);
        s.eat();
        ((SmokeStudent) s).smoke();
        s.sleep();
    }
}
/*
教练和运动员案例
乒乓球运动员和篮球运动员。
乒乓球教练和篮球教练。
为了出国交流,跟乒乓球相关的人员都需要学习英语。
请用所学知识:
分析,这个案例中有哪些抽象类,哪些接口,哪些具体类。

分析:

    学习英语(接口):
        学习英语

    人(抽象类):
        姓名,年龄,运动

    教练 extends 人:
        乒乓球教练 extends 教练 implements 学习英语
        篮球教练 extends 教练
    运动员 extends 人:
        乒乓球运动员 extends 运动员 implements 学习英语
        篮球运动员 extends 运动员
*/

分析关系图

package com.shujia.wyh.day17.sportdemo.serive;

public interface StudyEnglish {
    public abstract void studyEnglish();
}


package com.shujia.wyh.day17.sportdemo.dao;

abstract class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(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 sport();
}

package com.shujia.wyh.day17.sportdemo.dao;

public abstract class CoachMan extends Person {
    public CoachMan() {
    }

    public CoachMan(String name, int age) {
        super(name, age);
    }
}

package com.shujia.wyh.day17.sportdemo.dao;

public abstract class SportMan extends Person{

    public SportMan() {
    }

    public SportMan(String name, int age) {
        super(name, age);
    }
}

package com.shujia.wyh.day17.sportdemo.serive;

import com.shujia.wyh.day17.sportdemo.dao.SportMan;

public class PingPangSportManImpl extends SportMan implements StudyEnglish {


    public PingPangSportManImpl() {
    }

    public PingPangSportManImpl(String name, int age) {
        super(name, age);
    }

    @Override
    public void sport() {
        System.out.println("乒乓球运动员打乒乓球");
    }

    @Override
    public void studyEnglish() {
        System.out.println("乒乓球运动员学习英语");
    }
}

package com.shujia.wyh.day17.sportdemo.bean;

import com.shujia.wyh.day17.sportdemo.dao.SportMan;

public class BasketballMan extends SportMan {
    public BasketballMan() {
    }

    public BasketballMan(String name, int age) {
        super(name, age);
    }

    @Override
    public void sport() {
        System.out.println("篮球运动员打篮球");
    }
}

package com.shujia.wyh.day17.sportdemo.serive;

import com.shujia.wyh.day17.sportdemo.dao.CoachMan;

public class PingPangCoachImpl extends CoachMan implements StudyEnglish {

    public PingPangCoachImpl() {
    }

    public PingPangCoachImpl(String name, int age) {
        super(name, age);
    }

    @Override
    public void sport() {
        System.out.println("乒乓球教练教乒乓球");
    }

    @Override
    public void studyEnglish() {
        System.out.println("乒乓球教练学习英语");
    }
}

package com.shujia.wyh.day17.sportdemo.bean;

import com.shujia.wyh.day17.sportdemo.dao.CoachMan;

public class BasketballCoach extends CoachMan {

    public BasketballCoach() {
    }

    public BasketballCoach(String name, int age) {
        super(name, age);
    }

    @Override
    public void sport() {
        System.out.println("篮球教练教打篮球");
    }
}

package com.shujia.wyh.day17.sportdemo.controller;

import com.shujia.wyh.day17.sportdemo.bean.BasketballCoach;
import com.shujia.wyh.day17.sportdemo.dao.CoachMan;
import com.shujia.wyh.day17.sportdemo.dao.SportMan;
import com.shujia.wyh.day17.sportdemo.serive.PingPangSportManImpl;

public class DemoTest {
    public static void main(String[] args) {
        //创建一个乒乓球运动员
        SportMan sm = new PingPangSportManImpl("吕常福",18);
        sm.sport();
        //向下转型使用特有的方法
        ((PingPangSportManImpl) sm).studyEnglish();

        //创建篮球教练
        CoachMan cm = new BasketballCoach("刘生发",17);
        cm.sport();
    }
}

 

posted @ 2021-12-12 21:17  赤兔胭脂小吕布  阅读(49)  评论(0编辑  收藏  举报