Java入门基础day27

day27

接口

package com.saas;
​
public interface MyInterface {
​
    int NUM = 100;
​
    public void test();
}
package com.saas;
​
public class MyClass01 extends Object implements MyInterface{
​
    int NUM = 200;
​
    @Override
    public void test() {
        System.out.println(NUM);
        System.out.println(this.NUM);
//        System.out.println(super.NUM);          //  super说的是Object对象,而Object类中不含有NUM属性,所以无法调用
        System.out.println(MyInterface.NUM);
        System.out.println("this is test method.");
    }
}
package com.saas;
​
public class Test {
​
    public static void main(String[] args) {
        System.out.println(MyInterface.NUM);
​
        MyClass01 mc = new MyClass01();
​
        mc.test();
    }
}

在接口MyInterface中分别定义了NUM变量和test()方法

根据接口的特点:

  1. NUM是public,static和final修饰的

  2. test()方法是public abstract修饰的

所以其实现类中应该含有NUM属性以及test方法

  • 如果在实现类中没有做任何更改,则实现类中一定含有NUM属性,其值也是接口中一样的数值

  • 如果在实现类中再定义一个NUM变量,则各自是各自的值,但是接口中的NUM不能通过super来调用,只能通过接口名来调用

  • test方法在子类中必须实现,否则该MyClass01类必须是抽象类

package com.saas;
​
public class MyClass02 implements MyInterface {
    @Override
    public void test() {
        System.out.println("this is test method in MyClass02");
    }
}
package com.saas;
​
public class Test02 {
​
    public static void main(String[] args) {
        MyClass01 mc1 = new MyClass01();
​
        System.out.println(mc1.NUM);
        mc1.test();
​
        System.out.println("===================");
​
        MyClass02 mc2 = new MyClass02();
​
        System.out.println(mc2.NUM);
        mc2.test();
        System.out.println(mc2.count);
​
        System.out.println("********************");
​
        MyInterface mc3 = new MyClass01();
​
        System.out.println(mc3.NUM);
        mc3.test();
​
        System.out.println("===================");
​
        MyInterface mc4 = new MyClass02();
​
        System.out.println(mc4.NUM);
        mc4.test();
//        System.out.println(mc4.count);              //  实现类对象赋值给接口引用,无法调用其实现类特有的成员
    }
}

对于mc3和mc4两个引用来说,都属于MyInfterface类型,但是分别由其实现类创建

那么通过引用调用属性和方法,最终都应该表现为其实现类的表现形式

接口引用不可以调用实现类所特有的属性和方法

package com.saas.oo1;
​
public interface Swimmable {
​
    void swim();
}
package com.saas.oo1;
​
public interface Runnable {
​
    void run();
}
package com.saas.oo1;
​
public class Animal {
​
    public void eat(){
        System.out.println("eatting...");
    }
​
    public void sleep(){
        System.out.println("sleeping...");
        System.out.println("zzzzzZZZZZZ");
    }
}
package com.saas.oo1;
​
public class Dog extends Animal implements Swimmable, Runnable{
    @Override
    public void run() {
        System.out.println("撒欢儿跑");
    }
​
    @Override
    public void swim() {
        System.out.println("狗刨");
    }
​
    @Override
    public void eat() {
        System.out.println("狗喜欢吃骨头");
        super.eat();
    }
​
    public void bark(){
        System.out.println("wangwangwang");
    }
}
package com.saas.oo1;
​
public class Test {
​
    public static void main(String[] args) {
        Dog d = new Dog();
​
        d.run();
        System.out.println("------------------");
        d.swim();
        System.out.println("------------------");
        d.sleep();
        System.out.println("------------------");
        d.eat();
        System.out.println("------------------");
​
        System.out.println("==================");
​
        Animal ad = new Dog();
​
        ad.sleep();
        System.out.println("------------------");
        ad.eat();
        System.out.println("------------------");
//        ad.swim();                                      //  ad是属于Animal类型,不能调用Animal里面不存在的swim()方法
        System.out.println("------------------");
//        ad.run();                                       //  ad是属于Animal类型,不能调用Animal里面不存在的run()方法
​
        System.out.println("==================");
​
        Swimmable sd = new Dog();
        System.out.println("------------------");
        sd.swim();
        System.out.println("------------------");
//        sd.run();
        System.out.println("------------------");
//        sd.eat();
        System.out.println("------------------");
//        sd.sleep();
​
        System.out.println("==================");
​
        Runnable rd = new Dog();
        System.out.println("------------------");
//        rd.swim();
        System.out.println("------------------");
        rd.run();
        System.out.println("------------------");
//        rd.eat();
        System.out.println("------------------");
//        rd.sleep();
    }
}
    Dog d = new Dog();                  //  将狗当狗看
    Animal ad = new Dog();              //  将狗当动物看,只能调用动物和狗共同的属性和行为
    Swimmable sd = new Dog();           //  将狗当会游泳的东西看,只能调用会游泳的东西和狗共同的属性和行为
    Runnable rd = new Dog();            //  将狗当会跑的东西看,只能调用会跑的东西和狗共同的属性和行为
    
    //不同引用所能看到的对象范围不同,只能调用自身类型中所声明的部分
    //以上后三行代码构成了多态,其中最后两行是接口实现的多态,第二行是继承实现的多态   

