【Java基础】三大特性——多态

  • 多态的前提条件:继承
  • 可以简单理解为:把子类看成父类类型(反之是错误的)

优缺点

  • 弊端: 只能使用父类(父接口)中定义的功能
  • 好处: 函数的参数定义为父类(父接口)类型,可以接收所有父类的子类对象,从而避免了定义大量的参数为子类类型的函数
// 正常情况:猫就是猫   猫 mao=new 猫();
// 多态:把猫看成动物   动物 mao=new 猫();
abstract class Animal
{public abstract void eat();
}
class Cat extends Animal
{public void eat(){System.out.println("猫吃鱼");}public void catchMouse(){System.out.println("猫抓耗子");}
}
class Dog extends Animal
{public void eat(){System.out.println("狗吃骨头");}public void watch(){System.out.println("狗看门");}
}
class Demo15
{public static void main(String[] args){/*Cat mao=new Cat();mao.eat();mao.catchMouse();*///把猫看成父类类型,那么只能使用父类中定义的功能Animal mao=new Cat();mao.eat();//mao.catchMouse();}
}

弊端修饰

向下转型

abstract class Animal{public abstract void eat();
}
class Cat extends Animal{public void eat(){System.out.println("猫吃鱼");}public void catchMouse(){System.out.println("猫抓耗子");}
}
class Dog extends Animal{public void eat(){System.out.println("狗吃骨头");}public void watch(){System.out.println("狗看门");}
}
class Demo1{public static void main(String[] args){//向上转型(自动)//Animal mao=new Cat();//mao.eat();//向下转型//Cat cat=(Cat)mao;//cat.catchMouse();chi(new Cat());}public static void chi (Animal animal){animal.eat();if(animal instanceof Cat){//向下转型Cat mao=(Cat)animal;mao.catchMouse();}if(animal instanceof Dog){Dog gou=(Dog)animal;gou.watch();}}
}

instanceof 是 Java 的一个二元操作符,类似于 ==,>,< 等操作符。
instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。

成员特点

  • 成员变量: 编译时期看父类,运行结果也看父类;
  • 成员方法: 编译时期看父类,运行结果看子类(子类重写了);
  • 静态成员方法: 编译时期看父类,运行结果也看父类。
class Fu
{int age=55;public void show(){System.out.println("show fu");}public static void ff(){System.out.println("static fu");}
}
class Zi extends Fu
{int Weight;int age=66;public void show(){System.out.println("show zi");}public void fun(){System.out.println("fun zi");}public static void ff(){System.out.println("static zi");}
}
class Demo2
{public static void main(String[] args) {Fu zi=new Zi();System.out.println(zi.age);//55//System.out.println(zi.age);zi.show();//show zi//zi.fun();zi.ff();//static fu}
}

接口和多态

对类存在的语法,对接口也存在

interface inter
{public abstract void show();
}
class Test1 implements inter
{public void show(){System.out.println("show1");}
}
class Test2 implements inter
{public void show(){System.out.println("show2");}
}
class Demo5
{public static void main(String[] args) {Test1 t1=new Test1();fun(t1);Test2 t2=new Test2();fun(t2);}public static void fun(inter test){test.show();}
}

模板设计模式

实现一个功能时,功能的一部分是确定的,一部分是不确定,确定的部分还会用到不确定的部分,那么就把不确定的部分暴露出去,让子类去实现。

计算一个功能运行所需时间
确定的部分:记录一个开始时间,记录一个结束时间,结束时间 - 开始时间
不确定的部分:功能

abstract class TimeTool
{public final void times(){//记录一个开始时间//得到当前时间的毫秒值:1970.1.1long start=System.currentTimeMillis();//功能代码fun();//记录一个结束时间long end=System.currentTimeMillis();System.out.println("运行时间:"+(end-start));}public abstract void fun();
}
class Zi extends TimeTool
{public void fun(){for (int i=1;i<=3000;i++){System.out.println(i);}}
}
class Demo3
{public static void main(String[] args) {Zi zi=new Zi();zi.times();}
}

Object

