面向对象--接口--接口的例题
接口的例题
/*
猫狗案例,加入额外的跳高功能
分析:
猫:姓名,年龄,吃饭,睡觉
狗:姓名,年龄,吃饭,睡觉
由于猫和狗存在共性,所以我们提取出来到一个抽象类中
动物:
姓名,年龄,吃饭(),睡觉()
猫:继承自动物
狗:继承自动物
由于跳高是一个额外的功能,不是动物特有的,所以我们利用接口的方式定义
接口:
跳高
部分的猫:实现接口
部分的狗:实现接口
*/
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();
}
}