面向对象——多态、抽象类、接口

news2024/12/27 11:41:40

学习资料来自:黑马程序员,内容仅为学习记录,侵删

多态

多态:事务存在的多种形态
多态的前提:1、有继承关系;2、重写父类方法;3、父类引用指向子类对象

面向对象

面向对象多态中成员访问特点

1.成员方法(动态绑定):编译看左边(父类),运行看右边(子类)
2.成员变量:编译看左边(父类),运行看左边(父类)
3. 静态方法:编译看左边(父类),运行看左边(父类)
练习代码

public class Demo07_Polymorphic {
    public static void main(String[]agrs){//多态:事务的多种形态   多态的前提:1、有继承关系;2、重写父类方法;3、父类指向子类
        xiaomi mi = new xiaomi();
        mi.call();
        mi.method();

        //面向对象多态中成员访问特点——成员方法(动态绑定):编译看左边(父类),运行看右边(子类)
        phone p = new xiaomi();         //父类指向子类;输入“小米手机打电话”,在编译时看父类有没有方法,运行时看的是子类方法
        p.call();
        //在这里,p是父类phone类型的变量但实际上指向的是子类xiaomi,method()是一个静态方法,编译器会根据p的声明类型phone来调用phone类中的方法
        p.method();      //面向对象多态中成员访问特点——静态方法:编译看左边(父类),运行看左边(父类)

        //面向对象多态中成员访问特点——成员变量:编译看左边(父类),运行看左边(父类)
        System.out.println(p.num);//输出10
        System.out.println(mi.num);//输出20
    }
}
class phone{
    int num = 10;
    public void call(){
        System.out.println("手机打电话");
    }
    public static void method(){
        System.out.println("我是父类中的方法");
    }
}
class xiaomi extends phone{      //子类xiaomi继承父类phone
    int num = 20;                //在访问这个成员变量前会有一个super指向父类成员变量
    public void call(){         //重写父类方法call
        System.out.println("小米手机打电话");
    }
    public static void method(){
        System.out.println("我是子类中的方法");
    }
}

运行结果
在这里插入图片描述

多态中向上转型和向下转型

**向上转型:**父类引用指向子类对象称为向上转型。向上转型后的父类引用只能调用父类的属性,若子类重写了父类的方法,则通过父类引用调用的是子类重写后的方法(即 override),该调用过程即为“动态绑定”。
**向下转型:**已经向上转型的子类对象指向父类引用称为向下转型,但并不是所有的对象都可以向下转型,只有当这个对象原本就是子类对象通过向上转型得到的时候才能够成功转型,在向下转型前,通过instanceof 判断某对象是否是某类的实例。

多态的好处:1、提高代码的维护性(继承保证)2、提高了代码的扩展性(有多态保证)3、可以当作形式参数接收任意子类对象
多态的弊端是不能使用子类的特有属性和行为

public class Demo07_SuperMan {
    public static void main(String[]agrs){
        /*
        * 多态的好处:1、提高代码的维护性(继承保证)2、提高了代码的扩展性(有多态保证
        * */
        person p = new Superman();//父类指向子类,向上转型
        System.out.println(p.name);//面向对象多态中成员访问特点——成员变量:编译看左边(父类),运行看左边(父类)
        p.谈生意();//面向对象多态中成员访问特点——成员变量:编译看左边(父类),运行看右边(子类)
        //p.fly();多态中父类无法使用子类特有属性和行为,无法在父类person中找到方法无法编译
        Superman s = (Superman) p;//向下转型
        s.fly();
    }
}
class person{
    String name  = "John";
    public void 谈生意(){
        System.out.println("谈生意");
    }
}
class Superman extends person{
    String name  = "Superman";
    public void 谈生意(){
        System.out.println("谈一个大生意");
    }
    public void fly(){
        System.out.println("飞出去救人");
    }
}

编译结果
在这里插入图片描述
练习代码

public class Demo07_Animals {
    public static void main(String[] agrs) {
        method(new sheep());
        method(new bossy());
    }

    /*
     * 多态的好处:1、提高了代码的维护性;2、提高了代码的扩展性;3、可以当作形式参数接收任意子类对象
     */
    public static void method(animals a) { //当作形式参数接收任意子类对象
        if (a instanceof sheep) { // instanceof判断前后的数据类型是的一致
            sheep s = (sheep) a;//向下转型
            s.eat();
            s.action();
        } else if (a instanceof bossy) {
            bossy b = (bossy) a;
            b.eat();
            b.action();
        } else {
            a.eat();
        }
        }
}