引用类型,仅可调用自己的类型的成员

常见的关系:

类与类:

  • 单继承

  • extends 父类名称

类与接口:

  • 多实现

  • implements 接口1,接口2, 接口3 ...

接口与接口:

  • 多继承

  • extends 接口1, 接口2, 接口3...

package com.saas.oo1;
​
public interface Liangqi extends Swimmable, Runnable{
}

两栖类动物本身被定义成接口,可以继承自Swimmable接口和Runnable接口

常量接口

将多个常用于表示状态或者固定值的变量,以静态常量的形式定义在接口中统一管理,提到代码的可读性

package com.saas.oo2;
​
public interface Contants {
​
    int MALE = 1;
​
    int FEMALE = 0;
​
    int score01 = 10;
    int score02 = 25;
    int score03 = 40;
    int score04 = 60;
}

接口是定义常量的最佳场所

接口的好处

降低程序的耦合性

更自然地使用多态

设计与实现的完全分离

更容易搭建程序框架

更容易实现更换具体实现

接口总结

概念:

  • 微观:接口是一种能力或约定

  • 宏观:接口是一种标准

与类的异同:

  • 没有构造方法

  • 仅可定义公开的静态的最终的变量和公开的抽象的方法

接口的应用:

  • Java特点是单继承,当父类方法种类无法满足子类需求时,可以实现接口扩展子类功能

接口的规范:

  • 任何实现接口的类,必须实现接口中的方法,否则该类继续时抽象类

  • 实现接口中的方法,必须是用public修饰的

常量接口:

  • 用来存放固定不变的指定地方

  • 可以用统一的接口来访问和管理

接口的应用

需求:

  • 学院要求有学院的基本信息

  • 学院的老师也要有基本信息

  • 学院的打印机可以分别打印学院的基本信息和教师的基本信息

  • 设计这样一个系统,要求要有较好的可扩展性和可维护性

package com.saas.oo3;
​
public class College implements Introduce{
​
    private Printer printer;
​
    public void setPrinter(Printer printer) {
        this.printer = printer;
    }
​
    @Override
    public String info() {
        return "i am a collage";
    }
​
    //  学院的打印机来打印教师的信息
    public void printContent(Introduce tea){
        //  printer是打印机对象,是学院类中的一个打印机属性
        //  学院的打印机调用打印机的打印方法,将教师的详细信息进行打印
        printer.print(tea.info());
    }
}
package com.saas.oo3;
​
public interface Introduce {
​
    String info();
}
package com.saas.oo3;
​
public class Teacher implements Introduce{
    @Override
    public String info() {
        return "i am a teacher.";
    }
}
package com.saas.oo3;
​
public interface Printer {
​
    void print(String content);
}
package com.saas.oo3;
​
public class BlackPrinter implements Printer{
    @Override
    public void print(String content) {
        System.out.println("start black white printing ...");
        System.out.println(content);
    }
}
package com.saas.oo3;
​
public class ColorPrinter implements Printer{
    @Override
    public void print(String content) {
        System.out.println("start color printing ...");
        System.out.println(content);
    }
}
package com.saas.oo3;
​
public class Test {
​
    public static void main(String[] args) {
        Teacher tea = new Teacher();
​
        College coll = new College();
​
        Printer color = new ColorPrinter();
        coll.setPrinter(color);
​
        coll.printContent(coll);
        System.out.println("-------------------");
        coll.printContent(tea);
​
        System.out.println("====================");
​
        Printer black = new BlackPrinter();
​
        coll.setPrinter(black);
        coll.printContent(coll);
        System.out.println("-------------------");
        coll.printContent(tea);
    }
}

