day10_面向对象_抽象_接口

news2024/11/18 0:37:45

今日内容

1.作业
2.final
3.抽象
4.接口

零、复习

按从大到小的顺序写出访问修饰符

  • public > protected > package (default)> private
    static修饰属性和方法的特点
  • 在内存的特点: 在方法区(不是在堆,也不是在栈)
  • 初始化的特点: 随类(字节码文件)加载到内存已经初始化
  • 使用的特点: 直接通过类名调用,被该类所有对象共享

多态出现的前提条件

  • 继承
  • 重写方法
  • 向上转型(父类对象被子类对象赋值)

多态使用的场景

  • 方法的参数列表是父类类型,传参数传入子类对象
  • 方法的返回值类型是父类类型,真正return返回的是子类对象
  • 数组数据类型是父类类型,真正存储的是子类对象

一、作业

详见 pdf6_t22_t25

二、final

final 意思: 最终的

是修饰符,修饰类,属性(变量),方法

final修饰类: 类不能被继承(不能有子类)

image-20231020100805001

final修饰属性: 属性变成常量,不可更改

image-20231020101131727

final修饰方法: 方法不能被重写

三、抽象类

3.1 介绍

抽象: 不具体的,看不太明白,跟正常有区别的…

抽象类: 不具体的类,跟正常有区别的类


语法: 使用abstract修饰类和方法

  • abstract修饰方法,方法就是抽象方法
  • 抽象方法不能有方法体
  • 抽象方法必须放在抽象类
  • 抽象类中可以写正常方法的
  • 抽象类中可以写构造方法,但不能通过new直接创建对象,而是给子类super()
  • 抽象类存在意义,被子类继承
  • 子类继承抽象类要么重写抽象方法,要么自己也得定义成抽象类

3.2 演示

// 父类

 /* @desc 抽象类
 */
public abstract class Animal {
    // 属性不能被abstract修饰
    int age;

    /**
     * - abstract修饰方法,方法就是抽象方法
     * - 抽象方法不能有方法体
     * - 抽象方法必须放在抽象类
     * - 抽象类中可以写正常方法的
     * - 抽象类中可以写构造方法,但不能通过new直接创建对象,而是给子类super()
     * - 抽象类存在意义,被子类继承
     */
    public abstract void eat();
    // 可以有正常方法
    public void play(){
        System.out.println("动物玩耍" );
    }

    // 可以有构造方法
    public Animal(){
        System.out.println("Animal()" );
    }
}

// 子类

 /* - 子类继承抽象类要么重写抽象方法,要么自己也得定义成抽象类
 */
public class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗吃骨头" );
    }
  // 非抽象方法可以重写,也可以不重写,即不强制
}

// 测试

public class TestAbstract {
    public static void main(String[] args) {
        // 抽象类不能直接new来创建对象
        // Animal a = new Animal();

        // 创建子类对象(内存中:调用父类构造方法创建父类对象)
        // 这也解释了为什么抽象类中有构造方法,是为了给子类用的,不是给自己创建对象的
        Dog dog = new Dog( );

        // 抽象类虽然不能直接创建对象,但是
        // 它可以当父类引用,指向子类对象,其实就得多态的应用
        Animal animal = new Dog();
        animal.eat();
    }
}

3.3 一些理解

以前的方法也能用,为什么现在需要将方法变成抽象方法?

  • 通过一些练习(动物系列类吃,玩耍,形状系列类求周长面积,员工系列发工资)发现,父类的方法虽然有,但是子类不适用,都需要再重写,以适应自己

  • 所以,干脆父类只是定义方法,但不实现方法,即抽象

继承抽象类后,为什么必须实现(重写)抽象方法?

  • 因为父类抽象方法没有方法体,无法执行
  • 只有子类重写了才能执行功能

抽象类存在意义是什么?有什么用呢?

  • 确实以前没有抽象类抽象方法也可以写代码,实现功能,甚至是多态功能
  • 其实,设置抽象后,就会多了一层限制功能
  • 所谓"限制",即某个类要想继承抽象类,就必须重写抽象方法,而且抽象类不能创建对象,只能用于当做父类引用,指向子类对象
  • 这就是多态的三个前提
  • 也就是说,抽象就是为了多态**,是之前多态的是一种升级,多了一个限制而已**
  • 除此之外,与之前一模一样

