d10(104-112)-勇敢开始Java,咖啡拯救人生

目录

多态[面向对象的三大特征:封装 继承 多态]polymorphism

多态的好处

多态下的类型转换问题

注意事项

final关键字

注意事项

常量

抽象类abstract

好处

运用场景

接口interface

好处

接口中新增的三种方法:

接口的多继承

内部类[类中五大成分:成员变量、方法、构造器、内部类、代码块]

4、匿名内部类


多态[面向对象的三大特征:封装 继承 多态]polymorphism

多态是在继承/实现情况下的一种现象,表现为:对象多态、行为多态

例如:p1为父类,p2 extends p1,p3 extends p1

        p1 p = new p2();

        p1 pp = new p3();

编译看左边,执行看右边 例如:p.run();        它的左边是p1,右边是p2 -> 行为多态

对于对象,编译、执行都看左边 例如:p.name;        打印的仍是p1对其的赋值,而不是p2

因此,多态的前提:有继承/实现关系;存在父类引用子类对象;存在方法重写

多态的注意事项:多态是对象、行为的多态,Java中的属性(成员变量)不谈多态

多态的好处

在多态形式下,右边对象是解耦合的,更便于扩展的维护 [紧耦合就很难修改]

可以使用父类类型的变量作为形参,可以接收一切子类对象 [某方法可以被多类对象使用,因为可以用父类做形参]

问题:多态下不能使用子类的独有功能。[因为编译看左边,左边父类没有子类独有功能]

多态下的类型转换问题

自动类型转换 父类 变量名 = new 子类();

强制类型转换 子类 变量名 = (子类) 父类变量

注意事项

存在继承/实现关系就可以在编译阶段进行强制类型转换,编译阶段不会报错哦

运行时,如果发现对象的真实类型与强转后的类型不同,就会报类型转换异常ClassCastException的错误出来

因此,使用instanceof关键字,判断当前对象的真实类型,再强转

例如:p1为父类,p2 extends p1

        p1 p = new p2();

        if(p instanceof p2){

                p2 ppp = (p2) p; // 强转

        }

final关键字

修饰类:该类则为最终类,不能被继承了

修饰方法:最终方法,不能被重写了

修饰变量:该变量只能被赋值一次[变量:1、局部变量 2、成员变量 2.1、静态成员变量 2.2、实例成员变量]

public static final 常量

注意事项

final修饰基本类型变量,变量存储的数据不能改变

final修饰引用类型变量,变脸存储的地址不能改变,但地址所指向对象的内容可以改变

常量

用于记录系统的配置信息

static final 常量; 常量名用大写英文字母,下划线连接单词

好处:代码可读性更好,可维护性更好;程序编译后,常量会被“宏替换”,出现常量的地方会被替换为其记住的字面量,这样可以保证使用常量和使用字面量的性能是一样的

抽象类abstract

abstract修饰类 -> 抽象类

abstract修饰方法 -> 抽象方法        只有签名,没有方法体

抽象类不一定有抽象方法,有抽象方法的类一定是抽象类

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

抽象类的主要特点:抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现,故父类 变量名 = new 子类();

一个类继承抽象类,要重写抽象类的所有抽象方法,否则这个类也必须被定义为抽象类

好处

父类知道每个子类都要做的某个行为,但每个子类要做的情况不一样,父类就定义成抽象方法,交给子类去重写实现,可以更好的支持多态。[感觉就是父类定义一个模板,子类去挨个填充]

运用场景

解决方法中存在重复代码的问题:

1、定义抽象类

2、在里面定义两个方法:一是模板方法:把相同代码放进去;二是抽象方法,具体实现交给子类

建议用final修饰模板方法[不被子类重写]

接口interface

只能由成员变量和成员方法,其他什么都不能有

public interface 接口名{
    // 成员变量(常量)
    // 成员方法(抽象方法)
}

类和接口是同级的,因此要在package里新建class中选interface而不是class

直接写String 变量名 = ...;就行,会默认是常量,用大写英文单词,下划线连接哈

抽象方法也直接写签名就行,默认是抽象方法,不能写方法体哦

接口不能创建对象,接口是用来被类实现implement的,实现接口的类被称为实现类

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

