狂神说:面向对象(三)——多态

news2024/9/25 23:18:54

多态

// 对象能执行什么方法,主要看对象左边的类型,和右边的没有关系

多态:同一方法可以根据发送对象的不同而采用不同的行为方式

父类:

public class Person
{
    public void run(){
        System.out.println("Person => run");
    }

}

子类:

public class Student extends Person{
    @Override
    public void run() {
        System.out.println("Student => run");
    }

    public void eat(){
        System.out.println("Student => eat");
    }
}

test.java

public class test {
    public static void main(String[] args) {
        // 一个对象的实际类型是确定的(左边)
        // 指向的引用类型不确定
        Person s1 = new Person();
        // 父类的引用 指向子类
        Person s2 = new Student();

        // 对象能执行什么方法,主要看对象左边的类型,和右边的没有关系
        s2.run();
        s2.eat();
    }
}

IDEA可以把s2强制转换为Student

4. 多态存在的条件

  • 存在继承关系

  • 子类重写父类

  • 父类的引用,指向子类:Person person = new Student();

不能多态的情况:

  • static方法: 属于类的方法

  • final方法: 最终的,不能被继承重写

  • private方法: 私有的

5. instance判断是不是类的对象

用于判断对象的运行类型,是否是某个类的类型或者其子类型

        // Object>Person>Student
        Student student = new Student();
        System.out.println(student instanceof Student); // true
        System.out.println(student instanceof Person);  // true
        System.out.println(student instanceof Object);  // true
        //System.out.println(student instanceof String);  // 报错了
        
        Person person = new Student();
        System.out.println(person instanceof Student);  // !! true!!
        System.out.println(person instanceof Person);   // true
        System.out.println(person instanceof Object);  // true

        Object object = new Student();
        System.out.println(object instanceof String); // false

        String string = new String();
        System.out.println(string instanceof  Object);  // !! true

6. 类型转换

父类型引用指向子类型,无法调用子类型的方法,这时将对象强制转换为子类型

((Student) person).eat();

  • 向上转型upcasting:子类对象赋值给父类引用,Father father = new Son();

  • 向下转型downcasting:指向子类对象的父类引用,赋值给子类引用, Son son = (Son)father,这个father就是上面提到的那个father

Tip: 写方法时,父类作为参数,传入子类对象,就是利用了向上转型。这时子类自己的方法不好使,重写了父类的方法的可以用,父类的方法也可以用。

修饰符

  1. static

静态变量属于类,在创建类时分配内存,各对象共享static类变量

非静态变量属于对象,在创建对象时分配内存,对象间不共享

    public static void main(String[] args) {
        /*
        Person <- Student
        Person <- Teacher
        Person中有static变量name
        Student和Teacher中各自有一个变量Age
         */

       // s2改变了s1的name,因为name是共享的static变量
       Person s1 = new Student();
       s1.setName("s1");
       System.out.println(s1.name);    // s1
        Person s2 = new Teacher();
        s2.setName("s2");
       System.out.println(s1.name);     // s2
        
        //s2设置的Age值不会影响到s1,因为是各自的变量,不是类共享的
       ((Student) s1).setAge(3);
        System.out.println(((Student)s1).getAge()); //3
        ((Teacher) s2).setAge(4);
        System.out.println(((Teacher)s2).getAge());// 4
        ((Student) s1).setAge(3);
        System.out.println(((Student)s1).getAge());//3
    }
  1. final

  • 修饰类:该类不能被继承

  • 修饰方法:该方法可以被继承,但继承后不能被重写

  • 修饰变量

  • 局部变量:

  • 如果是形参设为final则不能在方法体中赋值,因为已经在传参时赋过一次了。

  • 如果是函数体中的局部变量,只能赋值一次,不能多次赋值

  • 非静态成员变量:声明时赋值; 匿名代码块赋值; 构造器中赋值【可以把声明时赋值和在代码块中赋值理解成一个,都是声明时赋值,写法不一样罢了】

    // 声明时赋值
    private final int b = 1;
    
    // 匿名代码块赋值
    {
        final int d = 5;
    }

    // 构造器赋值
    private final int a;
    public Person(int a) {
        this.a = a;
    }
  • 静态成员变量:声明时赋值; 静态代码块赋值

    // 静态成员变量:不能在构造器中赋值,声明时赋值
    private static final int b = 0;

    // 或者用“静态代码块”,也是声明时赋值
    static{
        int b = 1;
        int c = 2;
    }
  • 引用变量:正常使用 就是不能再重赋值了

  1. abstract

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

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

