java的抽象类和接口

news2024/11/27 4:19:26

抽象类:
abstract,可以用此关键字修饰类和方法

abstract修饰类就是抽象类,修饰方法就是抽象方法

抽象类的注意事项,特点:
抽象类不一定有抽象方法,但有抽象方法的类一定是抽象类

类该有的成员(成员变量,方法,构造器)抽象类也可以有

抽象类的特点:抽象类不能创建对象,仅仅作为一种特殊的父类,让子类继承并实现

一个类继承抽象类,必须重写抽象类的全部抽象方法,否则这个类也变成抽象类 

测试:

public class test {
    public static void main(String[] args) {
        animal a1=new cat();
        animal a2=new dog();
        a1.bark();
        a2.bark();

        animal[]a=new animal[]{new cat("hh"),new dog("aa")};
        for(int i=0;i<a.length;i++)
        {
            a[i].bark();
        }
    }
}

 结果:

模板方法设计模式的写法:

  • 1:定义一个抽象类
  • 2:在类里面定义两个方法:

一个是模板方法:把相同代码放到里面去

一个是抽象方法:具体实现交给子类完成 

建议在模板方法用final修饰,防止被子类重写

接口:
 

public inferface 接口名(类似干爹)

{

//成员变量(当作常量)

//成员方法(当作抽象方法)

注意:接口不能创建对象;接口是用来被类实现的,实现接口的类叫实现类 

修饰符 class 实现类 implements 接口1,接口2...

{} 

一个类可以实现多个接口,必须重写所有接口的抽象方法

接口的好处:
弥补了类单继承的不足,一个类可以实现多个接口。

让程序员可以面向接口编程。 

使用接口:

这是我写的一个学生管理系统,里面有两种管理方法,可以使用一种接口类和两种实现类

学生类:

public class student {
    private String name;
    private String sex;
    private double score;

    public student() {
    }

    public student(String name, String sex, double score) {
        this.name = name;
        this.sex = sex;
        this.score = score;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
}

这是接口类:

public interface operator {
    void printIN(ArrayList<student>list);
    void printAv(ArrayList<student>list);

}

里面的这两个函数都是抽象函数

我们可以定义两种实现类,实现多态。

第一个实现类 

public class operatorimp1 implements operator{


    @Override
    public void printIN(ArrayList<student> list) {
        System.out.println("----所有学生信息如下----");
        for(int i=0;i<list.size();i++)
        {
            student s=list.get(i);
            System.out.println("姓名:"+s.getName()+",性别:"+s.getSex()+",分数"+s.getScore());
        }
    }

    @Override
    public void printAv(ArrayList<student> list) {
        double scoreAll=0.0;
        for (int i = 0; i < list.size(); i++) {
            student s=list.get(i);
            scoreAll+=s.getScore();
        }
        System.out.println("----所有学生平均成绩如下------");
        System.out.println("平均成绩为:"+(scoreAll/ list.size()));
    }
}

第二个实现类:

public class operatorimp2 implements operator {


    @Override
    public void printIN(ArrayList<student> list) {
        int count1=0;//记录男生数量
        int count2=0;//记录女生数量
        System.out.println("----所有学生信息如下----");
        for (int i = 0; i < list.size(); i++) {
            student s = list.get(i);
            System.out.println("姓名:" + s.getName() + ",性别:" + s.getSex() + ",分数" + s.getScore());
            if(s.getSex().equals("男"))
            {
                count1++;
            }
            else count2++;
        }

        System.out.println("男生数量为:"+count1+",女生数量为:"+count2);
    }

    @Override
    public void printAv(ArrayList<student> list) {
        double scoreAll = 0.0;
        int maxindex=0;
        int minindex=0;
        for (int i = 0; i < list.size(); i++) {
            if(list.get(i).getScore()>list.get(maxindex).getScore())
            {
                maxindex=i;
            }
            if(list.get(i).getScore()<list.get(minindex).getScore())
            {
                minindex=i;
            }
            student s = list.get(i);
            scoreAll += s.getScore();
        }
        System.out.println("----所有学生平均成绩如下------");
        System.out.println("最高分为:"+list.get(maxindex).getScore()+",最低分为:"+list.get(minindex).getScore());
         System.out.println("平均成绩为:" + ((scoreAll-list.get(maxindex).getScore()-list.get(minindex).getScore()) / (list.size()-2)));
    }
}

这样一来我们就可以定义两个两个学生管理类

 接下来我定义了一个添加学生的类

import java.util.ArrayList;
import java.util.Scanner;

public class studentAdd {
   static ArrayList<student> list = new ArrayList<>();
   static Scanner sa = new Scanner(System.in);

    public studentAdd() {
    }

    public static ArrayList<student> studentadd() {
        System.out.println("请输入学生姓名");
        student s = new student();
        s.setName(sa.next());
        System.out.println("请输入学生性别");
        s.setSex(sa.next());
        System.out.println("请输入学生成绩");
        s.setScore(sa.nextDouble());
        System.out.println("录入成功");
        System.out.println("------该学生的信息如下-----");
        System.out.println("姓名:"+s.getName()+",性别:"+s.getSex()+",分数:"+s.getScore());
        list.add(s);
        return list;
    }

}

最后就是总类:
 

import java.util.ArrayList;
import java.util.Scanner;

public class studentStart {
    Scanner sa1=new Scanner(System.in);
    Scanner sa2=new Scanner(System.in);
    ArrayList<student> list=new ArrayList<>();
    public void studentstart() {
        while (true) {
            System.out.println("-----欢迎进入学生管理系统------");
            System.out.println("按1进入添加学生功能");
            System.out.println("按2进入管理学生信息系统1");
            System.out.println("按3进入管理学生信息系统2");
            System.out.println("按4退出学生管理系统");
            int i = sa1.nextInt();
            if (i == 1) {
                list=studentAdd.studentadd();//添加新学生
            }
            if(i==2)
            {
                while (true) {
                    System.out.println("-----欢迎进入学生信息系统1------");
                    System.out.println("按1打印所有学生信息");
                    System.out.println("按2打印学生平均成绩");
                    System.out.println("按3退出学生信息系统1");
                    studentManger1 m1=new studentManger1(list);//把list传入
                    int x=sa2.nextInt();
                    if(x==1)
                    {
                        m1.printINFO();
                    }
                    if(x==2)
                    {
                        m1.printAve();
                    }
                    if(x==3)
                    {
                        System.out.println("退出学生信息系统1,欢迎下次光临~~");
                        break;
                    }
                }
            }
            if(i==3)
            {
                while (true) {
                    System.out.println("-----欢迎进入学生信息系统2------");
                    System.out.println("按1打印所有学生信息");
                    System.out.println("按2打印学生平均成绩");
                    System.out.println("按3退出学生信息系统2");
                    studentManger2 m2=new studentManger2(list);
                    int x=sa2.nextInt();
                    if(x==1)
                    {
                        m2.printINFO();
                    }
                    if(x==2)
                    {
                        m2.printAve();
                    }
                    if(x==3)
                    {
                        System.out.println("退出学生信息系统2,欢迎下次光临~~");
                        break;
                    }
                }
            }
            if(i==4)
            {
                System.out.println("退出学生管理系统,欢迎下次光临~~");
                break;
            }
        }
    }
}

测试:

public class test {
    public static void main(String[] args) {
        /*studentAdd add1=new studentAdd();
        ArrayList<student>list=new ArrayList<>();
        list=add1.studentadd();
        list=add1.studentadd();
        studentManger1 m1=new studentManger1(list);
        m1.printINFO();
        m1.printAve();*/
        studentStart s=new studentStart();
        s.studentstart();
    }
}

结果:

添加功能:

进入信息管理系统1:

 进入信息管理系统2:

接口新增方法:

默认方法:使用default修饰,使用实现类的对象调用

接口类 对象=new 实现类();

静态方法:static修饰,必须使用当前接口名调用

私有方法:private修饰,只有在接口内部被调用 

以上三种都不是抽象方法,他们都会默认被public修饰

好处:增强接口的能力,更便于项目的扩展和维护。

接口的多继承:

一个接口可以同时继承多个接口

便于实现类的实现

注意事项:

  1. 一个接口继承多个接口,如果多个接口中存在方法签名(名字一样,不管类型)冲突,则此时不支持多继承。
  2. yige一个类实现多个接口,如果多个接口存在方法签名冲突,则此时不支持多实现
  3. 一个类继承了父类,又同时实现了接口,父类和接口中有同名的默认方法(default修饰),实现类会优先调用父类的
  4. yige一个类实现多个接口,多个接口存在同名的默认方法,可以不冲突,这个类重写该方法即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1558578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云ECS经济型e实例,性价比超高的入门级云服务器!

阿里云服务器ECS经济型e系列是阿里云面向个人开发者、学生、小微企业&#xff0c;在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器&#xff0c;CPU处理器采用Intel Xeon Platinum架构处理器&#xff0c;支持1:1、1:2、1:4多种处理器内存配比&#xff0c…

在A中删除既在B表中出现又在C表中出现的元素

方法一&#xff08;感觉有点取巧&#xff0c;不太推荐&#xff0c;但是实现简单&#xff09;&#xff1a; 算法思想:保留La的头节点&#xff0c;并用pcur指针指向La链中的第一个结点&#xff0c;通过pcur指针遍历La中的每一个元素&#xff0c;并判断该元素是否在Lb和Lc链中出现…

腾讯云2核4G服务器优惠价格165元一年,限制500GB月流量

腾讯云轻量2核4G5M服务器租用价格165元1年、252元15个月、三年900元&#xff0c;配置为轻量2核4G5M、5M带宽、60GB SSD盘、500GB月流量、上海/广州/北京&#xff0c;腾讯云优惠活动 yunfuwuqiba.com/go/txy 腾讯云轻量2核4G5M服务器租用价格 腾讯云&#xff1a;轻量应用服务器1…

一篇搞定AVL树+旋转【附图详解旋转思想】

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…

java AIO为什么用的并不多

Java AIO的本质是什么 原文&#xff1a;https://blog.csdn.net/hellojackjiang2011/article/details/131322757?spm1001.2101.3001.6650.1&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-131322757-blog-103915337.235%5Ev43%5Epc_blo…

鸿蒙OS(ArkTS) 案例:【使用http网络请求框架加载验证码】

需求&#xff1a;加载验证码&#xff1b;1.下载验证码图像文件&#xff1b;2.获取header里面验证码ID 踩坑--踩坑--踩坑 根据文档使用 request.downloadFile 请求&#xff0c;官方示例: // pages/xxx.ets // 将网络资源文件下载到应用文件目录并读取一段内容 import common …

微信小程序开发【从入门到精通】——页面导航

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

【面试专题】JVM相关

1.为什么需要JVM&#xff0c;不要JVM可以吗&#xff1f; 1.JVM可以帮助我们屏蔽底层的操作系统 一次编译&#xff0c;到处运行 2.JVM可以运行Class文件 2.JDK&#xff0c;JRE以及JVM的关系 3.我们的编译器到底干了什么事&#xff1f; 仅仅是将我们的 .java 文件转换成了 .cl…

帆软报表在arm架构的linux

有朋友遇到一个问题在部署帆软报表时遇到报错。 问 我在 arm架构的linux服务器上部署帆软报表遇到了一个棘手的问题&#xff0c;你有空帮忙看下嘛。 我看后台日志报的错是 需要升级 gcc、libmawt.so &#xff0c;是系统中缺少Tomcat需要的依赖库&#xff0c;你之前处理过类似…

基于uQRCode封装的前端二维码生成组件实践

在前端开发中&#xff0c;二维码生成已成为一种常见需求。二维码凭借其简洁、方便的特点&#xff0c;被广泛应用于产品推广、信息交互等多个场景。在此背景下&#xff0c;开发一个易于使用且性能优越的二维码生成组件变得至关重要。本文基于uQRCode封装了一个前端二维码生成组件…

详解JAVA程序调优

目录 1.概述 2.命令 2.1.查看JAVA进程 2.2.查看虚拟机状态 2.3.查看线程的情况 3.工具 3.1.jconsole 3.2.jvisualVM 4.实战场景 1.概述 在实际工作中我们难免会遇见程序执行慢、线程死锁等一系列的问题&#xff0c;这时候就需要我们定位具体问题然后来解决问题了。所…

安科瑞路灯安全用电云平台解决方案【电不起火、电不伤人】

背景介绍 近年来 &#xff0c;随着城市规模的不断扩大 &#xff0c;路灯事业蓬勃发展。但有的地方因为观念、技术、管理等方面不完善 &#xff0c;由此引发了一系列安全问题。路灯点多面广 &#xff0c;一旦漏电就极容易造成严重的人身安全事故。不仅给受害者家庭带来痛苦 &am…

抽象类和接口的简单认识

目录 一、抽象类 1.什么是抽象类 2.抽象类的注意事项 3.抽象类与普通类的对比 二、接口 1.接口的简单使用 2.接口的特性 3.接口的使用案例 4.接口和抽象类的异同 一、抽象类 所谓抽象类&#xff0c;就是更加抽象的类&#xff0c;也就是说&#xff0c;这个类不能具体描…

雷卯有多种接口与电源保护方案

在当今的电子设备中&#xff0c;各种接口和电源保护至关重要。它们不仅关乎设备的正常运行&#xff0c;更直接影响到数据传输的稳定性和设备的安全。雷卯公司以其专业的技术和丰富的经验&#xff0c;为您提供全面的接口与电源保护方案&#xff0c;确保您的系统安全稳定运行。 …

图像分割论文阅读:Automatic Polyp Segmentation via Multi-scale Subtraction Network

这篇论文的主要内容是介绍了一种名为多尺度差值网络&#xff08;MSNet&#xff09;的自动息肉分割方法。 1&#xff0c;模型整体结构 整体结构包括编码器&#xff0c;解码器&#xff0c;编码器和解码器之间是多尺度差值模块模块&#xff08;MSM&#xff09;&#xff0c;以及一…

golang grpc和protobuf的版本降级问题(version4 -> version3)

最后更新于2024年3月28日 10:57:52 简中没查到类似的文章。一点小事闹麻了&#xff0c;搞了一天&#xff0c;特意发出来造福大家。 所谓的版本就是下面这个东西proto.ProtoPackageIsVersion4或者proto.ProtoPackageIsVersion3&#xff1a; 目的 为了适配旧代码&#xff0c…

探索c++:string常用接口 迷雾

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 一、string类 这里我们对string类进行一个简单的总结&#xff1a; string是表示字符串的字…

蓝桥小白入门赛6

原题链接&#xff1a;第 6 场 小白入门赛 - 蓝桥云课 目录 A、元宵节快乐 B、猜灯谜 C、数学奇才 D、你不干&#xff1f;有的是帕鲁干&#xff01; E、等腰三角形 F、 计算方程 A、元宵节快乐 签到题 print("Today AK!") B、猜灯谜 模拟&#xff0c;特判下…

容器四(Map 接口)

目录 HashMap 和 HashTable Map 接口中的常用方法 HashMap 底层实现 Hashmap 基本结构 存储数据过程 put(key,value) 取数据过程 get(key) 扩容问题 JDK8 将链表在大于 8 情况下变为红黑二叉树 Map 就是用来存储“键(key)&#xff0d;值(value) 对”的。 Map 类中存储的…

《科技创新与应用》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答&#xff1a; 问&#xff1a;《科技创新与应用》是什么级别期刊&#xff1f; 答&#xff1a;省级&#xff1b;主管单位&#xff1a;黑龙江省科学技术协会&#xff1b;主办单位&#xff1a;黑龙江省创联文化传媒有限公司 问&#xff1a;《科技创新与应用》是核心期刊…