一个类可以实现多个接口,实现类实现多个接口,必须重写完全部接口的全部抽象方法,否则实现类需定义成抽象类

好处

弥补了类单继承的不足(extends 只能继承一个),一个类可以实现多个接口;让程序可以面向接口编程,这样可以灵活方便切换各种业务实现

例子:两种方案实现某功能,只需修改选择哪个实现类

StudentOperator[接口]

package cn.ptz.interface_demo;

import java.util.ArrayList;

public interface StudentOperator {
    void printAllInofo(ArrayList<Student>students);
    void printAverageScore(ArrayList<Student>students);
}

StudentOperatormpl1[实现类1]第一个方案

package cn.ptz.interface_demo;

import java.util.ArrayList;

public class StudentOperatormpl1 implements StudentOperator{

    @Override
    public void printAllInofo(ArrayList<Student> students) {
        System.out.println("————全部全部学生信息");
        for (int i = 0; i < students.size(); i++) {
            Student s = students.get(i);
            System.out.println("姓名:"+s.getName()+",性别:"+s.getSex()+",分数:"+s.getScore());
        }
        System.out.println("————————————————————");
    }

    @Override
    public void printAverageScore(ArrayList<Student> students) {
        double allScore = 0.0;
        for (int i = 0; i < students.size(); i++) {
            Student s = students.get(i);
            allScore += s.getScore();
        }
        System.out.println("平均分:"+ (allScore) / students.size());
    }
}

StudentOperatormpl2[实现类2]第二个方案

package cn.ptz.interface_demo;

import java.util.ArrayList;

public class StudentOperatormpl2 implements StudentOperator {

    @Override
    public void printAllInofo(ArrayList<Student> students) {
        System.out.println("————全部全部学生信息");
        int count1 = 0;
        int count2 = 0;
        for (int i = 0; i < students.size(); i++) {
            Student s = students.get(i);
            System.out.println("姓名:"+s.getName()+",性别:"+s.getSex()+",分数:"+s.getScore());
            if (s.getSex() == '男'){
                count1++;
            }else {
                count2++;
            }
        }
        System.out.println("男生人数:" + count1 + ",女生人数:" + count2);
        System.out.println("————————————————————");

    }

    @Override
    public void printAverageScore(ArrayList<Student> students) {
        double allScore = 0.0;
        double max = students.get(0).getScore();
        double min = students.get(0).getScore();
        for (int i = 0; i < students.size(); i++) {
            Student s = students.get(i);
            if (s.getScore() > max){
                max = s.getScore();
            }
            if (s.getScore() < min){
                min = s.getScore();
            }
            allScore += s.getScore();
        }
        System.out.println("最高分:" + max + ",最低分:" + min);
        System.out.println("平均分:"+ (allScore-max-min) / (students.size()-2));
    }
}

ClassManager

package cn.ptz.interface_demo;

import java.util.ArrayList;

public class ClassManager {
    private ArrayList<Student> students = new ArrayList<>();
    private StudentOperator studentOperator = new StudentOperatormpl1(); //private StudentOperator studentOperator = new StudentOperatormpl2();

    public ClassManager(){
        students.add(new Student("小a",'女',80));
        students.add(new Student("小b",'男',75));
        students.add(new Student("小c",'女',95));
        students.add(new Student("小d",'男',88));

    }
    // 打印全班学生信息
    public void printInfo(){
        studentOperator.printAllInofo(students);
    }

    public void printScore(){
        studentOperator.printAverageScore(students);
    }
}

接口中新增的三种方法:

1.默认方法,必须用default修饰,默认被public修饰

   实例方法:对象的方法,必须使用实现类的对象来访问

2.私有方法:必须使用private修饰

   实例方法:对象的方法,只能在接口内部被调用

3.类方法(静态方法):必须用static修饰,默认被public修饰

   只能用接口名来调用

   增强了接口能力,更便于项目扩展和维护

接口的多继承

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

注意事项:

1.一个接口可以同时继承多个接口,如果多个接口中存在方法签名冲突,则此时不支持多继承

2.一个类实现多个接口,如果多个接口中存在方法签名冲突,则此时不支持多实现

3.一个类继承了父类,又同时实现了接口,父类中和接口中有同名的默认方法,实现类会优先用父类的