这个案例相对与上次的案例来说扩展性和维护性变得更好

我们发现Teacher类和College类中都含有String类型的info方法,那么运用抽象的特点,将像的部分放到接口(Introduce)中,然后让Teacher类和College类分别实现该Introduce接口

将原本学院College类中的两个方法printContent合二为一,原本的两个参数College和Teacher现在都可以使用一个Introduc而引用来统一管理,原本含有College参数和Teacher参数的两个方法,现在才换成了一个含有College和Teacher的共同接口的Introduce类型的引用的一个方法

这么做的 好处是,我们新增学生类,College类的printContent方法无需做任何修改,只需要让学生类Student实现Introduce接口即可

今天关于打印机也做了升级,我们发现打印机虽然满足is a的关系,彩色打印机是一种打印,但是如果两个类中没有共同的代码块,更好的做法还是使用接口而不是继承关系

最终的运行结果如下:

start color printing ...
i am a collage
-------------------
start color printing ...
i am a teacher.
====================
start black white printing ...
i am a collage
-------------------
start black white printing ...
i am a teacher.

这样的可扩展性和维护性,相对于之前有所提升。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文解析智慧城市,人工智能技术将成“智”理主要手段

长期以来,有关智慧城市的讨论主要围绕在技术进步方面,如自动化、人工智能、数据的公开以及将更多的传感器嵌入城市以使其更加智能化。实际上,智慧城市是一个关于未来的设想,其重要原因在于城市中存在各种基础设施、政治、地理、财…

鸿蒙开发-ArkTS语言-并发

鸿蒙开发-UI-交互事件-键鼠事件 鸿蒙开发-UI-交互事件-焦点事件 鸿蒙开发-UI-交互事件-手势事件 鸿蒙开发-UI-web 鸿蒙开发-UI-web-页面 鸿蒙开发-ArkTS语言-基础类库 文章目录 前言 一、并发概述 二、异步并发开发 1. 异步并发概述 1.1 Promise 1.2 async/await 2. 单次…

【HTML】制作一个简单的三角形动态图形

目录 前言 开始 HTML部分 CSS部分 效果图 总结 前言 无需多言,本文将详细介绍一段HTML和CSS代码,具体内容如下: 开始 首先新建文件夹,创建两个文本文档,其中HTML的文件名改为[index.html],CSS的文件名…

llama.cpp运行qwen0.5B

编译llama.cp 参考 下载模型 05b模型下载 转化模型 创建虚拟环境 conda create --prefixD:\miniconda3\envs\llamacpp python3.10 conda activate D:\miniconda3\envs\llamacpp安装所需要的包 cd G:\Cpp\llama.cpp-master pip install -r requirements.txt python conver…

JavaScript 对象管家 Proxy

JavaScript 在 ES6 中,引入了一个新的对象类型 Proxy,它可以用来代理另一个对象,并可以在代理过程中拦截、覆盖和定制对象的操作。Proxy 对象封装另一个对象并充当中间人,其提供了一个捕捉器函数,可以在代理对象上拦截…

什么是ECC?ECC 和 RSA 之间有何区别?

椭圆曲线密码学 (ECC) 是一种基于椭圆曲线数学的公开密钥加密算法。 它提供了一种执行密钥交换、数字签名和加密等加密操作的安全方式。 ECC 为 1977 年首次发布的 Rivest-Shamir-Adleman (RSA) 加密算法提供了一种替代性方案。 继续阅读,进一步了解椭圆曲线密码学…

一文读懂!企业怎样才能选择适合自己的生产管理系统?

怎么选择适合所在企业的生产管理系统呢?该从哪些方面对生产管理系统进行评估?又怎样实现高效的生产管理呢? 本文我将和大家一起解决这些有关生产管理系统的问题? 生产管理系统模板,可直接查看和使用:https…

设备巡检系统革新:凡尔码平台的智能化配电箱管理

配电箱作为电气安全的关键环节,其巡检工作至关重要。传统的巡检方法依赖手工记录,不仅效率低下,而且难以确保数据的实时性和准确性。凡尔码平台的二维码设备巡检系统,以数字化解决方案,颠覆了这一过程,实现…

