Java基础知识(十六)(面向对象--7)接口

1、接口:
      (1)句定义格式:接口使用关键:interface表示
           interface 接口名{}
      (2)接口是如何实现的呢?
          接口不能直接实例化
          那么接口如何去表示呢?
          这里需要另外一个关键字供其他类实现该接口:implements
          使用多态的形式进行实现,由具体的子类进行实例化,其实这是多态的一种,叫做接口多态。
      (3)也可以用一个抽象类去实现

      现在我们将猫狗案例加入钻火圈的功能改写。

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

class Cat extends Animal{

    public Cat() {
    }

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

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

//定义一个钻火圈的接口
interface ZuanHuoQuan{
    void zuanHuo();
}

class TrainCat extends Cat implements ZuanHuoQuan{

    @Override
    public void zuanHuo() {
        System.out.println("猫钻火圈");
    }
}

public class InterfaceDemo1 {
    public static void main(String[] args) {
        //定义出了一个会钻火圈的猫
        Cat c = new TrainCat();
        TrainCat tc = (TrainCat) c;
        tc.zuanHuo();

    }
}


2、 接口中成员的特点:
      (1)成员变量:
                只能是常量,并且是静态的
                JVM在真正运行之前会自动补齐修饰符:public static final
                建议:在学习阶段手动补齐,在开发阶段,省略不写。
     (2)构造方法:
                接口中没有构造方法。
     (3)成员方法:
                接口中的方法只能是抽象方法,没有方法体,连大括号都没有
                JVM在真正运行之前会自动补齐修饰符:public abstract
                建议:在学习阶段手动补齐,在开发阶段,省略不写。

       (4)注意:
        a、当一个具体的类实现接口的时候,必须实现接口中所有的抽象方法
        b、当一个抽象类实现接口的时候,可以选择不实现接口中的方法,也可以选择性的实现
        c、接口与接口之间什么关系呢?

interface Inter{
    public static final int a = 10;
//    Inter(){}

    //java: 接口抽象方法不能带有主体
//    public void fun(){
//        System.out.println("玩游戏");
//    }

    public abstract void fun();
    public abstract void fun2();
}

//虽然接口中没有构造方法,但是多态初始化的时候会先初始化父类再初始化子类
//这里其实继承了一个父类
//java中所有的类都有一个父类叫做Object
//每一个class都有Object作为父类
//那么所有继承Object类的子类都拥有了父类Object类中的方法
class Demo extends Object implements Inter{

    @Override
    public void fun() {
        System.out.println("Demo类中实现玩游戏方法");
    }

    @Override
    public void fun2() {
        System.out.println("Demo类中实现玩游戏方法2");
    }
}

abstract class Demo2 implements Inter{
    @Override
    public void fun() {
        System.out.println("抽象类中实现接口抽象方法");
    }
}

public class InterfaceDemo2 {
    public static void main(String[] args) {
        Inter i = new Demo();
        System.out.println(i.a);
//        java: 无法为最终变量a分配值
//        i.a = 100;
        System.out.println(Inter.a);
        i.fun();
    }
}

3、类与类,类与接口,接口与接口的关系
        类与类:
            存在继承关系,只能进行单继承,不可以进行多继承,但是可以是多层继承
        类与接口:
            实现关系,可以是单实现,也可以是一次性实现多个接口,也可以在继承一个类的同时,实现多个接口
        接口与接口:
            存在的是继承关系,可以进行单继承,也可以进行多继承
 


interface Inter2{}
interface Inter3{}
interface Inter4 extends Inter2,Inter3{}

class Demo3 extends Object implements Inter2,Inter3{}


public class InterfaceDemo3 {
}

4、猫狗案例:加入跳高的功能
     分析:
                猫:
                    属性:姓名,年龄
                    行为:吃饭,睡觉
                狗:
                    属性:姓名,年龄
                    行为:吃饭,睡觉
               由于猫和狗存在共性,所以我们提取出来到一个新的类中
               动物:(抽象类)
                    属性:姓名,年龄
                    行为:吃饭(),睡觉()
               猫:继承自动物
               狗:继承自动物

               由于跳高是一个额外的功能,不是动物特有的,所以我们利用接口的方式去定义
               接口:
                        跳高
               部分的猫:实现接口
               部分的狗:实现接口

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

    public Animal4() {
    }