class animals {
    public void eat() {
        System.out.println("动物吃东西");
    }
}

class sheep extends animals {
    public void eat() {
        System.out.println("绵羊吃草");
    }

    public void action() {
        System.out.println("绵羊咩咩叫");
    }
}

class bossy extends animals {
    public void eat() {
        System.out.println("牛吃树叶");
    }

    public void action() {
        System.out.println("牛哞哞叫");
    }
}

运行结果
在这里插入图片描述

在这里插入图片描述

抽象类

抽象类概述:抽象类就是看不懂的
抽象类特点:

  1. 抽象类和抽象方法必须用abstract关键字修饰,如abstract class 类名、public abstract void 方法名()
  2. 抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或接口
  3. 抽象类实例化:按照多态的方式由具体的子类实例化,抽象类多态
  4. 抽象类的子类:1、要么是抽象类;2、要么重写抽象类中的所有抽象方法

抽象类的成员特点

  • 既可以是变量,也可以是常量,abstract不能修饰变量
  • 有构造方法,用于子类访问父类数据的初始化
  • 成员方法既可以是抽象的,也可以是非抽象的

练习代码

public class Demo07_Abstract {
    /*
    *抽象概述:抽象就是看不懂的
    *抽象类和抽象方法必须用abstract关键字修饰,如abstract class 类名、public abstract void 方法名()
    *抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或接口
    *抽象类实例化:按照多态的方式由具体的子类实例化,抽象类多态
    *抽象类的子类:1、要么是抽象类;2、要么重写抽象类中的所有抽象方法  */

    //一个类如果没有抽象方法,可以定义抽象类,这样可以不让其他类创建本类对象,交给子类完成

    public static void main(String[] agrs) {
        //Car c = new Brand();因为子类是抽象类不能实例化,如果想要注释代码编译可以去掉子类的抽象类abstract修饰
        //c.color();
    }
}

abstract class Car { //抽象类
    public abstract void color(); //抽象方法

   /* public static abstract void print();
    public final abstract void print();
    private abstract void print();*/
}
    abstract class Brand extends Car{
public void color(){
        System.out.println("子类的这辆车是红色的");
        }
}

抽象类中的成员方法特性:

  1. 抽象方法强制要求子类做的事(统一规则);
  2. 非抽象方法,子类继承提高代码的复用性

练习代码2

public class Demo07_AbstractTest {
}
/*
* 抽象类中的成员方法特性:
* 1、抽象方法强制要求子类做的事(统一规则);
* 2、非抽象方法,子类继承提高代码的复用性*/
abstract class AbstractTestFather {
    //抽象类的成员变量可以是变量也可以是常量,不可以修饰成员变量(因为抽象代表看不懂的,无法作为修饰)
    int num = 10;
    final int num1 = 20;

    public AbstractTestFather() {}//构造方法:用于子类访问父类数据的初始化

    public abstract void play();//成员方法:可以是抽象的
}
abstract class AbstractTestSon extends AbstractTestFather {
    public void play() {//成员方法:可以是非抽象的,子类需要重写父类中抽象类的方法
        System.out.println("play game");
    }
}

一个抽象类没有抽象方法,可以定义抽象类,这样做的目的是不让其他类创建本类对象,交给子类完成

abstract不能和哪些关键字共存

  • abstract 和private
    被abstract修饰的是为了让子类看到并强制重写
    被private修饰是不让子类访问
  • abstract 和final
    被abstract修饰的是为了让子类看到并强制重写
    被final修饰的不让重写
  • abstract 和static
    被abstract修饰的方法没有方法体
    被static修饰的可以用类名.调用,但是被abstract修饰的方法没有方法体
    在这里插入图片描述

接口

接口概述:
从狭义角度讲接口就是Java中的interface
从广义角度讲对外提供规则的就是接口

接口特点:

  • 接口用关键字interface表示,接口不能实例化,按照多态中父类引用指向子类对象实例化
  • 类实现接口用implements表示
  • 接口的子类可以是抽象类(意义不大),也可以是具体类,具体类需要重写接口中所有的抽象方法

接口的成员特点

  • 成员变量只能是公共的静态的常量,默认修饰符public static final
  • 接口没有构造方法
  • 成员方法只能是抽象的,默认修饰符 public abstract

练习代码