抽象类是用来抽象差异性、具体共同点的。

也就是将差异性方法抽象化,提供给子类用于重写。共同的方法具体化,所有子类继承使用。


把子类不一样的方法抽象成抽象方法,每个子类都重写
把子类都一样的方法提取到父类,每个子类直接用,不用重写

3.4 练习

改造之前动物类为抽象类

改造形状类为抽象类

改造员工类为抽象类

四、接口

生活中接口: USB接口,typec,水管

接口是一种规范,一种约束,满足这种约束 两个 物体就可以对接


在程序中接口,其实就是必须抽象类更抽象一种java文件

4.1 演示语法

接口的特性

1. 接口不是类,没有class修饰,而是interface

2. 接口中没有属性(变量)
     * 所有属性都是常量,默认被final修饰
     * 且也被static修饰,即接口中都是静态常量
     * 且 被public修饰
     * ------------------------------------
     * 接口中的属性默认只能被public static final修饰
     * 一般情况下,前面可省了
3. 接口中没有正常方法,所有方法都是抽象的不能有方法体
     * 因为接口中方法都默认被public abstract修饰
     *
     * ps: jdk1.8有新特性可以有方法体     

 4. 接口没有构造方法,不能创建对象
 /* 1. 接口不是类,没有class修饰,而是interface
 */
public interface USB {
    /**
     * 2. 接口中没有属性(变量)
     * 所有属性都是常量,默认被final修饰
     * 且也被static修饰,即接口中都是静态常量
     * 且 被public修饰
     * ------------------------------------
     * 接口中的属性默认只能被public static final修饰
     * 一般情况下,前面可省了
     */
    public static final double length = 1.0;
    double width = 1.0;

    /**
     * 3. 接口中没有正常方法,所有方法都是抽象的不能有方法体
     * 因为接口中方法都默认被public abstract修饰
     *
     * ps: jdk1.8有新特性可以有方法体
     */
    public abstract void tongdian();

    /**
     * 4. 接口没有构造方法,不能创建对象
     */
    //public USB(){}
}

接口存在主要用处是为了子类 实现

* 1 类实现接口,要么实现全部抽象方法,要么自己变成抽象类
* 2 类不允许多继承,但是允许多实现,即同时实现多个接口(同时遵循多种规范)
* 3 类 继承的同时还可以实现(先继承后实现)
 /* @desc 类实现接口
 * 实现单词 implement
 * 1 类实现接口,要么实现全部抽象方法,要么自己变成抽象类
 * 2 类不允许多继承,但是允许多实现,即同时实现多个接口(同时遵循多种规范)
 * 3 类 继承的同时还可以实现(先继承后实现)
 */
public class UDisk extends Waishe implements USB,Disk{
    @Override
    public void tongdian() {
        System.out.println("U盘通电" );
    }

    @Override
    public void read() {
        System.out.println("U盘读取数据" );
    }

    @Override
    public void write() {
        System.out.println("U盘写入数据" );
    }
}

4.2 作用

接口不能创建对象,主要用来当做父引用指向子实现类对象

 		// 接口当做引用,执行子实现类对象
        USB usb = new UDisk();
        // 其实完成多态的前提的第三步

即,接口主要作用,就是哪里可以用多态哪里可以用接口

4.3 与抽象的区别

抽象接口
修饰符abstract classinterface
抽象类,是类不是类
属性正常属性全是静态常量
方法可以有正常方法,抽象方法全部抽象方法
构造方法有构造方法没有构造方法
子类继承抽象类,单继承实现接口,多实现
应用多个类有共同特点和行为时向上抽取形成父类,
或者说如果子类都会重写的方法可以定义成抽象
接口一般用来定义功能,行为

4.4 一些经验

对于以后写代码,该怎么设计?

  • 很多类有公共的属性,方法的抽取到父类来继承
  • 有些类中的方法虽然被抽取到父类中,但是子类又不合适还需要再重写,那干脆就把类和方法定义成抽象类
  • 将一些功能性的行为定义成接口,让想拥有这些功能的类去实现即可