4.一个类实现了多个接口,多个接口中存在同名的默认方法(default),可以不冲突,这个类重写该方法即可

内部类[类中五大成分:成员变量、方法、构造器、内部类、代码块]

如果一个类定义在另一个类的内部,这个类就是内部类

1、成员内部类

类中的普通成员,类似普通的成员变量、成员方法

外部类名.内部类名 对象名 = new 外部类(...).new 内部类(...);

2、静态内部类

有static修饰

外部类名.内部类名 对象名 = new 外部类.内部类();

可以直接访问外部类的静态成员,不能直接访问外部类的实例成员

3、局部内部类

定义在方法中、代码块中、构造器等执行体中

4、匿名内部类

特殊的局部内部类

匿名:不需要为这个类声明名字

其实是new 类名()

这个类名的子类

所以是创建了一个子类对象

更方便地创建一个子类对象

通常作为一个参数传输给方法

简化代码

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

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

相关文章

江苏开放大学2024年春《机电设备安装与调试 050095》第三次形成性考核作业参考答案

电大搜题 多的用不完的题库&#xff0c;支持文字、图片搜题&#xff0c;包含国家开放大学、广东开放大学、超星等等多个平台题库&#xff0c;考试作业必备神器。 公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#…

boot2docker实践@FreeBSD

boot2docker是专为Docker而设计的轻量极Linux发型包&#xff0c;解决Windows、OS X、FreeBSD不能安装Docker的问题。Boot2Docker完全运行于内存中&#xff0c;24M大小&#xff0c;启动仅5-6秒。Boot2Docker需要运行在VirtualBox中&#xff0c;同时意味着有VirtualBox就能运行Bo…

万业企业发布23年年报、24年一季报,集成电路业务同比大增近七成 转型成效显著

4月26日晚间&#xff0c;万业企业&#xff08;600641&#xff09;发布2023年年度报告及2024年一季度报告。2023年&#xff0c;公司实现营业收入9.65亿元&#xff0c;归母净利润1.51亿元。其中&#xff0c;公司集成电路设备制造业务收入较上年同期大幅增长67.53%&#xff0c;公司…

CYCLE:学习自我完善代码生成

目录 IntriductionOverview of the Approach 预训练的代码语言模型在代码生成方面取得了可喜的性能&#xff0c;并提高了人类开发人员的编程效率。然而&#xff0c;现有的代码 LM 评估通常忽略了它们的 自我求精能力&#xff0c;这些评估仅关注一次性预测的准确性。对于代码 L…

Leetcode - 周赛394

目录 一&#xff0c;3120. 统计特殊字母的数量 I 二&#xff0c;3121. 统计特殊字母的数量 II 三&#xff0c;3122. 使矩阵满足条件的最少操作次数 四&#xff0c;3123. 最短路径中的边 一&#xff0c;3120. 统计特殊字母的数量 I 本题就是统计有多少个字母的大小写同时出现…

AIGC学习步骤

目录 AIGC学习步骤 步骤一&#xff1a;理解基本概念 步骤二&#xff1a;学习资源 步骤三&#xff1a;深入研究 步骤四&#xff1a;联系专家 步骤五&#xff1a;实践应用 步骤六&#xff1a;持续学习 AIGC学习步骤 我们先来说说什么是AIGC&#xff1f; 生成式人工智能—…

第二篇:Python环境搭建:从初学者到专家

Python环境搭建&#xff1a;从初学者到专家 在编程的世界里&#xff0c;准备好一个高效而舒适的开发环境是走向成功的第一步。在这篇博客文章中&#xff0c;我们将一起探索如何为Python编程搭建一个理想的环境。无论你是完全的新手还是希望提升现有的技能&#xff0c;本文都会…

IDEA快速入门

目录 1. 概述 2. 安装 3. 激活 4. 关闭自动更新 5. 创建Java项目 5.1 配置JRE 5.2 创建项目 6. 配置设置 6.1 主题 6.2 设置字体默认大小 6.3 鼠标滚轮改变字体大小 6.4 设置自动导入 6.5 项目选择 7. lombok插件 7.1 安装插件 7.2 启用注解 8. 安装包及插件…

SecuPress Pro 专业级WordPress网站安全防护插件优化版