public class Demo07_interFance {
    public static void main(String[]agrs){
        Str s = new stccla();//父类引用指向子类对象
        s.print();
        System.out.println(Str.num);
    }
}
//接口用关键字表示,接口不能实例化,按照多态中父类引用指向子类对象
interface Str {
    //接口中的成员变量都是公共的静态的常量,默认修饰符public static final
    public static final int num = 20;

    //publicmethod(){}  接口中没有构造方法

    //接口中成员方法只能是抽象方法,默认修饰符public abstract
    public abstract void print();
}

//类实现接口用implements表示
class stccla implements Str{//一个类不继承任何类会默认继承object类
    //接口的子类可以是抽象类(意义不大).可以是具体类,需要重写接口中的抽象方法
    public void print(){
        System.out.println("stccla重写抽象类中抽象方法输出");
    }
}
class stcclb implements Str{//一个类不继承任何类会默认继承object类
    //接口的子类可以是抽象类(意义不大).可以是具体类,需要重写接口中的抽象方法
    public void print(){
        System.out.println("stcclb重写抽象类中抽象方法输出");
    }
}

输出结果
在这里插入图片描述

类与类、接口与接口、类与接口的关系

  • 类与类
    继承关系:类与类之间可以单继承和多层继承
  • 接口与接口
    继承关系:接口与接口之间可以单继承和多继承
  • 类与接口
    实现关系:可以单实现也可以多实现
    且可以在继承一个类的同时实现多个接口

练习代码

public class Demo07_interFanceTest {}
interface inter1{}
interface inter2{}
interface inter3 extends inter1,inter2{}//接口和接口之间的关系:可以单继承也可以多继承

class cla1{}
class cla2 extends cla1{}
class cla3 extends cla2{} //类和类之间的关系:可以单继承和多层继承

class cla4 extends cla3 implements inter1,inter2,inter3{}//类和接口的关系:可以单继承一个类或继承一个类的同时实现单个或多个接口,实现单个或多个接口

总结:成员区别

  • 抽象类
    成员变量:可以是变量也可以是常量
    构造方法:有构造方法,用于子类访问父类数据的初始化
    成员方法:可以是抽象的,也可以是非抽象的

  • 接口
    成员变量:只能是常量(public static final修饰)
    构造方法:没有
    成员方法:只能是抽象的(public abstract修饰)

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

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

相关文章

动态测试数据处理

分类 动态测试数据: 1、确定性数据:能够用明确的数学表达式进行描述的数据称为确定性数据。 Ⅰ、周期数据 Ⅱ、非周期数据 2、随机性数据:无法用明确的数学表达式表述;若在一个…

强大的工具:APISpace IP归属地查询API

引言 IP地址在互联网世界中扮演着重要的角色,对于许多应用程序和服务来说,了解IP地址的归属地信息可以提供有价值的洞察和功能。 在本文中,我们将介绍一种名为IP归属地-IPv4区县级 API 的强大工具,它提供了查询 IP 地址归属地信…

如何解释物联网IOT平台?

物联网开发的本质是将各种物品通过网络连接在一起,并对这些物品进行数字化管理,从而实现智能自动化。在物联网的早期阶段,一些物联网应用程序(例如,智能电表)使用软件将信息传输到后台服务器。但随着时间的…

华为路由器:多区域OSPF协议实验

一、实验拓扑 二、ospf基本概念复习 区域划分:area0为骨干区域,其他area1、area2都为普通区域/常规区域。普通区域必须和骨干区域直接相连。ABR:区域边界路由器。R2、R3位于两个区域的中间,我们称之为区域边界路由器 &#xff1b…

ObjectARX如何监控实体双击事件(利用钩子函数或者反应器)

目录 1 实现方法1——钩子函数1.1 钩子函数的作用1.2 利用钩子函数监控双击事件 2 实现方法2——反应器2.1 反应器的作用2.2 利用编辑器反应器监控双击事件 在ObjectARX开发中,常常要监控鼠标的双击事件,比如,往一个实体中写了扩展数据&#…

基于html+css的图展示115

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

2023年湖北下半年中级职称申报中级职称评审申报条件是什么?

2023年湖北下半年中级职称申报中级职称评审申报条件是什么? 2023年湖北中级职称申报条件:本科毕业5年,专科毕业7年,相关专业 助工满4年这个条件目前不是硬性要求,意思就是有肯定更好,没有也没有太大的影响 …

穿越火线几次体验良好的游戏优化方案