作业

复习总结:仿照下面思维导图,总结一下面向对象的知识点
https://www.processon.com/view/link/63511007f346fb0728dc0109 访问密码:2313

写pdf5 员工题(封装继承)  pdf6 员工题(多态) pdf7 写前10个(针对static,final,abstract概念理解)

pdf8 t14,t15

OOP综合练习.pdf(学会设计类)

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

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

相关文章

基于大数据的时间序列股价预测分析与可视化 - lstm 计算机竞赛

文章目录 1 前言2 时间序列的由来2.1 四种模型的名称: 3 数据预览4 理论公式4.1 协方差4.2 相关系数4.3 scikit-learn计算相关性 5 金融数据的时序分析5.1 数据概况5.2 序列变化情况计算 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 &…

Redis不止能存储字符串,还有List、Set、Hash、Zset,用对了能给你带来哪些优势?

文章目录 🌟 Redis五大数据类型的应用场景🍊 一、String🍊 二、Hash🍊 三、List🍊 四、Set🍊 五、Zset 📕我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO…

1300*B. Road Construction(构造菊花图)

Problem - 330B - Codeforces 解析&#xff1a; 1到任一点距离不超过二&#xff0c;并且有部分点不可以连边&#xff0c;直接统计所有不能连边的点&#xff0c;从之外的点中选一个点当作中心&#xff0c;构造菊花图即可。 #include<bits/stdc.h> using namespace std; i…

CSS常见选择器总结

1.简单选择器 简单选择器是开发中使用最多的选择器&#xff0c;包含&#xff1a; 元素选择器&#xff0c;使用元素的名称 类选择器&#xff0c;使用.类名 id选择器&#xff0c;使用#id id注意事项&#xff1a; 一个HTML文档里面的id值 是唯一的&#xff0c;不能重复 id值如…

阿里云服务器x86计算架构ECS实例规格汇总

阿里云企业级服务器基于X86架构的实例规格&#xff0c;每一个vCPU都对应一个处理器核心的超线程&#xff0c;基于ARM架构的实例规格&#xff0c;每一个vCPU都对应一个处理器的物理核心&#xff0c;具有性能稳定且资源独享的特点。阿里云服务器网aliyunfuwuqi.com分享阿里云企业…

特约|数码转型思考:Web3.0与银行

日前&#xff0c;欧科云链研究院发布重磅报告&#xff0c;引发银行界及金融监管机构广泛关注。通过拆解全球70余家银行的加密布局&#xff0c;报告认为&#xff0c;随着全球采用率的提升与相关技术的成熟&#xff0c;加密资产已成为银行业不容忽视也不能错过的创新领域。 作为…

尚硅谷kafka3.0.0

目录 &#x1f483;概述 ⛹定义 ​编辑⛹消息队列 &#x1f938;‍♂️消息队列应用场景 ​编辑&#x1f938;‍♂️两种模式&#xff1a;点对点、发布订阅 ​编辑⛹基本概念 &#x1f483;Kafka安装 ⛹ zookeeper安装 ⛹集群规划 ​编辑⛹流程 ⛹原神启动 &#x1f938;‍♂️…

gRPC之gateway集成swagger

1、gateway集成swagger 1、为了简化实战过程&#xff0c;gRPC-Gateway暴露的服务并未使用https&#xff0c;而是http&#xff0c;但是swagger-ui提供的调用服 务却是https的&#xff0c;因此要在proto文件中指定swagger以http调用服务&#xff0c;指定的时候会用到文件 prot…

WebService SOAP1.1 SOAP1.12 HTTP PSOT方式调用

Visual Studio 2022 新建WebService项目 创建之后启动运行 设置默认文档即可 经过上面的创建WebService已经创建完成&#xff0c;添加HelloWorld3方法&#xff0c; [WebMethod] public string HelloWorld3(int a, string b) { //var s a b; return $"Hello World ab{a …

Markdown语法详解

