首页 > 编程语言 >16_Java中接口与类和抽象类的关系

16_Java中接口与类和抽象类的关系

时间:2022-10-05 23:22:39浏览次数:50  
标签:Java name 16 void 接口 public abstract 抽象类 age

Java中接口的与类和抽象类的关系

抽象类:抽象对象,接口:抽象方法,两者配合,一个负责将一类对象抽象化,一个负责将特殊方法,后加特殊方法抽象化,然后再用一个具体类进行继承与实现来达到很好的效果

一、接口与类

1、类和类的关系:

​ 继承关系,只能单继承,但是可以多层继承

2、类和接口的关系:

​ 实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口

3、接口和接口的关系:

​ 继承关系,可以是单继承,也可以是多继承

4、参考代码:

package com.itheima_04;
/*
接口与接口之间是继承关系 并且可以进行多继承(接口的目的主要是提供抽象方法)
 */
public interface Inter1 extends Inter3, Inter2{
}
package com.itheima_04;

public interface Inter2 {
}
package com.itheima_04;

public interface Inter3 {
}
package com.itheima_04;
/*
一个类在 继承一个类的基础上 还可以实现多个接口
 */
public class inertImpl extends Object implements Inter1, Inter2, Inter3{

}

二、接口与抽象类的区别(事物与行为的抽象)

1、成员区别:

​ 抽象类: 变量,常量; 有构造方法; 有抽象方法,也有非抽象方法

​ 接 口: 常量; 无构造方法; 抽象方法

2、关系区别:

​ 类与类:继承与单继承

​ 类与接口:实现,可以单实现,也可以多实现

​ 接口与接口:继承,单继承,多继承

3、设计理念区别

​ 抽象类: 对象抽象,包括属性、行为

​ 接口: 对行为抽象,主要是行为

举例说明:

门和报警的例子:

门:都有open()和close()两个动作,这个时候,我们可以分别使用抽象类和接口来定义这个概念

在此基础上添加报警功能

//抽象类
public abstract class Door{
    public abstract void open();
    public abstract void close();
	public abstract void alarm();	//可以发现万一有的门不能报警?
}
//接口
public interface Door{
    //public abstract void open();
    //public abstract void close();
    void open();
    void close();
    void alarm();			//有的又只能报警呢?
}

所以有:

public interface Alram{
    void alarm();	//将报警独立于一个接口(需要即实现)
}

public abstract class Door{	//将门都有的放在门的抽象类中
    public abstract void open();
    public abstract void close();
}

//而这个类就可以取所需要的,也还可以再写一些特殊的接口来多实现,这样有利于代码的复用性和维护性
public class AlramDoor extends Door implements Alram{
    public void open(){
        //...
    }
    
    public void close(){
        //...
    }
    
    public void alarm(){
        //...
    }
}

三、案例运动员和教练

需求:我们现在有乒乓球运动员和篮球运动员,乒乓球教练和篮球教练。为了出国交流,跟乒乓球相关的工作人员都需要学习英语。请用知识分析,这个案例中有哪些具体类,那些抽象类,那些接口,并用代码实现

分析:具体到抽象 乒乓球、篮球(运动员) 乒乓球、篮球(教练) 【都是人;有的要学英语】

实现:从抽象到具体

使用:使用的是具体的类和对象

package com.itheima_05;
//说英语接口
public interface SpeakEnglish {
    public abstract void speak();
}
package com.itheima_05;
//抽象的人类
public abstract class Person {
    //成员变量
    private String name;
    private int age;

    //构造方法
    public Person(){}

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }

    //set\get\show方法
    public void setName(String name){this.name = name;}

    public String getName(){return this.name;}

    public void setAge(int age){this.age = age;}

    public int getAge(){return this.age;}

    public void show(){
        System.out.println(getName() + "," + getAge());
    }

    //定义一个 抽象类
    public abstract void eat();
}
package com.itheima_05;
//抽象教练类
public abstract class Coach extends Person{//抽象类无需重写父类抽象方法
    //构造方法
    public Coach(){}

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

    //定义一个教练类的特殊抽象方法
    public abstract void teach();
}
package com.itheima_05;
//抽象运动员类
public abstract class Player extends Person{
    //定义构造方法
    public Player(){}

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

    //定义一个抽象运动员的特殊方法
    public abstract void study();
}
package com.itheima_05;
//篮球教练类
public class BasketballCoach extends Coach{
    //构造方法
    public BasketballCoach() {
    }

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

    //重写抽象类
    @Override
    public void eat(){
        System.out.println("篮球教练吃羊肉,喝羊奶");
    }

