Java基础之多态和泛型浅析
Java基础之多态和泛型浅析
一、前言:
楼主看了许多资料后,算是对多态和泛型有了一些浅显的理解,这里做一简单总结
二、什么是多态?
三、什么是泛型?
为什么要使用泛型?
在Java5之前,泛型程序设计是用继承实现的。例如ArrayList类只维护一个Object引用的数组:
//before generic classes
public class ArrayList {
private Object[] elementData;
...............
public Object get(int i) {.......}
public void add(Object object) {.........}
}
这种方法有两个问题,当获取一个值时必须进行强制类型转换
ArrayList files = new ArrayList();
.......................
String fileName = (String)files.get(0);
此外,这里没有错误检查。可以向数组列表中添加任何类的对象。
files.add(new File("......"));
对于这个调用,编译和运行都不会出错。然而在其他地方,如果将get的结果强制类型转换为String类型,就会产生一个错误。泛型提供了一个更好的解决方案:
Java5以后,ArrayList有一个类型参数来指定元素的类型:
ArrayList<String> files = new ArrayList<String>();(在Java7及以后的版本中,构造函数中可以省略泛型类型:ArrayList<String> files = new ArrayList<>();)
这显然使得代码具有更好的可读性。人们一看这个数组列表中包含的是String对象。
三、多态与泛型的区别:
其实多态和泛型也没有什么根本的区别,如果非要说说区别,那就说说吧:
泛型和多态比较容易混淆, 简单来说:泛型就是类型参数化, 好处是编译器会检查参数类型.多态就是多个类由继承(实现接口)得到的一致外观, 好处是简化代码, 隔绝修改实际上泛型和多态没有直接关系, 使用泛型在代码中就能按照指定类型的外观操作对象.
比较常用的泛型类型就是List<T>和Map<T, T>, 说个简单的例子吧:
List<String> list = ....; //具体类型, 就跟多态没什么关系了
for (String str : list) {
System.out.println(str.substring(1));
}
List<Animal> list = ...; //地球上但凡讲OO的都拿这个说事儿... 成员就是小猫小狗狮子老虎什么的
for (Animal animal : list) {
animal.say(); //喵, 汪....., 多态
}
多态可以分为编译时多态和运行时多态,泛型是对类型的抽象,属于编译时多态。
比如说下面的私有字段x, 它的数据类型在编译的时候是动态决定的,具有多态性。
class A<T>{ private T x;} A<string> a = new A<string>();
多态还可以分为:行为多态和属性多态。
下面的p在给它赋值前是不知道它的性别的,在给它赋不同的值的时候就表现出属性多态了。
与此同时,也具有了行为的多态, Walk().男人和女人走路的方式是不一样的,所以是多态了。
基类: Class Person, public virtual method Walk() {}
子类: Man, Woman
Person p = new Man();
Person p = new Woman();
转载请注明出处,谢谢!
Java基础之多态和泛型浅析的更多相关文章
- Java基础之Collection与Collections浅析
Java基础之Collection与Collections浅析 一.前言: 位于Java.util包下的Collection与Collections都是Java中重要的工具类,它们都是Java集合框架 ...
- Java基础十一--多态
Java基础十一--多态 一.多态定义 简单说:就是一个对象对应着不同类型. 多态在代码中的体现: 父类或者接口的引用指向其子类的对象. /* 对象的多态性. class 动物 {} class 猫 ...
- Java基础语法<十二> 泛型程序设计
1 意义 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用. 常见应用 : ArrayList 2 K T V E ? object等的含义 类型变量使用大写形式 E – Element ( ...
- 【Java基础】多态
首先先来个总结: 什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消 ...
- Java基础之十五 泛型
第十五章 泛型 一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大. 在面对对象编程语言中,多态算是一种泛化机 ...
- Java基础之浅谈泛型
简单的介绍了Java泛型类型的使用.上手容易,深入很难.
- 【java基础学习】-【泛型】
参考以下几位同学的总结来学习: http://www.cnblogs.com/lwbqqyumidi/p/3837629.html#!comments http://www.weixueyuan.ne ...
- java基础之 多态
在面向对象编程(Object-Oriented Programming, OOP)中,多态机制无疑是其最具特色的功能,甚至可以说,不运用多态的编程不能称之为OOP.这也是为什么有人说,使用面向对象语言 ...
- 黑马程序员——JAVA基础之多态与Object
------- android培训.java培训.期待与您交流! ---------- 多态 : 多态定义: 某一类事物的多种存在形态. 多态的体现: 父类的引用指向了自己的子类对象. ...
随机推荐
- 自动生成Mybatis的Mapper文件
自动生成Mybatis的Mapper文件 工作中使用mybatis时我们需要根据数据表字段创建pojo类.mapper文件以及dao类,并且需要配置它们之间的依赖关系,这样的工作很琐碎和重复,myba ...
- php 排序和置顶功能实现
(1)排序操作思路 一般来说都是按照发布时间排序.时间戳大的靠前,所以用倒序desc,而不是asc (2)置顶操作思路: 点击置顶时,修改数据库addtime字段值为当前时间即可.因为排序是按照时间戳 ...
- Linux基础之快照克隆、Xshell优化、Linux历史
今天主要分享4个Linux基础知识,第一个知识是虚拟机快照,第二个是虚拟机克隆,第三个是优化Xshell,第四个是简述Linux历史. 先分享第一个知识——虚拟机快照. 1.4)虚拟机快照 虚拟机快照 ...
- request获取容器过程
获取容器过程 CoyoteAdapter.postParseRequest(org.apache.coyote.Request req, Request request, org.apache.coy ...
- “$Bitmap 有标记已使用的未用簇”
前几天在电脑上用 DiskGenius 给移动硬盘分区的时候出现了这个错误,如下图所示: 解决方法: 在 cmd 命令行窗口中输入如下代码: chkdsk /f /x c: PS: 其中 " ...
- 【nodejs原理&源码赏析(9)】用node-ssh实现轻量级自动化部署
目录 一. 需求描述 二. 预备知识 IP+端口访问 域名访问 三. Nodejs应用的手动部署 四. 基于nodejs的自动部署 4.1 package.json中的scripts 4.2 自动化发 ...
- C# Winform 自定义控件——TextBox
效果: 描述: 类似html标签里input标签里的placeHolder属性,控件继承TextBox,拥有一个描述提示信息的字段_txtPlaceHolder,重写了消息处理函数WndProc, ...
- 一文搞懂Python迭代器和生成器
很多童鞋搞不懂python迭代器和生成器到底是什么?它们之间又有什么样的关系? 这篇文章就是要用最简单的方式让你理解Python迭代器和生成器! 1.迭代器和迭代过程 维基百科解释道: 在Python ...
- Unity经典游戏教程之:冒险岛
版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...
- 佳木斯集训Day6
T1还是个找规律啊,记下b的个数,然后直接*2%10000000009就好了 #include <bits/stdc++.h> #define mo 1000000007 using na ...