JAVA 多态(以及多态在数组和ArrayList中的体现)
来源:互联网 发布:青蜂网络 编辑:程序博客网 时间:2024/09/21 11:14
多态意味着,你可以把一个dog,当做一个Dog,或者Animal,或者一个Object
Animal a=new Dog();
新建一个Dog类型的对象,用一个Animal的引用来指向它
但是我们不能用a.bark(),因为Animal类中没有bark()方法.
(换言之,Animal类型的引用a就像一个遥控器,没有bark()功能的键)
需要强制类型转化:
Dog b=(Dog) a;
b.bark();
引用,参数,返回值都可以是多态的
多态在数组和ArrayList上的表现:
①各子类的实例能同时存放在父类类型的数组中如:Animal[ ] animals=(new Dog(),new Cat(),new Rabbit);
//Dog Cat Rabbit 都是Animal的子类
②对于每个数组元素调用方法:
在这边举一个例子:
这是定义的三个类:(Animal Dog Cat里面都有方法eat())
声明:
Dog d=new Dog();
Cat c=new Cat();
Animal[ ] animals={d,c};
对每个Animal[ ]中的元素调用eat():
结果显示,调用的是Dog和Cat各自的eat(),而非Animal的eat():
但是如果Animal中没有eat();
(把Animal中的eat()方法注释掉)
编译器会报错:(需要强制类型转化Animal--->Dog)
(不免让人想起很多的以前的例子,强制类型转化来调用父类所没有的功能)
③ArrayList<T> 的多态
.基本跟Array数组是一样的
不一样的地方:
这样的以ArrayList<Animal>为参数类型的方法,不能传入ArrayList<Dog> 这样的参数
//Dog extends Animal
(如果参数类型是Animal[ ] 那么可以传入Dog[ ])
为什么会这样呢?
①为什么ArrayList不行:
因为如果写了这样一个方法:
而传入的是一个ArrayList<Dog>,那就会在狗群里面混入一只猫,这是编译器不允许的
②为什么数组行
因为数组的类型是在运行期间检查(JAVA虚拟机来报错),但集合的类型检查只会发生编译期间(编译器来报错)
public void takeThing(ArrayList<? extends Animal> list){}
或者
public <T extends Animal> void takeThing(ArrayList<T> list){}
二者是等价的
详见java 泛型:http://blog.163.com/it_novice/blog/static/20918306920133885429926/
解决问题的原因:add(new Cat())这类方法直接不被允许了,编译器会禁止向集合添加对象。
这样一来,就能传入很多子类型的ArrayList了
可以说狗是动物,但不能说动物是狗
ArrayList前后都要一样
- JAVA 多态(以及多态在数组和ArrayList中的体现)
- java进制转换在数组中的体现
- Java中的ArrayList数组
- Java 泛型在API中的体现
- Servlet和JSP的关系以及此关系在Tomcat中的体现
- 继承和引用在buiw中的体现
- 多态在子父类中的成员上体现的特点
- java多态的实现主要体现在哪些方面
- java多态的实现主要体现在哪些方面
- java中的继承体现
- TCP连接的建立与终止,三次握手和四次握手,以及在socket系列函数中的体现
- JAVA多态的体现
- java数组和ArrayList用法
- Java基本数据类型在常量池中的体现
- Java基本数据类型在常量池中的体现
- java面向对象-异常在子父类覆盖中的体现
- 部分JAVA设计模式在Android中的体现。
- java语言基础(36)——面向对象(多态的代码体现以及成员之间的访问关系)
- JAVA.util.Collections List的常用方法,sort()
- Java.util.Collections.sort(List l) 排序 [implements Comparable]
- JAVA 泛型(generic)
- JAVA 里的数据结构 Set List Map
- Java.util.Collections.sort(List l) 排序 [implements Comparator]
- JAVA 多态(以及多态在数组和ArrayList中的体现)
- JAVA GUI 图形界面 ※插入图片※
- JAVA 内部类
- JAVA GUI 图形界面
- JAVA 异常 exception
- java.math 的方法
- JAVA 静态方法和静态变量和final和※静态import※
- JAVA String与double int 等primitive主数据类型 互相转化
- JAVA日期的格式化与计算