文章目录 介绍救世主模式终结者模式30人生化模式挑战模式英雄级武器源武器英雄级武器皮肤英雄级武器游戏玩偶英雄级武器万化包、光效英雄级武器强化英雄级武器音效卡免费获取挑战强化武器戒指击杀效果个人竞技击杀效果人机训练模式交易所火线币快速加入跳跳乐爆头战HS间谍模式地…

做了一个日内信号可视化系统

量化策略开发,高质量社群,交易思路分享等相关内容 大家好,半年过去了。松鼠Quant计划6月内发布本年度最重要的一个策略:盘口策略。这个策略群友们的呼声很高,也是花了比较多时间去弄。整个策略有多个python脚本: CTP数据生成order…

如何提高浪涌保护器的使用寿命和安全性

浪涌保护是保护设施免受电气事件影响的基本要求。具体来说,浪涌保护器(SPD)旨在限制瞬态电压并转移浪涌电流以保护系统和设备。 SPD浪涌保护器必须考虑的一种现象是临时过电压(TOV)。传统设备处理 TOV 的方式可能会导…

【unity数据持久化】游戏排行榜信息简单的存储,你还知道吗?数据管理类_PlayerPrfs

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

谈一谈冷门的C语言爬虫

C语言可以用来编写爬虫程序,但是相对于其他编程语言,C语言的爬虫开发可能会更加复杂和繁琐。因为C语言本身并没有提供现成的爬虫框架和库,需要自己编写网络请求、HTML解析等功能。 不过,如果你对C语言比较熟悉,也可以…

FPGA认识-LCMXO3LF-9400C-5BG400C 什么是低功耗FPGA

莱迪思深力科超低密度FPGA 是最新的立即启用、非挥发性、小型覆盖区 FPGA,采用先进的封装技术,能让每个元件达到最低成本。此系列采用最新的小型封装,不仅具有低功率、成本优势并结合快速效能。FPGA 现场可编程逻辑器件,小尺寸,高…

SSRS rdlc报表 八 报表项目部署

开发环境 vs2022 sqlserver 2019 windows 11 参考文档:安装 SQL Server Reporting Services - SQL Server Reporting Services (SSRS) | Microsoft Learn 配置 URL (Configuration Manager) - SQL Server Reporting Services (SSRS) | Microsoft Learn 项目右键…

问道价值互联网,区块链的下一个十年 | 2023 开放原子全球开源峰会区块链分论坛即将启幕

随着全球 Web3 浪潮经由数字藏品、元宇宙的日渐普及而实现落地,区块链在“信息互联网”转向“价值互联网”中的重要作用正得到进一步认可。在数字经济蓬勃发展、数据成为重要生产要素的时代,区块链已不仅仅是一项技术、一种工具,更是一种思维…

大型城市综合体建筑智能消防应急照明和疏散系统的具体应用 安科瑞 许敏

摘要:随着我国社会经济的迅猛发展与城市化建设进程的加快,大型城市综合体建筑越来越多,随之而来的消防安全管理问题不容忽视。智能消防应急照明和疏散系统作为保证人员安全疏散不可或缺的消防设施,是保障消防安全的重要组成部分。…

重磅!MyBatis-Plus 可视化代码生成器来啦,开发效率提升2倍 !!

前言 一、mybatis-plus-generator-ui是什么? 二、 mybatis-plus-generator-ui怎么用? 1、maven pom引入2、新建程序入口,以main函数的方式运行3、实例运行 三、mybatis-plus-generator-ui代码生成 1、Table的查询和浏览2、输出配置3、策…

Vue+springboot茶馆管理系统的设计与实现

在网络购物的时代,众多的软件被开发出来,给用户带来了很大的选择余地,而且人们越来越追求更个性的需求。在这种时代背景下,茶馆只能以客户为导向,按茶叶分类,以商品的持续创新作为商家最重要的竞争手段。 系…

JDK8-1-Lambda表达式(2)-方法传递(行为参数化)

JDK8-1-Lambda表达式(2)-方法传递(行为参数化) Java 8 允许程序将方法作为参数传递,先看一个例子: 苹果实体类: public class Apple {//颜色private String color;//重量,单位克&…

【Golang Leetcode】总目录(Day1~100)

Leetcode Golang Day1~10 Golang每日一练(leetDay0001) 1. 两数之和 Two Sum 2. 两数相加 Add Two Numbers 3. 无重复字符的最长子串 Longest-substring-without-repeating-characters Golang每日一练(leetDay0002) 4. 寻找两个正序数组的中位数 Median of two sorted arra…