    @Override
    public void teach(){
        System.out.println("篮球教练教如何运球和投篮");
    }
}
package com.itheima_05;
//篮球运动员类
public class BasketballPlayer extends Player{
    //构造方法
    public BasketballPlayer(){}

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

    //重写抽象方法
    @Override
    public void eat(){
        System.out.println("篮球运动员吃蔬菜,喝肉汤");
    }

    @Override
    public void study(){
        System.out.println("篮球运动员学习如何运球和投篮");
    }
}
package com.itheima_05;
//乒乓球教练类
public class PingPangCoach extends Coach implements SpeakEnglish{
    //构造方法

    public PingPangCoach() {
    }

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

    //重写抽象方法
    @Override
    public void eat(){
        System.out.println("乒乓球教练吃牛肉,和牛奶");
    }

    @Override
    public void teach(){
        System.out.println("乒乓球教练教如何发球和接球");
    }

    @Override
    public void speak(){
        System.out.println("乒乓球教练说英语");
    }
}
package com.itheima_05;
//乒乓球运动员类
public class PingPangPlayer extends Player implements SpeakEnglish{
    //构造方法
    public PingPangPlayer(){}

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

    //重写抽象方法
    @Override
    public void eat(){
        System.out.println("乒乓球运动员吃大米饭,和排骨汤");
    }

    @Override
    public void study(){
        System.out.println("乒乓球运动员学发球和接球");
    }

    @Override
    public void speak(){
        System.out.println("乒乓球运动员说英语");
    }
}
package com.itheima_05;
/*
测试类
 */
public class PersonDemo {
    public static void main(String[] args){
        //创建对象
        PingPangPlayer ppp = new PingPangPlayer();
        ppp.setName("张三");
        ppp.setAge(30);
        ppp.show();
        ppp.eat();
        ppp.study();
        ppp.speak();

        System.out.println("--------------------------");

        BasketballPlayer bp = new BasketballPlayer();
        bp.setName("李四");
        bp.setAge(32);
        bp.show();
        bp.eat();
        bp.study();
    }
}

标签:Java,name,16,void,接口,public,abstract,抽象类,age
From: https://www.cnblogs.com/fragmentary/p/16756737.html

相关文章

  • 17_Java中的类作形参和返回值
    Java中的形参和返回值此处主要说明引用类型,总结下来就是在前面的规则下,做参数和返回值就看能否自己创建对象1、能就:传入本身对象,返回本身对象2、不能就:传入子类(......
  • MyBatis的javaType和ofType的区别
      ofType是值映射到list集合中的类型,比如上面的children。当collection进行list集合映射是需要用ofType,也就是一对多的时候使用......
  • 大聪明教你学Java | Spring Boot 使用自定义注解实现防止表单重复提交
    前言这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战表单重复提交是在多用户的Web应用中最常见且带来麻烦最多的一个问题。有很多的应用场景都会遇到......
  • 【Java8新特性】- Lambda表达式
    Java8新特性-Lambda表达式......
  • Java反射详解,学以致用,实战案例(AOP修改参数、Mybatis拦截器实现自动填充)
    持续创作,加速成长!这是我参与「掘金日新计划·10月更文挑战」的第1天,点击查看活动详情作为Java开发者,你认为反射这个知识点重要程度,在你心里是什么样的呢?以前我也只觉......
  • heiamJava16IO流
    JavaI/O流按流的方向分输入输出流I表示intput(输入),是数据从硬盘文件读入到内存的过程,称之输入,负责读。O表示output(输出),是内存程序的数据从内存到写出硬盘文件的过......
  • java之String的一些常用方法
    string--字符串#######equals和==的区别?-equals:是比较两个对象是否一样(比较的内容->属性值)-==:比较两个地址是否一样-java8之前,常量池存放在堆中,java8以......
  • Java在线聊天功能
    封装工具类封装工具类packageutils;importjava.io.IOException;importjava.io.UnsupportedEncodingException;importjava.net.URLEncoder;importorg.apache......
  • 面试+学习+做项目+最全Java视频讲解
    关注公众号:计算机视觉与图形学实战​​Java零基础教程视频(适合Java0基础,Java初学入门)​​​​尚硅谷Java零基础入门教程(含百道Java真题,2万多行Java代码实战)​​​​黑马程......
  • 超详细Java基础-多态
    茫茫人海千千万万,感谢这一秒你看到这里。希望我的能对你的有所帮助!共勉!愿你在未来的日子,保持热爱,奔赴山海!Java基础知识(多态)多态多态就是指程序中定义的引用变量所......