面向对象三大特征之多态

本文详细探讨了面向对象编程中的多态特性,包括其含义、分类、成员访问特点、好处和弊端,以及转型的相关内容。接着介绍了抽象类的概念,包括其特点、成员特点和实例化方式。最后,讲解了接口的使用,对比了抽象类和接口的区别,并提供了代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.多态

1.含义

同一个对象(事物),在不同时刻体现出来的不同状态

2.前提

有继承或实现关系

有方法的重写,其实没有也是可以的,但是如果没有这个就没有意义

有父类或者父接口引用指向之类对象

3.分类

具体类多态(几乎没有)
            class Fu {}
            class Zi extends Fu {}

            Fu f = new Zi();
抽象类多态(常用)
            abstract class Fu {}
            class Zi extends Fu {}

            Fu f = new Zi();
接口多态(最常用)
            interface Fu {}
            class Zi implements Fu {}

            Fu f = new Zi();

4.成员访问特点

成员变量

编译看左,运行看左

构造方法

创建子类对象的时候,访问父类构造方法,完成父类数据的初始化

成员方法

编译看左,运行看右(由于成员方法存在方法重写)

继承的时候:
子类中有和父类中一样的方法,叫重写。
子类中没有父亲中出现过的方法,方法就被继承过来了。

代码示例
class Fu {
    public int num = 100;

    public void show() {
        System.out.println("show Fu");
    }

    public static void function() {
        System.out.println("function Fu");
    }
}

class Zi extends Fu {
    public int num = 1000;
    public int num2 = 200;

    public void show() {
        System.out.println("show Zi");
    }

    public void method() {
        System.out.println("method zi");
    }

    public static void function() {
        System.out.println("function Zi");
    }
}

class DuoTaiDemo {
    public static void main(String[] args) {
        //要有父类引用指向子类对象。
        //父 f =  new 子();
        Fu f = new Zi();
        System.out.println(f.num);
        //找不到符号
        //System.out.println(f.num2);

        f.show();
        //找不到符号
        //f.method();
        f.function();
    }
}

5.好处

提高代码维护性(由继承保证)

提高代码的扩展性(由多态保证)

6.弊端

父类不能使用子类特有的功能

现象: 子类可以当做父类用,父类不能当做子类用

7.转型

向上转型,从子到父(父类引用指向子类对象)

Fu f = new Zi();

向下转型,从父到子(把父类的引用强制转换为子类的引用)

Zi z = (Zi) f;

ClassCastException:类型转换异常,向下转型中容易出现

代码示例
多态的问题理解:
    class 孔子爹 {
        public int age = 40;

        public void teach() {
            System.out.println("讲解JavaSE");
        }
    }

    class 孔子 extends 孔子爹 {
        public int age = 20;

        public void teach() {
            System.out.println("讲解论语");
        }

        public void playGame() {
            System.out.println("英雄联盟");
        }
    }

    //Java培训特别火,很多人来请孔子爹去讲课,这一天孔子爹被请走了
    //但是还有人来请,就剩孔子在家,价格还挺高。孔子一想,我是不是可以考虑去呢?
    //然后就穿上爹的衣服,带上爹的眼睛,粘上爹的胡子。就开始装爹
    //向上转型
    孔子爹 k爹 = new 孔子();
    //到人家那里去了
    System.out.println(k爹.age); //40
    k爹.teach(); //讲解论语
    //k爹.playGame(); //这是儿子才能做的


    //讲完了,下班回家了
    //脱下爹的装备,换上自己的装备
    //向下转型
    孔子 k = (孔子) k爹; 
    System.out.println(k.age); //20
    k.teach(); //讲解论语
    k.playGame(); //英雄联盟

7.多态继承中的内存图解

这里写图片描述

8.多态中的对象变化内存图解

这里写图片描述

二.抽象类

1.概述

动物不应该定义为具体的东西,而且动物中的吃,睡等也不应该是具体的。 我们把一个不是具体的功能称为抽象的功能,而一个类中如果有抽象的功能,该类必须是抽象类。

2.特点

(1).抽象类和抽象方法必须用abstract修饰
(2).抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
(3).抽象类不能被实例化

因为抽象类不是具体的,抽象类有构造方法,但是不能被实例化,那么构造方法的作用是?

用于子类访问父类时,