HWOD:自守数

一、知识点 break只会结束最里面的一层循环 int型数按位比较的时候,可以直接求余比较,无需转换为char型数组后再按下标比较 二、题目 1、描述 自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25^2 625,76^2 5776…

element-ui empty 组件源码分享

今日简单分享 empty 组件的源码实现,主要从以下三个方面: 1、empty 组件页面结构 2、empty 组件属性 3、empty 组件 slot 一、empty 组件页面结构 二、empty 组件属性 2.1 image 属性,图片地址,类型 string,无默认…

数据结构——栈(C语言版)

前言: 在学习完数据结构顺序表和链表之后,其实我们就可以做很多事情了,后面的栈和队列,其实就是对前面的顺序表和链表的灵活运用,今天我们就来学习一下栈的原理和应用。 准备工作:本人习惯将文件放在test.c…

线下陪玩小程序APP源码开发--线下游戏陪玩小程序App开发(源码平台)-APP小程序H5-前后端源码交付。

线下陪玩达人入驻服务系统软件开发(APP、公众号、小程序、H5搭建) 线下陪玩接单系统平台开发案例分析 1.丰富的娱乐项目:该平台提供了丰富的娱乐项目,包括但不限于桌游、运动、户外活动等,能够满足不同用户的需求。 2…

“不知今夕是何年”的周基年解法 | 得物技术

2024年1月5日,周五,本来是个美好的日子,期待着马上到来的周末。可是下午1点多,接到产品一个问题反馈,经过一番排查,23年7月份上线的功能,对于跨年场景的处理有问题,其核心在于“周的…

windows 11 如何使用 IE 浏览器

众所周知:IE 浏览器已经被微软废弃,像windows 11这种系统内置已经找不到 IE 浏览器了,这对前端工程师而言,肯定是不行的。因为项目中,经常有现场需要支持 ie 浏览器。(吐槽一下:微软都放弃了&am…

Centos7安装单机版Kafka

下载 链接:https://pan.baidu.com/s/1W8lVEF6Y-xlg6zr3l9QAbg?pwdhbkt 提取码:hbkt 上传到服务器/opt目录 安装 # kafka安装目录为 /opt/kafka cd /opt; mkdir kafka; mv kafka_2.13-2.7.0.tgz ./kafka;cd kafka; #解压 tar -zxvf kafka_2.13-2.7.0…

OpenHarmony实战开发-如何通过Stage模型实现一个简单的游戏卡片

介绍 本示例展示了如何通过Stage模型实现一个简单的游戏卡片。 通过卡片支持的点击事件进行交互,让用户通过点击的先后顺序把一个乱序的成语排列成正确的成语。使用了C和TS的混合编程方式,将获取随机数的能力下沉到C实现,并通过NAPI的能力将…

[RK3588-Android12] 调试MIPI-双通道-压缩屏(Video Mode/MIPI Dphy 8Lane/DSC 144HZ)

问题描述 被测屏幕:小米Pad6 分辨率:1800X2880 模式:Video Mode/MIPI Dphy 8Lane/DSC 144HZ PPS: 11 00 00 89 30 80 0B 40 03 84 00 14 01 C2 01 C2 02 00 01 F4 00 20 01 AB 00 06 00 0D 05 7A 06 1A 18 00 10 F0 03 0C 20 00 06 0B 0B 33…

ssh连接虚拟机 ubuntu

目录 虚拟机设置linux 安装sshFileZilla登录 虚拟机设置 linux 安装ssh sudo apt-get install openssh-server FileZilla登录

【问题处理】银河麒麟操作系统实例分享,理光打印机lpr协议打印问题处理

1.问题环境 系统版本:Kylin-Desktop-V10-SP1-General-Release-xxx-20221120-x86_64 内核版本:linux 5.4.18-44kt-generic 系统版本:麒麟v10 sp1 处理器:kx6640ma 2.问题描述 问题详细描述:用户通过lpr协议去连接…

2024052期传足14场胜负前瞻

2024052期售止时间为4月3日(周三)22点00分,敬请留意: 本期深盘多,1.5以下赔率7场,1.5-2.0赔率1场,其他场次是平半盘、平盘。本期14场难度中等偏下。以下为基础盘前瞻,大家可根据自身…