下载地址&#xff1a;SecuPress Pro 专业版.zip SecuPress Pro&#xff1a;专业的WordPress安全解决方案 如果您没有时间进行每周扫描&#xff0c;SecuPress Pro将是您的理想选择。SecuPress Pro提供了所有SecuPress Free的功能&#xff0c;同时还增加了一些高级选项&#xff…

优维全新力作:统一采控平台

在本月&#xff0c;优维新一代核心系统「EasyOps」7.0大版本重磅上线&#xff0c;为广大用户带来了“更核心、更智能、更开放、更客制”的产品能力。&#xff08;点击回看&#xff1a;重磅&#xff01;优维科技发布EasyOps7.0大版本&#xff09;在本次版本能力分享上&#xff0…

VBA技术资料MF145:清空回收站

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

各种CSS导航代码集合!CV即可!水平导航,垂直导航,jd粘性导航…

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

mysql的多表查询和子查询

多表查询&#xff1a;查询数据时&#xff0c;需要使用多张表来查询 多表查询分类&#xff1a; 1.内连接查询 2.外连接查询 3.子查询 笛卡尔积&#xff1a; create table class (id int primary key auto_increment,name varchar(10) ); create table student (id int primar…

【TCP:可靠数据传输,快速重传,流量控制,TCP流量控制】

文章目录 可靠数据传输TCP&#xff1a;可靠数据传输TCP发送方事件快速重传流量控制TCP流量控制 可靠数据传输 TCP&#xff1a;可靠数据传输 TCP在IP不可靠服务的基础上建立了rdt 管道化的报文段 GBN or SR 累计确认&#xff08;像GBN&#xff09;单个重传定时器&#xff08;像…

搞懂特殊的引用类型接口、枚举、注解、记录、包装类!

面向对象系列——特殊的引用类型&#xff08;与class并列地位&#xff09; 文章目录 面向对象系列——特殊的引用类型&#xff08;与class并列地位&#xff09;特殊的&#xff1a;接口、枚举、注解、记录&#xff0c;包装类一、interface接口(不是类)—提供一种规范(具有多态性…

ionic 中对Input输入框、searchbar进行solr检索

一、概述 Ionic 是一个用于开发跨平台应用程序的开源工具&#xff0c;可以使用 Angular、React 或 Vue 等前端框架。要在 Ionic 应用程序中实现实时与 Solr 通信&#xff0c;可以使用 HTTP 客户端&#xff08;如 Angular 的 HttpClient 或 Ionic 的 Native HTTP&#xff09;…

MySQL—MySQL的存储引擎之InnoDB

MySQL—MySQL的存储引擎之InnoDB 存储引擎及种类 存储引擎说明MyISAM高速引擎&#xff0c;拥有较高的插入&#xff0c;查询速度&#xff0c;但不支持事务InnoDB5.5版本后MySQL的默认数据库存储引擎&#xff0c;支持事务和行级锁&#xff0c;比MyISAM处理速度稍慢ISAMMyISAM的…

一分钟教你下载小程序视频到手机#下载高手

本文就教你们如何下载小程序的视频到手机 首先将小程序视频下载到电脑上&#xff0c;然后再传送到手机上,这样就实现了下载小程序到手机上 可是怎么将小程序下载到电脑上呢&#xff1f;这里要借用一个工具&#xff1a;下载高手 下载高手工具我已经打包好了&#xff0c;有需要…

【算法题解】

文章目录 day4_26最长回文子串思路&#xff1a;代码&#xff1a; **DP30** **买卖股票的最好时机(一)**思路&#xff1a;贪心代码&#xff1a; 过河卒思路&#xff1a;动态规划---路径类代码&#xff1a; day4_26 https://www.nowcoder.com/questionTerminal/12e081cd10ee4794…

生命周期评估(LCA)Simapro软件应用与碳足迹分析

各企事业单位&#xff1a; SimaPro以系统和透明的方式轻松建模和分析复杂的生命周期&#xff0c;通过确定供应链中每个环节的热点&#xff0c;从原材料的提取到制造&#xff0c;分销&#xff0c;使用和处置&#xff0c;衡量所有生命周期阶段的产品和服务对环境的影响。SimaPro是…
最新文章