【java】【面对对象高级3】多态 + final + 抽象类 + 接口

news2024/12/26 11:45:54

目录

1、多态

1.1 认识多态

 1.1.1 对象多态

 1.1.2 行为多态

 1.1.3 成员变量不谈多态

1.2 使用多态的好处

1.3 多态下的类型转换问题

2、final 

2.1 认识final

2.1.1 修饰类

2.1.2 修饰方法

2.1.3 修饰变量

 2.2 补充知识:常量详解

3、抽象类abstract

3.1 认识抽象类

3.2 使用抽象类的好处

3.3 抽象类的常见应用场景:模版方法设计模式

3.3.1 模版方法设计解决了什么问题

 3.3.2 模版方法设计模式的写法

 3.3.2.1 People父类

3.3.2.2 Student子类

3.3.2.3 Teacher子类 

 3.3.2.4 main

 3.3.2.5 多学一招使用final修饰模版方法

4、接口

4.1 接口概述

4.1.1 IDEA创建接口

4.1.2 认识接口

 4.1.3 接口的好处

 4.1.3.1 一个类同时可以实现多个接口

 4.1.3.2 让程序面向接口编程,灵活切换多个业务(下图存在A/B司机)

4.2 接口的综合案例

4.2.1 创建实体类Student2

 4.2.2 创建接口StudentOperator

4.2.3 定义第一套实现类StudentOperatorImpl1

4.2.4 定义第二套实现类StudentOperatorImpl2

 4.2.5 创建数据处理类ClassManager

4.2.6 主函数

4.3 接口的其他细节:

4.3.1 jdk8接口新增三种方法

4.3.1.1 默认方法:必须使用default修饰,默认会被public修饰

4.3.1.2 私有方法:必须使用privata修饰(jdk9以上) 

4.3.1.3 静态方法:必须使用static修饰 

4.3.2 接口的多继承

4.3.3 使用接口的注意事项[了解]


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

1、多态

1.1 认识多态

 父类

 学生类

 

 老师类

 1.1.1 对象多态

 

 1.1.2 行为多态

 1.1.3 成员变量不谈多态

1.2 使用多态的好处

  多态下怎么使用子类的独有功能 见 1.3

1.3 多态下的类型转换问题

 

 

2、final 

2.1 认识final

2.1.1 修饰类

一般工具类会加final

2.1.2 修饰方法

2.1.3 修饰变量

 

 2.2 补充知识:常量详解

3、抽象类abstract

3.1 认识抽象类

 

 

3.2 使用抽象类的好处

3.3 抽象类的常见应用场景:模版方法设计模式

3.3.1 模版方法设计解决了什么问题

 3.3.2 模版方法设计模式的写法

 3.3.2.1 People父类

package com.runa.staticdemo;

public abstract class People {
    // 开始设计模版方法设计模式
    //  1 定义有一个模版方法出来
    public final void write(){
        System.out.println("\t\t\t\t\t《我的码农经历》");
        System.out.println("\t\t《我的码农经历》");
        // 2 模版方法不清楚正文内容,子类肯定要写
        System.out.println(writeMain());
        System.out.println("\t\t结尾了");
    }
    // 3 设计一个抽象方法写正文,具体的实现交给子类实现
    public abstract String writeMain();
}

3.3.2.2 Student子类

package com.runa.staticdemo;

public class Student extends People{    
    public String writeMain(){
        return "\t\t正文我是来学习python的";
    }
}

3.3.2.3 Teacher子类 

package com.runa.staticdemo;

public class Teacher extends People{ 
    public String writeMain(){
        return "\t\t正文我是java老师";
    }
}

 3.3.2.4 main

package com.runa.staticdemo;

public class TestTemplate {
    public static void main(String[] args) {
        // 开头相同
        //正文不同
        //结尾相同
        Teacher t = new Teacher();
        t.write();
        System.out.println("===============================================");
        Student s = new Student();
        s.write();
    }
}

改版

package com.runa.staticdemo;

public class TestTemplate {
    public static void main(String[] args) {
        // 开头相同
        //正文不同
        //结尾相同
        People t = new Teacher();
        t.write();
        System.out.println("===============================================");
        People s = new Student();
        s.write();
    }
}

 3.3.2.5 多学一招使用final修饰模版方法

4、接口

4.1 接口概述

4.1.1 IDEA创建接口

4.1.2 认识接口