相关文章

跳跃游戏 (贪心/动态规划/dfs)

1.跳跃游戏简单介绍 跳跃游戏是一种典型的算法题目&#xff0c;经常是给定一数组arr[]&#xff0c;从数组的某一位置i出发&#xff0c;根据一定的跳跃规则&#xff0c;比如从i位置能跳arr[i]步&#xff0c;或者小于arr[i]步&#xff0c;或者固定步数&#xff0c;直到到达某一位…

Java 【数据结构OJ题十道】—— 二叉树篇2

文章目录一、二叉树前序遍历二、二叉树层序遍历三、按照之字形打印二叉树四、二叉树中和为某一值的路径(一)五、二叉搜索树与双向链表六、合并二叉树七、二叉树的镜像八、判断是否为二叉搜索树九、判断是否为完全二叉树十、判断是否为平衡二叉树总结提示&#xff1a;本人是正在…

TCP中RTT时延的理解

最近服务器环境部署了tcprtt网络时延监控&#xff0c;发现不同服务器不同节点之间的RTT时延表象非常奇怪&#xff0c;无法准确的判断服务器的网络情况。因此需要弄清楚什么是RTT&#xff0c;以及能否作为服务器网络性能的检测指标。 1、RTT是什么&#xff1f; TCP中的RTT指的是…

倾向得分匹配案例分析

一、倾向得分匹配法说明 倾向得分匹配模型是由Rosenbaum和Rubin在1983年提出的&#xff0c;首次运用在生物医药领域&#xff0c;后来被广泛运用在药物治疗、计量研究、政策实施评价等领域。倾向得分匹配模型主要用来解决非处理因素&#xff08;干扰因素&#xff09;的偏差。 …

为什么硬件性能监控很重要

当今的混合网络环境平衡了分布式网络和现代技术的实施。但它们并不缺少一个核心组件&#xff1a;服务器。保持网络正常运行时间归结为监控和管理导致网络停机的因素。极有可能导致性能异常的此类因素之一是硬件。使用硬件监控器监控网络硬件已成为一项关键需求。 硬件监视器是…

连接金蝶云星空,数据交互轻松搞定!丨三叠云

金蝶云星空 路径 拓展 >> 插件 功能简介 新增插件「金蝶云星空」。 用户可通过配置「金蝶云星空」插件&#xff0c;就可以实时获取「金蝶云星空」的数据&#xff0c;同时支持回填数据至金蝶系统内。 地图视图 路径 表单 >> 表单设计 功能简介 新增「地图视…

prometheus+cadvisor监控docker

官方解释 cAdvisor&#xff08;ContainerAdvisor&#xff09;为容器用户提供了对其运行容器的资源使用和性能特性的了解。它是一个正在运行的守护程序&#xff0c;用于收集、聚合、处理和导出有关正在运行的容器的信息。具体来说&#xff0c;它为每个容器保存资源隔离参数、历史…

活动目录(Active Directory)组策略管理工具

活动目录&#xff08;Active Directory&#xff09;是面向Windows Standard Server、Windows Enterprise Server以及 Windows Datacenter Server的目录服务。&#xff08;Active Directory不能运行在Windows Web Server上&#xff0c;但是可以通过它对运行Windows Web Server的…

虚拟数字人直播带货相比人工有哪些优势?

新经济时代的到来&#xff0c;彻底改变了传统的消费方式。虚拟数字人的出现&#xff0c;标志着新一波的消费升级到来。虚拟数字人直播带货&#xff0c;不仅降低了商家的带货成本&#xff0c;拉近了商家与消费者的距离&#xff0c;也给消费者带来全新的消费方式。 花西子虚拟形象…

华为OD机试模拟题 用 C++ 实现 - 删除最少字符(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)) 文章目录 最近更新的博客使用说明删除最少字符题目输入输出描述示例一输入输出示例二输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率…

在Redis集群模式下使用pipeline进行批量操作