(4). 抽象类的子类

是一个抽象类,无须重写抽象方法
是一个具体的类,必须重写所有的抽象方法

3.成员特点

(1).成员变量

既可以是变量,也可以是常量

(2).构造方法

有,用于子类访问父类数据的初始化

(3).成员方法

既可以是抽象方法,强制要求之类做的事情

也可以是非抽象方法,子类继承的事情,提高代码复用性

4.实例化

靠具体的子类来实现,通过多态的方式

Animal a = new Cat();

5.几个小问题)

(1).抽象类有构造方法,不能实例化,那么构造方法有什么用?

用于子类访问父类数据的初始化

(2).一个类如果没有抽象方法,却被定义成了抽象类,有什么用

为了不让创建对象

(3).abstract不能和哪些关键字共存

final 冲突

private 冲突

static 无意义

三.接口

1.概述

猫钻火圈,狗跳高等功能,不是动物本身就具备的,是在后面的培养中训练出来的,这种额外的功能,java提供了接口表示。

2.特点

(1).接口用关键字interface修饰

interface 接口名 { }

(2).类实现接口用implements修饰

类名 implements 接口名 { }

(3).接口不能实例化

那么,接口如何获取实例化呢? 按照多态的方式,来实例化

(4).接口的实现类

可以是抽象类,但意义不大

可以是具体类,要重写接口中所有的抽象方法(推荐)

3.成员特点

(1).成员变量

只能是常量,默认修饰符: public static final (建议自己手动给出)

(2).构造方法

没有构造方法

(3).成员方法

只能是抽象方法,默认修饰符: public abstract (建议自己手动给出)

4.类与类,类与接口,接口与接口

(1).类与类

继承关系,只能单继承,不能多继承,可以多层继承

(2).类与接口

实现关系,可以单实现,可以多实现

还可以在继承一个类的同时,实现多个接口

(3).接口与接口

继承关系,可以单继承,可以多继承

5.抽象类和接口的区别

(1).成员区别
抽象类

成员变量:可以变量,也可以常量

构造方法:有

成员方法:可以抽象,也可以非抽象

接口

成员变量:只可以常量

成员方法:只可以抽象

(2).关系区别
类与类

继承,单继承

类与接口

实现,单实现,多实现

接口与接口

继承,单继承,多继承

(3).设计理念区别
抽象类

被继承体现的是:”is a”的关系。抽象类中定义的是该继承体系的共性功能。

接口

被实现体现的是:”like a”的关系。接口中定义的是该继承体系的扩展功能。

代码示例

/*
    猫狗案例,加入跳高的额外功能

    分析:从具体到抽象
        猫:
            姓名,年龄
            吃饭,睡觉
        狗:
            姓名,年龄
            吃饭,睡觉

        由于有共性功能,所以,我们抽取出一个父类:
        动物:
            姓名,年龄
            吃饭();
            睡觉(){}

        猫:继承自动物
        狗:继承自动物

        跳高的额外功能是一个新的扩展功能,所以我们要定义一个接口
        接口:
            跳高

        部分猫:实现跳高
        部分狗:实现跳高
    实现;
        从抽象到具体

    使用:
        使用具体类
*/
//定义跳高接口
interface Jumpping {
    //跳高功能
    public abstract void jump();
}

//定义抽象类
abstract class Animal {
    //姓名
    private String name;
    //年龄
    private int age;

    public Animal() {}

    public Animal(String name,int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //吃饭();
    public abstract void eat();

    //睡觉(){}
    public void sleep() {
        System.out.println("睡觉觉了");
    }
}

//具体猫类
class Cat extends Animal {
    public Cat(){}

    public Cat(String name,int age) {
        super(name,age);
    }

    public void eat() {
        System.out.println("猫吃鱼");
    }
}

//具体狗类
class Dog extends Animal {
    public Dog(){}

    public Dog(String name,int age) {
        super(name,age);
    }

    public void eat() {
        System.out.println("狗吃肉");
    }
}

//有跳高功能的猫
class JumpCat extends Cat implements Jumpping {
    public JumpCat() {}

    public JumpCat(String name,int age) {
        super(name,age);
    }

    public void jump() {
        System.out.println("跳高猫");
    }
}

//有跳高功能的狗
class JumpDog extends Dog implements Jumpping {
    public JumpDog() {}

