-
2021-05-23 08:34:50
多态是一种不同的对象以单独的方式作用于相同消息的能力,这个概念是从自然语言中引进的。例如,动词“关闭”应用到不同的事务上其意思是不同的。关门,关闭银行账号或关闭一个程序的窗口都是不同的行为;其实际的意义取决于该动作所作用的对象。
大多数面向对象语言的多态特性都仅以虚拟函数的形式来实现,但C++除了一般的虚拟函数形式之外,还多了两种静态的(即编译时的)多态机制:
1、操作符重载:例如,对整型和串对象应用 += 操作符时,每个对象都是以单独的方式各自进行解释。显然,潜在的 += 实现在每种类型中是不同的。但是从直观上看,我们可以预期结果是什么。
2、模板:例如,当接受到相同的消息时,整型vector对象和串vector对象对消息反映是不同的,我们以关闭行为为例:
vector < int > vi; vector < string > names;
string name(“VC知识库”);
vi.push_back( 5 ); // 在 vector 尾部添加整型
names.push_back (name); // 添加串和添加整型体现差别的潜在的操作
静态的多态机制不会导致与虚拟函数相关的运行时开。此外,操作符重载和模板两者是通用算法最基本的东西,在STL中体现得尤为突出。
更多相关内容 -
关于多态三种基本形式
2022-06-10 16:06:20java学习笔记——多态多态的三种基本形式:
1.特设多态(同一操作,不同类型不同行为) 如:重载(overloading)
重载定义:在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
最常用的地方就是构造器的重载。
重载规则:
- 被重载的方法必须改变参数列表(参数个数或类型不一样);
- 被重载的方法可以改变返回类型;
- 被重载的方法可以改变访问修饰符;
- 被重载的方法可以声明新的或更广的检查异常;
- 方法能够在同一个类中或者在一个子类中被重载。
- 无法以返回值类型作为重载函数的区分标准。
2.参数化多态(操作与类型无关) 如:泛型
泛型适用的常见场合:当一个操作与参数类型无关,而希望对各种参数类型都适用的时候。如:
public class Elements<T>{ private T t; public add(T t){ this.t=t; } public get(){ return t; } } public static void main(String[] args){ Elements<Integer> n=new Elements<Integer>(); n.add(12); System.out.println(n.get()); Elements<String> s=new Elements<String>(); s.add("abcd"); System.out.println(s.get()); }
由于实现的操作与类型完全无关,所以我们就可以在定义类的时候使用泛型,在具体实现的时候再对具体的类型做出定义。
3.子类型多态(同一对象可能属于多种类型) 如:继承、重写
重写的好处:子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
重写的注意点:重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类。在这种情况下,子类只能抛出 IOException 异常或者 IOException 的子类异常。
重写规则:
-
参数列表与被重写方法的参数列表必须完全相同。
-
返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。
-
访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
-
父类的成员方法只能被它的子类重写。
-
声明为 final 的方法不能被重写。
-
声明为 static 的方法不能被重写,但是能够被再次声明。
-
子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。
-
子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。
-
重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
-
构造方法不能被重写。
-
如果不能继承一个类,则不能重写该类的方法。
-
-
java多态的三种表现形式
2021-06-19 12:17:53前言 MyBatis是一个支持普通SQL查询、存储过程和高级...MyBatis作为持久层框架,其主要思想是将程序中的大量SQL语句剥离出来,配置在配置文件中,以实现SQL的灵活配置。这样做的好处是将SQL与程序代码分离,做到可以前言
MyBatis是一个支持普通SQL查询、存储过程和高级映射的优秀持久层框架。MyBatis 去掉了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解进行配置和原始映射,以将接口和Java的POJO (Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
MyBatis作为持久层框架,其主要思想是将程序中的大量SQL语句剥离出来,配置在配置文件中,以实现SQL的灵活配置。这样做的好处是将SQL与程序代码分离,做到可以在不修改程序代码的情况下,直接在配置文件中修改SQL。
在这里分享一份 [mybatis从入门到精通] 的强力教程,定能够助你一臂之力。
目录
进入Spring Boot世界
讲述Sping、Spring Boot 和Spring Cloud 之间的关系,还重点讲述了如何利用开发工具(如IDEA)来实现开发,如何通过API文档来寻找类对象方法,告诉我们在开发过程中如何学习、发现和解决问题
需要免费领取这份Alibaba架构师耗时一年整理的《Spring Boot实战,让你的开发像搭积木一样简单 》的朋友,可以在文末免费领取
准备开发环境
首先介绍搭建开发Spring Boot的环境,然后介绍项目管理模型文件pom.xml,最后讲解如何设置国内仓库。讲述了Java环境的搭建,以及开发工具的使用。
使用开发工具
详细介绍开发工具IDEA、Eclipse、STS,以及流行插件的安装和配置。本章将利用IDEA开发、运行和打包发布第一个Spring Boot应用程序"Hello World"。在介绍IDEA实用技能的同时,还会详细比较IDEA和Eclipse的区别,以及如何在各个开发工具中使用本书的随书源代码。
基础篇
基础篇,尤其是对入门读者来说特别适用。
Spring Boot基础
首先介绍Spring Boot的基础知识:然后讲解如何定制启动画面、实现热部署:最后介绍如何使用配置文件,以及通过配置文件配置多环境。
分层开发Web应用程序
介绍Web开发中最常用的分层开发的模式MVC ( Model View Controller );然后讲解视图技术Thymeleaf的语法和实用技术,并用实例讲解如何将MVC三者联系起来构建Web应用程序;最后通过实例讲解如何用Validator实现数据验证,以及如何自定义数据验证。
响应式编程
首先介绍响应式编程的基本概念,并对比分析MVC和WebFlux模式,用实例讲解如何进行WebFlux的开发; 然后讲解用MVC及响应式开发方式开发WebFlux的方法;最后用WebFlux模式结合MongoDB数据库实现数据的增加、删除、修改和查询。
进阶篇
在理论讲解部分让我们明白工作中需要的技术重点,再以实例让我们深入学习,提高技术水平,轻松迎接工作,真真切切地将知识点和实操技能应用到工作中。
Spring Boot进阶
介绍AOP、loC、Servlet 容器;然后深入讲解自动配置原理、自定义Starter、自定义注解;最后讲解异常的处理,以及如何进行单元测试。
用ORM操作SQL数据库
介绍如何使用ORM ( JPA、MyBatis )操作数据库;然后讲解常用的查询方式、自定义查询方式、原生SQL (Structured Query Language,结构化查询语言)的开发和映射,还会深入地讲解一对一、-对多、多对多的关系映射操作以及事务的使用;最后对比分析JPA和MyBatis的区别。
接口架构风格——RESTful
RESTful是非常流行的架构设计风格。本章首先介绍REST的特征、HTTP方法与CRUD动作映射;然后讲解如何基于Spring Boot为PC、手机APP构建统- -风格的Restful API; 最后讲解在Spring Boot下如何使用RestTemplate发送GET、POST、DELETE、PUT等请求。
集成安全框架,实现安全认证和授权
介绍如何使用Spring Security 创建独立验证的管理员权限系统、会员系统,讲解如何进行分表、分权限、分登录入口、分认证接口、多注册接口,以及RBAC权限的设计和实现,如何使用JWT为手机APP提供token认证;然后讲解Apache的Shiro安全框架的基本理论基础,以及如何使用Shiro构建完整的用户权限系统;最后对比分析Spring Security和Shiro的区别。
在Spring Boot中使用Redis实现高并发
Redis是大规模互联网应用常用的内存高速缓存数据库,它的读写速度非常快,据官方Bench-mark的数据,它读的速度能到11万次/秒,写的速度是8.1万次/秒。
首先介绍Redis的原理、概念、数据类型;然后用完整的实例来帮助读者体验缓存增加、删除、修改和查询功能,以及使用Redis实现文章缓存并统计点击量;最后讲解分布式Session的使用。
用RabbitMQ实现系统间的数据交换
RabbitMQ是近年来使用非常广泛的消息中间件。
首先介绍它的原理、概念、6种工作模式、常用的注解:然后用实例讲解在Spring Boot中如何使用AmapT emplate接口实现消息的发送和监听。
集成NoSQL数据库实现搜索引擎
关于搜索引擎,我们很难实现Elasticsearch和Solr两大搜索框架的效果。所以针对两大搜索框架,非常详细地讲解了它们的原理和具体使用方法。首先介绍什么是搜索引擎、如何用MySQL实现简单的搜索引擎,以及Elasticsearch 的概念和接口类;然后介绍Elasticsearch的精准、模糊、范围、组合、分页、聚合查询;最后介绍Solr的概念、安装、配置和使用,并对两大搜索框架进行比较。
让我们可以在短时间内从一个技术“菜鸟”成长为技术“达人
项目实战
开发企业级通用的后台系统
使用Spring Boot,免不了开发后台系统。所以,通过实现-一个基于角色的访问控制后台系统,来系统地介绍如何使用Spring Security。
实现一个类似“京东”的电子商务商城
为了综合使用本书讲解的Spring Security、 Redis、RabbitMQ、 JPA、JWT技术,通过实例来整合这些技术。
首先讲解如何整合管理系统和会员系统实现多用户系统;然后讲解如何实现会员系统的多湍、多方式注册和登录;最后讲解如何实现购物、下单、秒杀,以及订单自动取消功能。
新业务转入Spring Boot技术栈之后,员工好招聘了( Java开发者多,有Java基础能很快上手使用),它使得开发速度、开发成本和业务运营效果都得到了飞速提升。没用太多时间,同事们就使用Spring Boot构建了公司的第一个大数据开发框架。它整合了Spark、Elasticsearch、RabbitMQ、Redis 等,实现了数据挖掘、自动预测趋势、关联分析、聚类、概念描述、偏差检测等。
Spring Boot 的配置、使用、监控、部署都很简单,它拥有完善的生态。后期如果因为项目流量太大需要切换到微服务Spring Cloud (基于Spring Boot )也会极为顺利。可以预想,未来会有越来越多的公司采用Spring Boot,更会有越来越多的开发者关注和使用Spring Boot。
读者福利
分享一份自己整理好的Java面试手册,还有一些面试题pdf
不要停下自己学习的脚步
赞后,戳这里即可免费领取](https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB)**
不要停下自己学习的脚步
[外链图片转存中…(img-lbeojAo3-1624076268609)]
[外链图片转存中…(img-mXQcxnt6-1624076268609)]
-
C#多态的三种实现方式
2021-02-16 10:18:22C#实现多态主要有3种方法,虚方法,抽象类,接口 1 虚方法 在父类的方法前面加关键字virtual, 子类重写该方法时在方法名前面加上override关键字,例如下面的Person类的SayHello方法 class Person { public ...C#实现多态主要有3种方法,虚方法,抽象类,接口
1 虚方法
在父类的方法前面加关键字virtual, 子类重写该方法时在方法名前面加上override关键字,例如下面的Person类的SayHello方法
class Person { public Person(string name) { this.Name = name; } string _name; public string Name { get => _name; set => _name = value; } //父类方法加virtual,子类用override重写该方法,就实现了多态 public virtual void SayHello() { Console.WriteLine("我是父类的方法"); } }
学生类和教师都继承于Person
class Student : Person { public Student(string name) : base(name) { } public override void SayHello() { Console.WriteLine("我叫{0}, 我是学生", this.Name); } } class Teacher:Person { public Teacher(string name) : base(name) { } public override void SayHello() { Console.WriteLine("我叫{0}, 我是老师", this.Name); } }
然后在Main函数中使用多态
Student st = new Student("李雷"); Teacher th = new Teacher("井边君"); Person[] p = { st, th }; //子类对象赋给父类 for(int i = 0; i < p.Length; i++) { p[i].SayHello(); } Console.ReadKey();
本例全部代码
using System; namespace 多态之虚方法 { class Program { static void Main(string[] args) { Student st = new Student("李雷"); Teacher th = new Teacher("井边君"); Person[] p = { st, th }; //子类对象赋给父类 for(int i = 0; i < p.Length; i++) { p[i].SayHello(); } Console.ReadKey(); } } class Person { public Person(string name) { this.Name = name; } string _name; public string Name { get => _name; set => _name = value; } //父类方法加virtual,子类用override重写该方法,就实现了多态 public virtual void SayHello() { Console.WriteLine("我是父类的方法"); } } class Student : Person { public Student(string name) : base(name) { } public override void SayHello() { Console.WriteLine("我叫{0}, 我是学生", this.Name); } } class Teacher:Person { public Teacher(string name) : base(name) { } public override void SayHello() { Console.WriteLine("我叫{0}, 我是老师", this.Name); } } }
2 抽象类
在类前面加关键字abstract,方法前面加abstract,抽象方法不能有函数体。
抽象类的特点:
(1)可以有字段
(2)可以有非抽象方法
抽象类实现多态的代码如下
using System; using System.Collections.Generic; namespace 多态之抽象类 { abstract class Person { //抽象方法不能有函数体 public abstract void SayHello(); } class Student : Person { public override void SayHello() { Console.WriteLine("我是子类Student重写的抽象方法"); ; } } class Teacher : Person { public override void SayHello() { Console.WriteLine("我是子类Teacher重写的抽象方法"); ; } } class Program { static void Main(string[] args) { List<Person> clist = new List<Person>(); Student st = new Student(); Teacher th = new Teacher(); clist.Add(st); clist.Add(th); foreach(Person p in clist) { p.SayHello(); } Console.ReadKey(); } } }
3 接口实现多态
代码如下
using System; using System.Collections.Generic; namespace 多态之接口 { public interface IWeapon { void Fire(); } class Gun : IWeapon { public void Fire() { Console.WriteLine("我是枪"); } } class Sword : IWeapon { public void Fire() { Console.WriteLine("我是剑"); } } class Tank : IWeapon { public void Fire() { Console.WriteLine("我是坦克"); } } class Program { static void Main(string[] args) { List<IWeapon> list = new List<IWeapon>(); Gun gun = new Gun(); Sword sw = new Sword(); Tank ta = new Tank(); list.Add(gun); list.Add(sw); list.Add(ta); foreach (IWeapon p in list) { p.Fire(); } Console.ReadKey(); } } }
接口的特点
(1)接口里的方法不能有修饰符,默认是public
(2)接口的方法不能有函数体
(3)接口中不能包含示例字段,不能有构造函数
(4)接口里的方法被继承的类重写时,不需要用override关键字,接口不能被实例化
(5)接口之间可以继承,并且可以多继承;接口不能继承于类,但是类可以继承于接口
(6)一个类可以同时继承一个类,并实现多个接口
-
详解C++ 多态的两种形式(静态、动态)
2020-12-17 00:44:26静态多态和动态多态的区别其实只是在什么时候将函数实现和函数调用关联起来,是在编译时期还是运行时期,即函数地址是早绑定还是晚绑定的。静态多态是指在编译期间就可以确定函数的调用地址,并生产代码,这就是静态... -
多态的三种表现形式以及案例分析
2018-08-30 11:26:59首先多态的三种表现形式: 继承,重写,父类引用指向子类对象。 下面案例介绍和分析: 父类- HttpServlet public class HttpServlet { public void service() { System.out.println("HttpServlet - ... -
Java中三种多态实现方式
2018-08-10 09:35:441.普通类 AnimalFu a = new AnimalZi new(); 2.抽象类 animal 是父类抽象类 Animal a = new Cat(); 3.接口 // 学生是类 smoking 是接口 ...多态的特点: 变量:编译看父类 方法:运行看子类... -
C++多态三种实现方式
2020-10-14 19:52:01多态的实现方式分为三块:重载、重写、重定义。下面我们来谈一谈他们各自的实现方式和实现原理。 重载 实现方式 重载是在同一作用域内(不管是模块内还是类内,只要是在同一作用域内),具有相同函数名,不同的形参... -
Java中多态性的实现方式
2020-08-29 08:31:44主要介绍了Java中多态性的实现方式,什么是多态?通过简单的一道题目帮大家理解java多态性,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
一、多态的三种实现方式(左父右子)
2020-11-24 21:50:08一、多态的三种实现方式(左父右子) 第一种:父类是普通类 Fu obj = new Zi(); 第二种:父类是抽象类 Father obj = new Child(); 第三种:父类是接口 Animal obj = new Dog(); 二、多态的执行(编译看... -
java 什么是多态?多态的三种表现形式?什么是向上转型和向下转型?多态的利和弊?
2017-04-09 19:55:26一、多态是继封装、继承之后,面向对象的第三大特性。现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态。 Java作为面向对象的语言,同样可以描述一个... -
C++ 多态 以及实现多态的三种方式
2014-09-02 21:59:063. C++中实现多态的方式... 1 4. 细说用函数重载实现的多态... 2 5. 细说用模板函数实现的多态... 3 6. 小结... 4 7. 细说用虚函数实现的多态... 4 7.1. 虚函数是怎么回事... -
实现多态的三种方法之抽象类和接口
2019-04-17 22:24:30实现多态的方法 多态性通过派生类重载基类中的虚函数型方法来实现。 可以用不同的方式实现组件中的多态性: 1.接口多态性。 2.继承多态性。 3.通过抽象类实现的多态性。 (继承在前边讲过,所以这里只讲抽象类和接口... -
python类的三大特性---多态
2021-03-06 01:19:21抽象类抽象类的概念:抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化。...从实现角度来看,抽象类与普通类的不同之处在于:抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,只... -
【面向对象】多态的四种形式(重载、改写、多态变量、泛型)
2020-04-01 18:32:02多态可以分为重载、改写、多态变量、泛型四种形式。 1、 重载(Overload) 是在一个类里面,方法名字相同,而参数(个数或者类型)不同。 通俗来讲,就是两个函数名相同而类型签名不同,他们之间构成重载关系。 但是... -
PHP5中实现多态的两种方法实例
2021-04-12 17:44:05PHP5中实现多态的两种方法实例function __construct($_name) {$this->setName($_name);}function getName() {return $this->name;}function setName($_name) {$this->name = $_name;}function getDiscount... -
多态的四种实现
2017-08-30 10:25:51多态分为两种:通用的多态和特定的多态。两者的区别是前者对工作的类型不加限制,允许对不同类型的值执行相同的代码;后者只对有限数量的类型有效,而且对不同类型的值可能要执行不同的代码。 通用的多态又分为... -
C#中实现多态的三种方式:抽象类,虚方法,接口
2018-07-13 11:18:41Interface(接口):是一种规则,要求继承类必需实现所有声明的成员,方法是公开的。 Virtual方法(虚方法):可以在继承类里 Override覆盖重新的方方法,有自己的方法体。派生类可使用,可重写。 Abstract(抽象方法)... -
java中实现多态的方式
2021-03-06 04:02:30Java中实现多态的方式:1、接口实现;2、继承父类进行方法重写;3、同一个类中进行方法重载。多态存在的必要条件:1、要有继承;2、要有重写;3、父类引用指向子类对象。多态的好处:1、可替换性(substitutability)... -
Java的两种实现多态的方式以及区别
2022-05-13 19:59:061、对象的上转型对象 假设Animal类是Tiger类的父类,当用子类创建一个对象,并... 4、区别 用两种方式都可以实现多态,唯一的区别就是用上转型对象可以调用父类的变量,接口回调中接口不能调用自己定义的常量。 -
多态定义、多态实现、多态分类。
2018-08-23 11:46:471.多态定义:同一操作作用于不同的...实现多态有三种方式:虚方法,抽象方法,接口。 虚方法:子类重写父类中的方法,对父类中的方法进行覆盖。适用情况:父类中的方法对子类来说不适用,子类通过重写该方法,覆... -
Python多态的两种实现形式
2020-10-27 18:25:50以下是Python伪代码实现Java或C的多态: class A(object): def test(self): print('A test') class B(A): def test(self): print('B test') class C(A): def test(self): print('C t -
java用何种方式实现多态
2021-09-18 10:36:18java多态这个概念在同学们深入学习java的时候就会被提出,很多同学并不知道是什么意思,如何实现。今天小千就来给大家介绍一下什么多java多态和java如何实现多态。 什么是多态? 指允许不同类的对象对同一消息... -
多态的两种表现形式
2018-04-18 15:00:41多态的概念:同一个方法名称,执行不同的操作多态的两种形式: 重写和重载重写概念:在继承过程中,子类定义了与父类中名称相同,参数相同,返回值相同的方法称为重写重写时,子类不能比父类的访问权限更严格重写的... -
C++ 多态的两种形式
2018-09-19 17:02:26编译时多态是静态多态,在编译时就可以确定接口使用的形式。运行时多态是动态多态,具体引用的接口在运行时才能确定。 静态多态和动态多态的区别其实只是在什么时候将函数实现和函数调用关联起来,是... -
多态的使用形式(三种)
2020-06-15 09:38:591 使用父类作为方法形参实现多态 feet(Animal animal) 2 使用父类作为方法返回值实现多态 public Animal sellPet(int choice) { Animal a=null; switch (choice) { case 1: a=new Duck(“小黄鸭”); break; case 2: ... -
java实现多态的两种方式(接口、抽象类)
2019-07-27 13:53:05抽象类实现多态: 父类对象指向子类对象,可调用子类的重写方法。 接口实现多态: 接口对象指向实现类对象,可调用实现类的重写方法 以下就是生活中两种多态的实例,**抽象类是模板,接口是功能。 **描述: Door.... -
面向对象之多态的三种方式
2019-09-27 22:47:24多态是面向对象最重要的...简单来说多态主要有三种形式,分别是虚方法、接口和抽象类,三者各有特点,下面是代码对他们的描述: 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 //1....