传统的接口里面只能有成员变量和成员方法,接口中定义的变量是常量;接口中定义的方法是抽象方法;并且接口也不能创建对象

  

package com.runa.staticdemo;

public interface D {
    // 多此一举 public  static
    public  static  String SCHOOLNAME = "S";
    String NAME = "S";
    
    // 成员方法(抽象方法) public  static  多此一举 ,成员方法不能构造器和方法体
    void test();

}

 

 接口D

package com.runa.staticdemo;

public interface D {

    // 成员方法 public  static  多此一举 ,成员方法不能构造器和方法体
    void testd1();
    void testd2();

}

 接口C

package com.runa.staticdemo;

public interface C {
    void testc1();
    void testc2();
}

 实现类E

package com.runa.staticdemo;
//实现类
public class E implements C, D{


    @Override
    public void testc1() {

    }

    @Override
    public void testc2() {

    }

    @Override
    public void testd1() {

    }

    @Override
    public void testd2() {

    }
}

 main

package com.runa.staticdemo;

public class TestIm {
    public static void main(String[] args) {
        E e = new E();
        e.testc1();
        e.testc2();
        e.testd1();
        e.testc2();
    }
}

 4.1.3 接口的好处

 4.1.3.1 一个类同时可以实现多个接口

 

 4.1.3.2 让程序面向接口编程,灵活切换多个业务(下图存在A/B司机)

 

4.2 接口的综合案例

4.2.1 创建实体类Student2

package com.runa.staticdemo;

public class Student2 {
    private String name;
    private char sex;
    private double score;

    public Student2() {
    }