    public JumpDog(String name,int age) {
        super(name,age);
    }

    public void jump() {
        System.out.println("跳高狗");
    }
}

class InterfaceTest {
    public static void main(String[] args) {
        //定义跳高猫并测试
        JumpCat jc = new JumpCat();
        jc.setName("哆啦A梦");
        jc.setAge(3);
        System.out.println(jc.getName()+"---"+jc.getAge());
        jc.eat();
        jc.sleep();
        jc.jump();
        System.out.println("-----------------");

        JumpCat jc2 = new JumpCat("加菲猫",2);
        System.out.println(jc2.getName()+"---"+jc2.getAge());
        jc2.eat();
        jc2.sleep();
        jc2.jump();

        //定义跳高狗并进行测试的事情自己完成。
    }
}
电动汽车数据集:2025年3K+记录 真实电动汽车数据:特斯拉、宝马、日产车型,含2025年电池规格和销售数据 关于数据集 电动汽车数据集 这个合成数据集包含许多品牌和年份的电动汽车和插电式车型的记录,捕捉技术规格、性能、定价、制造来源、销售和安全相关属性。每一行代表由vehicle_ID标识的唯一车辆列表。 关键特性 覆盖范围:全球制造商和车型组合,包括纯电动汽车和插电式混合动力汽车。 范围:电池化学成分、容量、续航里程、充电标准和速度、价格、产地、自主水平、排放、安全等级、销售和保修。 时间跨度:模型跨度多年(包括传统和即将推出的)。 数据质量说明: 某些行可能缺少某些字段(空白)。 几个分类字段包含不同的、特定于供应商的值(例如,Charging_Type、Battery_Type)。 各列中的单位混合在一起;注意kWh、km、hr、USD、g/km和额定值。 列 列类型描述示例 Vehicle_ID整数每个车辆记录的唯一标识符。1 制造商分类汽车品牌或OEM。特斯拉 型号类别特定型号名称/变体。型号Y 与记录关联的年份整数模型。2024 电池_类型分类使用的电池化学/技术。磷酸铁锂 Battery_Capacity_kWh浮充电池标称容量,单位为千瓦时。75.0 Range_km整数表示充满电后的行驶里程(公里)。505 充电类型主要充电接口或功能。CCS、NACS、CHAdeMO、DCFC、V2G、V2H、V2L Charge_Time_hr浮动充电的大致时间(小时),上下文因充电方法而异。7.5 价格_USD浮动参考车辆价格(美元).85000.00 颜色类别主要外观颜色或饰面。午夜黑 制造国_制造类别车辆制造/组装的国家。美国 Autonomous_Level浮点自动化能力级别(例如0-5),可能包括子级别的小
内容概要:本文详细介绍了IEEE论文《Predefined-Time Sensorless Admittance Tracking Control for Teleoperation Systems With Error Constraint and Personalized Compliant Performance》的复现与分析。论文提出了一种预定义时间的无传感器导纳跟踪控制方案,适用于存在模型不确定性的遥操作系统。该方案通过具有可调刚度参数的导纳结构和预定义时间观测器(PTO),结合非奇异预定义时间终端滑模流形和预定义时间性能函数,实现了快速准确的导纳轨迹跟踪,并确保误差约束。文中详细展示了系统参数定义、EMG信号处理、预定义时间观测器、预定义时间控制器、可调刚度导纳模型及主仿真系统的代码实现。此外,还增加了动态刚度调节器、改进的广义动量观测器和安全约束模块,以增强系统的鲁棒性和安全性。 适合人群:具备一定自动化控制理论基础和编程能力的研究人员、工程师,尤其是从事机器人遥操作、人机交互等领域工作的专业人士。 使用场景及目标:①理解预定义时间控制理论及其在遥操作系统中的应用;②掌握无传感器力观测技术,减少系统复杂度;③学习如何利用肌电信号实现个性化顺应性能调整;④探索如何在保证误差约束的前提下提高系统的响应速度和精度。 阅读建议:本文内容涉及较多的数学推导和技术细节,建议读者先熟悉基本的控制理论和Python编程,重点理解各个模块的功能和相互关系。同时,可以通过运行提供的代码示例,加深对理论概念的理解,并根据自身需求调整参数进行实验验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值