最近开始又接触到了Redis&#xff0c;之前在工作中使用Redis的时候&#xff0c;由于QPS不高&#xff0c;都是直接get/set搞定了。这次遇到的业务数据量比较大&#xff0c;更新也很频繁&#xff0c;Redis使用是集群模式&#xff0c;所以本文记录下捣鼓出来的如何在集群模式下使用…

动手学深度学习(第二版)学习笔记 第三章

第三章 线性神经网络 代码&#xff1a;d2l-zh/pytorch/chapter_linear-networks 3.1 线性回归 3.1. 线性回归 — 动手学深度学习 2.0.0 documentation 解析解 线性回归的解可以用一个公式简单地表达出来&#xff0c;这类解叫作解析解&#xff08;analytical solution&…

深度学习实战19(进阶版)-SpeakGPT的本地实现部署测试,基于ChatGPT在自己的平台实现SpeakGPT功能

大家好&#xff0c;我是微学AI&#xff0c;今天给大家带来SpeakGPT的本地实现&#xff0c;在自己的网页部署&#xff0c;可随时随地通过语音进行问答&#xff0c;本项目项目是基于ChatGPT的语音版&#xff0c;我称之为SpeakGPT。 ChatGPT最近大火&#xff0c;其实在去年12月份…

「架构」全链路异步模式

总结自尼恩的全链路异步&#xff1a;网关纯异步化网关层的特点&#xff1a;不需要访问业务数据库只做协议转换和流量转发特点是 IO 密集型&#xff0c;特别适合纯异步的架构&#xff0c;可以极大的节省资源。如何进行网关异步化&#xff1f;使用高性能的通信框架Netty&#xff…

CSS3新增的视口单位Vh、Vw单位

定义vw&#xff1a;浏览器可见视口【宽度】的百分比&#xff08;1vw代表视窗【宽度】的1%&#xff09;vh&#xff1a;浏览器可见视口【高度】的百分比&#xff08;1vw代表视窗【高度】的1%&#xff09;vmin&#xff1a;当前 vw 和 vh 较小的一个值。vmax&#xff1a;当前 vw 和…

现在入行软测=49年入国军?三句话,让面试官再掏2K!

还有三五天就步入金三银四&#xff0c;很多软测人吐槽因为疫情&#xff0c;公司都在裁员&#xff0c;别说跳槽涨薪&#xff0c;能保住现在的工作就不错了。但也有那么一批人&#xff0c;凭借自己口才与实力拿到年薪近50W的offer。面试是初见1小时就要相互了解优缺点的过程&…

软考知识笔记 2023.2.24 2018下半年真题

答案&#xff1a; A BIOS (BasicInputOutputSystem) (基本输入输出系统) 是一组固化到计算机内主板上一个ROM芯片上的程序&#xff0c; 它保存着计算机最重要的基本输入输出的程序&#xff0c; 开机后自检程序和系统自启动程序&#xff0c; 它可从CMOS中读写系统设置的具体信息…

SpringBoot整合(六)多数据源和 JPA、MyBatis、JdbcTemplate 的集成

在springboot项目中&#xff0c;我们可能会碰到需要多数据源的场景。例如说&#xff1a; 读写分离&#xff1a;数据库主节点压力比较大&#xff0c;需要增加从节点提供读操作&#xff0c;以减少压力。多数据源&#xff1a;一个复杂的单体项目&#xff0c;因为没有拆分成不同的…

PPP简介,PPP分层体系架构,PPP链路建立过程及PPP的帧格式

PPP&#xff08;Point-to-Point Protocol&#xff09;是一种用于在两个网络节点之间传输数据的通信协议。它最初是为在拨号网络上进行拨号连接而开发的&#xff0c;现在已经被广泛应用于各种网络环境中&#xff0c;例如在宽带接入、虚拟专用网&#xff08;VPN&#xff09;等场景…

在linux中使用lftp和sftp下载文件(夹)

一、首先确保你的系统中已经下载了lftp和sftp。 1.安装lftp sudo apt install lftp sudo apt install screen 2.安装sftp 在Linux系统中&#xff0c;一般RedHat系统默认已经安装了openssh-client和openssh-server&#xff0c;即默认已经集成了sftp服务&#xff0c;不需要重…