    public Student2(String name, char 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 char getSex() {
        return sex;
    }

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

    public double getScore() {
        return score;
    }

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

 4.2.2 创建接口StudentOperator

定义2个抽象方法,接收全部学生信息

package com.runa.staticdemo;

import java.util.ArrayList;

public interface StudentOperator {
    void printAllInfo(ArrayList<Student2> students);
    void printAverageScore(ArrayList<Student2> students);
}

4.2.3 定义第一套实现类StudentOperatorImpl1

package com.runa.staticdemo;

import java.util.ArrayList;

public class StudentOperatorImpl1 implements StudentOperator{
    @Override
    public void printAllInfo(ArrayList<Student2> students) {
        System.out.println("==============全班全部学生信息如下:===================");
        for (int i = 0; i < students.size(); i++) {
            Student2 s = students.get(i);
            System.out.println("姓名:" + s.getName() + "性别:" + s.getSex()+ "成绩:" + s.getScore());

        }
        System.out.println("=======================================");

    }

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

4.2.4 定义第二套实现类StudentOperatorImpl2

package com.runa.staticdemo;

import java.util.ArrayList;

public class StudentOperatorImpl2 implements StudentOperator{
    @Override
    public void printAllInfo(ArrayList<Student2> students) {
        System.out.println("==============全班全部学生信息如下:===================");
        int count1 = 0;
        int count2 = 0;
        for (int i = 0; i < students.size(); i++) {
            Student2 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("总人数:" + students.size() );

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

    }

    @Override
    public void printAverageScore(ArrayList<Student2> 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++) {
            Student2 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));
    }
}

 4.2.5 创建数据处理类ClassManager

这里我使用了2个构造方法,无参合有参,有参的调用在主函数注释了

package com.runa.staticdemo;

import java.util.ArrayList;

public class ClassManager {
    private ArrayList<Student2> students = new ArrayList<>();
    private StudentOperator studentOperator = new StudentOperatorImpl2();// 这里切换方案
    public ClassManager() {
        students.add(new Student2("迪丽热巴",'女',99));
        students.add(new Student2("古力娜扎",'女',100));
        students.add(new Student2("马尔扎哈",'男',90));
        students.add(new Student2("卡尔",'男',60));
    }

    public ClassManager(ArrayList<Student2> students) {
        this.students = students;
    }

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

    // 打印全班全部学生平均分
    public void printScore(){
        studentOperator.printAverageScore(students);
    }
}

4.2.6 主函数

package com.runa.staticdemo;

import java.util.ArrayList;

public class TestImplMain {
    public static void main(String[] args) {
//        ArrayList<Student2> ss = new ArrayList<>();
//        Student2 s1 = new Student2("迪丽热巴",'女',99);
//        Student2 s2 = new Student2("古力娜扎",'女',100);
//        Student2 s3 = new Student2("马尔扎哈",'男',90);
//        Student2 s4 = new Student2("卡尔",'男',60);
//        ss.add(s1);
//        ss.add(s2);
//        ss.add(s3);
//        ss.add(s4);
//        ClassManager c = new ClassManager(ss);
//        c.printInfo();
//        c.printScore();
        ClassManager c = new ClassManager();
        c.printInfo();
        c.printScore();

    }
}

4.3 接口的其他细节:

4.3.1 jdk8接口新增三种方法

4.3.1.1 默认方法:必须使用default修饰,默认会被public修饰

4.3.1.2 私有方法:必须使用privata修饰(jdk9以上) 

 

4.3.1.3 静态方法:必须使用static修饰 

 

4.3.2 接口的多继承

package com.runa.staticdemo;

public class TestInterfaceEx {
    public static void main(String[] args) {

    }
}

interface AA{

}
interface BB{
    void test1();
}
interface CC{
    void test2();

}
interface DD extends CC,BB,AA{

}
class EE implements DD{

    @Override
    public void test1() {
        
    }

    @Override
    public void test2() {

    }
}

4.3.3 使用接口的注意事项[了解]

签名冲突

 继承了父类和接口重名方法

 默认方法同名

 

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

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

相关文章

Linux 下的基本指令

pwd pwd 显示当前你所在的路径 ls ls 查看当前路径目录下的所有文件 ls-l ls-l 显示当前目录下的所有文件&#xff0c;包括文件的详细信息&#xff1a;大小&#xff0c;格式&#xff0c;日期等 mkdir mkdir name 创建一个名为name的文件夹&#xff0c; cd cd name 进…

如何在Mac上玩3A?我来教你最简单的方法

如何在mac上玩3A&#xff1f;我来教你最简单的方法 最近苹果在新的发布会上公布了Mac的新系统&#xff1a;macos sonoma&#xff0c;同时也发布了Game Porting Toolkit这一款游戏转译软件&#xff0c;作为果粉当然很激动&#xff0c;当然该款软件还在测试中&#xff0c;一般用…

【OpenGL学习】之着色器GLSL基础

基本类型: 类型说明void空类型,即不返回任何值bool布尔类型 true,falseint带符号的整数 signed integerfloat带符号的浮点数 floating scalarvec2, vec3, vec4n维浮点数向量 n-component floating point vectorbvec2, bvec3, bvec4n维布尔向量 Boolean vectorivec2, ivec3, iv…

物联网的通信协议

物联网的通信协议 目录 物联网的通信协议一、UART串口通信1.1 串口通信1.2 异步收发1.3 波特率1.4 串口通信协议的数据帧1.5 优缺点1.5.1 优点1.5.2 缺点 二、I^2^C2.1 I^2^C2.2 I^2^C2.3 数据有效性2.4 起始条件S和停止条件P2.5 数据格式2.6 协议数据单元PDU2.7 优缺点2.7.1 优…

mybatis_分页

目的&#xff1a; 减少数据处理量&#xff0c;提高效率 普通sql&#xff1a; 语法&#xff1a;select * from user limit startIndex,pageSize; SELECT * from user limit 3; #[0,n] mybatis_sql: 接口&#xff1a; //分页查询List<User> getUserByLimit(Map<…

【雕爷学编程】Arduino动手做(93)--- 0.96寸OLED液晶屏模块16

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

四、约束-3.外键约束

一、概念 外键用来让两张表的数据之间建立连接&#xff0c;从而保证数据的一致性和完整性。 【例】 准备数据 -- 准备数据 create table dept(id int auto_increment comment ID primary key ,name varchar(50) not null comment 部门名称 ) comment 部门表; insert into de…

STM32CubeMX配置STM32G031多通道ADC + DMA采集(HAL库开发)

时钟配置HSI主频配置64M 勾选打开8个通道的ADC 使能连续转换模式 添加DMA DMA模式选择循环模式 使能DMA连续请求 采样时间配置160.5 转换次数为8 配置好8次转换的顺序 配置好串口&#xff0c;选择异步模式配置好需要的开发环境并获取代码 修改main.c 串口重定向 #include &…

【第一阶段】Kotlin的空检查

空检查 代码&#xff1a; fun main() {var info:stringprintln(info) }在Java中可以直接不给默认值&#xff0c;但是在kotlin中必须给默认值不然就会报错 正确写法应该为&#xff1a; fun main() {var info:String" "println("info$info") }执行结果&…

【基于Spark的电影推荐系统】环境准备

概览 本科毕设做过电影推荐系统&#xff0c;但当时的推荐算法只有一个&#xff0c;现在已经忘记大部分了&#xff0c;当时也没有记录&#xff0c;因此写这个博客重新来记录一下。此外&#xff0c;技术栈由于快秋招原因来不及做过多的部分&#xff0c;因此只实现简单的功能&…

uniapp跨平台项目实战失物招领

失物招领项目虽然是一个小项目&#xff0c;但是内部的功能还是很全的&#xff0c;比如发布消息&#xff0c;包含图片或者是视频&#xff0c;获取数据&#xff0c;包含分页的数据获取&#xff0c;同时该项目也包含了多表关联的业务设计。 学习本项目能获得的经验有&#xff0c;数…

Selenium的学习

介绍下学习selenium的经验。之前有网友要求我给布置作业&#xff0c;那么我整理一下就全部列在这里。每一步给出一个小题目。 selenium是一个比较古老也比较流行的自动化测试库。他的特点是&#xff0c;版本较多&#xff0c;以至于在网上搜到很多教程都是过时的。 一、Seleniu…

lightGBM实例——特征筛选和评分卡模型构建

数据还是采用这个例子里的数据&#xff0c;具体背景也同上。 添模型构建——使用逻辑回归构建模型&#xff0c;lightGBM进行特征筛选 lightGBM模型介绍请看这个链接&#xff1a;集成学习——Boosting算法&#xff1a;Adaboost、GBDT、XGBOOST和lightGBM的简要原理和区别 具体代…

65. 有效数字

题目链接&#xff1a;力扣 解题思路&#xff1a;从前往后挨个进行有效判断&#xff0c;注意其中e或E和小数点只能出现一次&#xff0c;具体算法如下&#xff1a; 初始变量&#xff1a; i 0&#xff1a;遍历指针dotfalse&#xff1a;标记小数点是否已经出现E false&#xff1a…

以智慧监测模式守护燃气安全 ,汉威科技“传感芯”凸显智慧力

城市燃气工程作为城市基建的重要组成部分&#xff0c;与城市居民生活、工业生产紧密相关。提升城市燃气服务质量和安全水平&#xff0c;也一直是政府和民众关注的大事。然而&#xff0c;近年来居民住宅、餐饮等工商业场所燃气事故频发&#xff0c;时刻敲响的警钟也折射出我国在…

浅浅了解下单例模式中的懒汉模式饿汉模式

单例模式 1.什么是设计模式2.什么是单例模式3.常见实现单例模式的两种方式1.饿汉模式(1)特点(2)代码实现(3)线程是否安全 2.懒汉模式(1)特点(2)代码实现(3)线程是否安全(4)如何保证线程安全解决方案:进阶方案 3.对比懒汉模式和饿汉模式1、线程安全2、是否延迟加载3、系统开销4、…

QMainWindow

文章目录 QMainWindow基本元素QMainWindow函数介绍简单的示例效果图 QMainWindow QMainWindow是一个为用户提供主窗口程序 的类&#xff0c;包含一个菜单栏(menu bar)、多个工具栏 (tool bars)、多个锚接部件(dock widgets)、―个 状态栏(status bar )及一个中心部件(central …

【算法提高:动态规划】1.2 最长上升子序列模型(TODO最长公共上升子序列)

文章目录 题目列表1017. 怪盗基德的滑翔翼1014. 登山482. 合唱队形1012. 友好城市&#xff08;⭐排序后 最长上升子序列模型&#xff09;1016. 最大上升子序列和1010. 拦截导弹解法1——最长递减子序列 贪心解法2——最长递减子序列 最长递增子序列&#xff08;⭐贪心结论&am…

K8s集群部署-详细步骤

不够详细&#xff0c;后面有时间再编辑 安装 关闭防火墙 systemctl stop firewalld systemctl disable firewalld 关闭swap, selinux swapoff -a && sed -i / swap / s/^\(.*\)$/#\1/g /etc/fstab setenforce 0 && sed -i s/^SELINUX.*/SELINUXdisabled/ /…

Safari 查看 http 请求

文章目录 1、开启 Safari 开发菜单2、显示 JavaScript 控制台 1、开启 Safari 开发菜单 Safari 设置中&#xff0c;打开开发菜单选项 *** 选择完成后&#xff0c;Safari 的目录栏就会出现一个 开发 功能。 2、显示 JavaScript 控制台 开启页面后&#xff0c;在开发中选中 显…