    public Animal4(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 abstract void sleep();
}

class Cat4 extends Animal4{
    public Cat4() {
    }

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

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

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

class Dog4 extends Animal4{

    public Dog4() {
    }

    public Dog4(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 Cat4 implements Jump{

    public JumpCat() {
    }

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

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

//定义会跳高的狗
class JumpDog extends Dog4 implements Jump{

    public JumpDog() {
    }

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

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



public class InterfaceDemo4 {
    public static void main(String[] args) {
        //创建一个不会跳高的狗
        Animal4 a1 = new Dog4("小白",2);
        a1.eat();
        a1.sleep();
        //创建一个会跳高的狗
        //抽象多态
        Dog4 d1 = new JumpDog("大白",3);
        d1.eat();
        d1.sleep();
        ((JumpDog) d1).jump();

        //接口多态
        Jump j1 = new JumpDog("小黑",4);
        j1.jump();
    }
}

5、老师和学生案例,加入抽烟的额外功能

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

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

            人:(抽象类)
                属性:姓名,年龄
                行为:吃饭(),睡觉()
            由于不是所有的老师和学生都抽烟,只有部分的老师和学生会
            所以,我们将抽烟定义为一个接口
            部分的老师:实现抽烟接口
            部分的学生:实现抽烟的接口

//抽烟的接口
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 SmokeTeacher extends Teacher implements Smoking{
    public SmokeTeacher() {
    }

    public SmokeTeacher(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 InterfaceDemo5 {
    public static void main(String[] args) {
        //创建一个不抽烟的学生对象
        Person p1 = new Student("阿杰",18);
        p1.eat();
        p1.sleep();
        //ClassCastException
//        ((SmokeStudent)p1).smoke();

        //创建一个抽烟的学生对象
        Person p2 = new SmokeStudent("阿豪",17);
        p2.eat();
        p2.sleep();
        ((SmokeStudent) p2).smoke();
    }
}

6、教练和运动员案例(学生分析然后讲解)
乒乓球运动员和篮球运动员。
乒乓球教练和篮球教练。
为了出国交流,跟乒乓球相关的人员都需要学习英语。
请用所学知识:
分析,这个案例中有哪些抽象类,哪些接口,哪些具体类。

分析:

由于这个题较为复杂,我们在使用IDEA写代码的时候可以归一归类。


通常情况下,常见会4层:
bean: 一般存放的是将来要new的实体类
controller: 一般是数据的入口类
dao: 具体对数据做操作的地方,放在dao层,这一层一般情况下,都是对数据库做操作的
service: 一般在这里面放的是接口,和实现类。

具体代码如下:

(1)bean中代码:

Person:

public 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 void show() {
        System.out.println("姓名:" + name + ",年龄:" + age);
    }
}

 CoachMan:

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

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

 SportMan:

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

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

BasketballCoachMan:

public class BasketballCoachMan extends CoachMan{
    public BasketballCoachMan() {
    }

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

 BasketballMan:

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

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

 

(2)service中的代码:

PingPang接口:

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

 PingPangSportManImpl: 

import com.shujia.wjj.day12.ketang.interfacedemo.sportdemo.bean.SportMan;

public class PingPangSportManImpl extends SportMan implements PingPang {

    public PingPangSportManImpl() {
    }

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

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

PingPangCoachManImpl: 

import com.shujia.wjj.day12.ketang.interfacedemo.sportdemo.bean.CoachMan;

public class PingPangCoachManImpl extends CoachMan implements PingPang {
    public PingPangCoachManImpl() {
    }

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

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

(3)controller中的代码:

SportManDemo测试类:

import com.shujia.wjj.day12.ketang.interfacedemo.sportdemo.bean.BasketballMan;
import com.shujia.wjj.day12.ketang.interfacedemo.sportdemo.bean.SportMan;
import com.shujia.wjj.day12.ketang.interfacedemo.sportdemo.service.PingPangSportManImpl;

//测试类,测试写的案例
public class SportManDemo {
    public static void main(String[] args) {
        //创建一个乒乓球运动员对象
        SportMan sm = new PingPangSportManImpl("阿豪",18);
        sm.show();
        ((PingPangSportManImpl)sm).studyEnglish();

        //创建一个篮球运动员
        SportMan sm2 = new BasketballMan("阿杰",19);
        sm2.show();
//        ((BasketballMan)sm2).studyEnglish();

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值