文章目录 [toc] 一、简介二、样式1. 标题2. 字体3. 引用4. 分割线5. 图片6. 超链接7. 列表8. 表格9. 代码 一、简介 以前写学习文档常用的软件都是Word或者CSDN自带的编辑器&#xff0c;但Word用起来不太灵活&#xff0c;而CSDN自带编辑器又感觉逼格不够&#xff08;主要原因&…

(自我剖析一下我博客“问答”中的第三个问题)准确率一直居低不上是什么原因引起的?

我提的问题是&#xff1a; “我使用单层GRU训练minist数据集时&#xff0c;准确率一直处于下图的状态是为什么&#xff1f; 什么原因引起的&#xff1f;” 这种debug就比较难受&#xff0c;因为程序是能跑的&#xff0c;任何“error”都没有出。这就表明在程序中有某些小细节没…

【SwiftUI模块】0060、SwiftUI基于Firebase搭建一个类似InstagramApp 3/7部分-搭建TabBar

SwiftUI模块系列 - 已更新60篇 SwiftUI项目 - 已更新5个项目 往期Demo源码下载 技术:SwiftUI、SwiftUI4.0、Instagram、Firebase 运行环境: SwiftUI4.0 Xcode14 MacOS12.6 iPhone Simulator iPhone 14 Pro Max SwiftUI基于Firebase搭建一个类似InstagramApp 3/7部分-搭建Tab…

数据集的特征提取

1、 特征提取 1.1、 将任意数据&#xff08;如文本或图像&#xff09;转换为可用于机器学习的数字特征 注&#xff1a;特征值化是为了计算机更好的去理解数据 字典特征提取(特征离散化)文本特征提取图像特征提取&#xff08;深度学习将介绍&#xff09; 2 特征提取API sklear…

Python OpenCV通过灰度平均值进行二值化处理以减少像素误差

Python OpenCV通过灰度平均值进行二值化处理以减少像素误差 前言前提条件相关介绍实验环境通过灰度平均值进行二值化处理以减少像素误差固定阈值二值化代码实现 灰度平均值二值化代码实现 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容…

数据安全与PostgreSQL:最佳保护策略

在当今数字化时代&#xff0c;数据安全成为了企业不可或缺的一环。特别是对于使用数据库管理系统&#xff08;DBMS&#xff09;的组织来说&#xff0c;确保数据的完整性、保密性和可用性至关重要。在众多DBMS中&#xff0c;PostgreSQL作为一个强大而灵活的开源数据库系统&#…

酒类商城小程序怎么做

随着互联网的快速发展&#xff0c;线上购物越来越普及。酒类商品也慢慢转向线上销售&#xff0c;如何搭建一个属于自己的酒类小程序商城呢&#xff1f;下面就让我们一起来看看吧&#xff01; 一、登录乔拓云平台 首先&#xff0c;我们需要进入乔拓云平台的后台&#xff0c;点击…

Pytorch公共数据集、tensorboard、DataLoader使用

本文将主要介绍torchvision.datasets的使用&#xff0c;并以CIFAR-10为例进行介绍&#xff0c;对可视化工具tensorboard进行介绍&#xff0c;包括安装&#xff0c;使用&#xff0c;可视化过程等&#xff0c;最后介绍DataLoader的使用。希望对你有帮助 Pytorch公共数据集 torc…

【第三天】C++类和对象进阶指南:从堆区空间操作到友元的深度掌握

一、new和delete 堆区空间操作 1、new和delete操作基本类型的空间 new与C语言中malloc、delete和C语言中free 作用基本相同 区别&#xff1a; new 不用强制类型转换 new在申请空间的时候可以 初始化空间内容 2、 new申请基本类型的数组 3、new和delete操作类的空间 4、new申请…

【SwiftUI模块】0060、SwiftUI基于Firebase搭建一个类似InstagramApp 2/7部分-搭建TabBar

SwiftUI模块系列 - 已更新60篇 SwiftUI项目 - 已更新5个项目 往期Demo源码下载 技术:SwiftUI、SwiftUI4.0、Instagram、Firebase 运行环境: SwiftUI4.0 Xcode14 MacOS12.6 iPhone Simulator iPhone 14 Pro Max SwiftUI基于Firebase搭建一个类似InstagramApp 2/7部分-搭建Tab…

构建离线应用:Apollo与本地状态管理

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…