  • 最顶层的类,超类;
  • 提取的是万事万物的共性。
  • 除了Object,其余的类都有父类
equals
  • boolean equals(Object obj)多态 任意两个对象都能比较是不是同一个对象
Person ren=new Person();
Cat mao=new Cat();
boolean boo=ren.equals(mao);
System.out.println(boo);

判断两个人是否是同龄人

class Person{int age;Person(){}Person(int age){this.age=age;}public boolean equals(Object obj){//各种情况都要考虑到,保证任何情况下都要有返回值if (obj==null)//避免空指针return false;if (obj instanceof Person){   //向下转型Person ren=(Person)obj;return this.age==ren.age;}return false;}
}
class Demo4 {public static void main(String[] args) {Person ren1=new Person(18);Person ren2=new Person(20);Boolean boo=ren1.equals(ren2);System.out.println(boo);}
}
toString

输出一个对象时,默认调用toString方法,返回对象的字符串表示形式

class Person {//String toString(){}
}
class Demo{public static void main(String[] args){Person ren=new Person();System.out.println(ren);//Fu@15db9742 类名@hash值System.out.println(ren.toString());//Fu@15db9742//得到对象的哈希值int code=ren.hashCode();System.out.println(Integer.toHexString(code));//得到一个对象所对应的类名Class claz=ren.getClass();//得到类 Person.class 字节码String name=claz.getName();System.out.println(name);System.out.println(ren.getClass().getName()+"@"+Integer.toHexString(ren.hashCode()));}
}

由于输出一个对象时,默认调用toString方法。通常通过重写toString方法,来返回有用的数据。

class Person {int age;String name;Person(){}Person(int age,String name){this.age=age;this.name=name;}public String toString(){return name+','+age;}
}
class Demo{public static void main(String[] args){Person ren=new Person(28,"小明");System.out.println(ren);}
}

在这里插入图片描述

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

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

相关文章

使用idea编辑器回退git已经push的代码

直接上结果 选择想要回退的那次/多次提交历史, 右击, 选中 revert commit git自动产生一个Revert记录&#xff0c;然后我们会看到git自动将我第三次错误提交代码回退了&#xff0c;这个其实就相当于git帮我们手动回退了代码。 后续&#xff0c;只需要我们将本次改动push到远…

Vue 介绍

【1】前端发展史 前端的发展史可简述为&#xff1a; 从最初的静态页面编写&#xff0c;依赖后端模板渲染逐步演化为通过JavaScript&#xff08;特别是Ajax技术&#xff09;实现前后端分离&#xff0c;使得前端能够独立地加载数据和渲染页面随后&#xff0c;Angular、React、Vu…

open 函数到底做了什么

使用设备之前我们通常都需要调用 open 函数&#xff0c;这个函数一般用于设备专有数据的初始化&#xff0c;申请相关资源及进行设备的初始化等工作&#xff0c;对于简单的设备而言&#xff0c;open 函数可以不做具体的工作&#xff0c;你在应用层通过系统调用 open 打开设备…

2024年电化学、可再生能源与绿色发展国际会议(ICERGD2024)

2024年电化学、可再生能源与绿色发展国际会议(ICERGD2024) 会议简介 2024国际电化学、可再生能源与绿色发展大会&#xff08;ICERGD2024&#xff09;将在青岛隆重举行。本次会议聚焦电化学、可再生能源和绿色发展领域的最新研究成果和技术趋势&#xff0c;旨在促进相关领域…

OpenNJet:下一代云原生应用引擎

OpenNJet&#xff1a;下一代云原生应用引擎 前言一、技术架构二、新增特性1. 透明流量劫持2. 熔断机制3. 遥测与故障注入 三、Ubuntu 发行版安装 OpentNJet1. 添加gpg 文件2. 添加APT 源3. 安装及启动4. 验证 总结 前言 OpenNJet&#xff0c;是一款基于强大的 NGINX 技术栈构建…

typescript类型基础

typescript类型基础 枚举类型 enum Season {Spring,Summer,Fall,Winter }数值型枚举 enum Direction {Up,Down,Left,Right } const direction:Direction Direction.up每个数值型枚举成员都表示一个具体的数字&#xff0c;如果在定义一个枚举的时候没有设置枚举成员的值&…

Excel利用数据透视表将二维数据转换为一维数据(便于后面的可视化分析)

一维数据&#xff1a;属性值都不可合并&#xff0c;属性值一般在第一列或第一行。 二维数据&#xff1a;行属性或列属性是可以继续合并的&#xff0c;如下数据中行属性可以合并为【月份】 下面利用数据透视表将二维数据转换为一维数据&#xff1a; 1、在原来的数据上插入数据透…

MySQL 社区经理:MySQL 8.4 InnoDB 参数默认值为什么要这么改?

MySQL 8.4 LTS 版本&#xff0c;我们一共修改了 20 个 InnoDB 变量的默认值。 作者&#xff1a;Frederic Descamps&#xff0c;EMEA 和亚太地区的 MySQL 社区经理。于 2016 年 5 月加入 MySQL 社区团队。担任开源和 MySQL 顾问已超过 15 年。最喜欢的主题是高可用和高性能。 本…

解决一个朋友的nbcio-boot的mysql数据库问题

1、原先安装mysql5.7数据库&#xff0c;导入我的项目里的带数据有报错信息 原因不明 2、只能建议用docker进行msyql5.7的安装 如下&#xff0c;可以修改成自己需要的信息 docker run -p 3306:3306 --name mastermysql -v /home/mydata/mysql/data:/var/lib/mysql -e MYSQL_R…

python绘图(pandas)

matplotlib绘图 import pandas as pd abs_path rF:\Python\learn\python附件\pythonCsv\data.csv df pd.read_csv(abs_path, encodinggbk) # apply根据多列生成新的一个列的操作&#xff0c;用apply df[new_score] df.apply(lambda x : x.数学 x.语文, axis1)# 最后几行 …

c#word文档:1.创建空白Word文档及保存/2.添加页内容...

---创建空白Word文档 --- &#xff08;1&#xff09;创建一个名为OfficeOperator的类库项目。引用操作Word的.NET类库 &#xff08;2&#xff09;定义用于操作Word的类WordOperator1。添加引用Microsoft.Office.Interop.Word命名空间。 &#xff08;3&#xff09;为WordOper…

Unity | Shader基础知识(第十三集:编写内置着色器阶段总结和表面着色器的补充介绍)

目录 前言 一、表面着色器的补充介绍 二、案例viewDir详解 1.viewDir是什么 2.viewDir的作用 3.使用viewDir写shader 前言 注意观察的小伙伴会发现&#xff0c;这组教程前半部分我们在编写着色器的时候&#xff0c;用的是顶点着色器和片元着色器的组合。 SubShader{CGPRO…

个股期权是什么,个股期权使用方法?

今天期权懂带你了解个股期权是什么,个股期权使用方法&#xff1f;个股期权作为金融市场的重要工具之一&#xff0c;是指投资者在约定时间内有权而非义务以约定价格买卖特定数量的个股的金融衍生品。 个股期权是什么&#xff1f; 个股期权合约是一种由交易所统一设定的标准化合…

git-新增业务代码分支

需求 使用git作为项目管理工具管理项目&#xff0c;我需要有两个分支&#xff0c;一个分支是日常的主分支&#xff0c;会频繁的推送和修改代码并推送另外一个是新的业务代码分支&#xff0c;是一个长期开发的功能&#xff0c;同时这个业务分支需要频繁的拉取主分支的代码&#…

Python_GUI框架 Pyside6的常用部件介绍

PySide6是一个非常完善的商用级别的GUI框架&#xff0c;涉及的知识点相对比较多&#xff0c;今天我先在这里介绍一下我们在实际应用中最常见的几种部件及其功能&#xff1a; 1. QMainWindow QMainWindow 提供了一个主应用程序窗口的框架&#xff0c;通常包含一个菜单栏、工具…

pytest教程-37-钩子函数-pytest_collection_finish

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest_collection_start钩子函数的使用方法&#xff0c;本小节我们讲解一下pytest_collection_finish钩子函数的使用方法。 pytest_collection_finish(session) 是一个 pytest 钩子函数&…

03_Redis

文章目录 Redis介绍安装及使用redis的核心配置数据结构常用命令stringlistsethashzset(sortedset) 内存淘汰策略Redis的Java客户端JedisRedisson Redis 介绍 Redis是一个NoSQL数据库。 NoSQL: not only SQL。表示非关系型数据库&#xff08;不支持SQL标准语法&#xff09;。 …

Java特性之设计模式【享元模式】

一、享元模式 概述 享元模式&#xff08;Flyweight Pattern&#xff09;主要用于减少创建对象的数量&#xff0c;以减少内存占用和提高性能。这种类型的设计模式属于结构型模式&#xff0c;它提供了减少对象数量从而改善应用所需的对象结构的方式 享元模式尝试重用现有的同类对…

简述前后端分离架构案例

Hello , 这里是小恒不会java 。今晚1点写写关于RESTful接口的使用案例&#xff0c;本文会通过django原生js前后端分离的案例简单讲解。本文带你认识一下简化版的前后端分离架构 代码 本文案例代码在GitHub上 https://github.com/lmliheng/fontend前后端分离 先说说什么是前后…

GateWay检查接口耗时

添加gateway依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId> </dependency>创建一个LogTimeGateWayFilterFactory类&#xff0c;可以不是这个名字但是后面必须是x…