Java中向上转型与向下转型
面向对象的三大特征:封装、继承、多态
在讲多态前先了解一些关于继承的Java基础知识:
*继承:就是一个类(该类被称为子类)可以继承另一个类(该类被称为父类)。
*继承“基本”作用是:代码复用。但是继承最“重要”的作用是:有了继承才有了以后“方法的覆盖”和“多态机制”。
*java语言当中的继承只支持单继承【一个类只允许继承一个父类】
*在一个子类被创建的时候,内存中首先会加载父类,然后在父类对象外部放上子类特有的属性,两者构成一个子类对象,子类虽然可以继承父类中所有的属性和方法【!!!包括private修饰的属性和方法】,但是子类也只是拥有父类中使用private修饰符修饰的属性和方法,
却不能直接使用它。但是父类往往会提供对外开放的接口,供子类访问这些private修饰的属性和方法(比如:getter和setter方法)。同时子类可以对继承的方法进行重写(@override),并且也可以拥有自己独有的方法。
一、向上转型:多态
如何理解多态?
->实现代码的通用性
->比如:Object类中定义的public void equals(Object obj){ }
往往自定义的类在使用 equals()方法时都需要重写,这里就体现了多态
public class Customer {String name;int id;// 下面的equals(Object obj)方法是手动写的,不是系统自动生成的,可能会有不完善的地方,//但是不影响理解多态@Overridepublic boolean equals(Object obj) {// TODO Auto-generated method stubreturn super.equals(obj);if (this == obj) {return true;}if (obj instanceof Customer) {Customer customer = (Customer) obj;// 比较,两个对象的每个属性是否都相同return this.id == customer.id && this.name.equals(customer.name);}return false;}
}
//创建Customer对象
Customer cust1 = new Customer("wjk", 1002);Customer cust2 = new Customer("wjk", 1002);
//使用equals()判断这两个对象是否相等
System.out.println(cust1.equals(cust2));
说明:上面的传入的cust2就使用了多态的思想,传给形参的是Object的子类(Customer)类型的对象
->JDBC:使用java程序操作(获取数据库连接、CRUD)数据库也使用到了向上转型知识
【数据库都有哪些?MySql、Oracle、DB2、SQL、Server】
->抽象类、接口的使用一定体现了多态性(因为抽象类、接口不能实例化】)
下面再举一个简单的上转型的例子:
class Animal {public void move() {System.out.println("动物会移动");}
}
class Cat extends Animal {public void move() {System.out.println("小猫会捉老鼠");}public void craw(){System.out.println("小猫会捉老鼠");}
}
public static void main(String[] args){
Animal a1=new Cat();
a1.move();//小猫会捉老鼠// a1.craw();//编译失败}
说明:
* 1、Java程序永远都分为编译阶段和运行阶段
*
* 2、先分析编译阶段,再分析运行阶段,编译无法通过,根本是无法运行的
*
* 3、编译阶段编译器检查a1这个引用的数据类型为Animal.这个过程我们称为静态绑定【编译阶段绑定】
* 只有绑定成功之后才有后续的运行
*
* 4、在程序运行阶段,JVM堆内存当中真实创建的对象是Cat对象,那么以下程序在运行阶段一定会调用Cat对象的move()方法,
* 此时发生了程序的动态绑定,运行阶段绑定
*
* 5、无论是Cat类有没有重写move()方法,运行阶段一定调用的是Cat对象的move()方法,因为底层真实对象就是Cat对象
*
* 6、父类型引用指向子类型对象这种机制导致程序在编译阶段绑定和运行阶段绑定两种不同的形态/状态,
* 这种机制可以称为一种多态语法机制
*/
二、向下转型
1、为什么使用向下转型:有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于声明变量为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特有属性和方法不能调用。那么如何才能调用子类特有的属性和方法? -->使用向下转型
2、如何实现向下转型:
使用强制类型转换符()
3、使用时的注意事项:
->使用强转时可能出现java.lang.ClassCastException异常。
->怎么避免向下转型出现的ava.lang.ClassCastException呢?
* 使用instanceof运算符可以避免出现以上的异常
* instanceof运算符怎么用?a instacneof A:判断a是否是A类的实例
>如果返回true就进行向下转型。如果返回false,不进行向下转型
>要求a所属的类与类A必须时子类和父类的关系,否则编译阶段就会报错
class Animal{public void move(){}
}class Cat extends Animal {public void move(){}public void catchMouse() {System.out.println("小猫会捉老鼠");} class Bird extends Animal {public void move(){}public void fly() {System.out.println("鸟儿会飞翔");}
}
Animal a= new Bird(); if(a instanceof Cat) {//下转型Cat c = (Cat)a;//调用子类中特有的方法,才需要进行强制类型转换c.catchMouse();}else if (a instanceof Bird) {//调用子类中特有的方法,才需要进行强制类型转换Bird b=(Bird)a;b.fly();}
4、Java规范中要求:在进行强制类型转换之前,建议采用instanceof运算符进行判断,避免出现ClassCastException异常。
软件开发很重要的一点:
降低程序的耦合度【低耦合】,提高程序的扩展力
Java中向上转型与向下转型相关推荐
- Java中的向上转型及向下转型
我们都知道Java的三大特性:封装.继承.多态. Java中的向上转型及向下转型体现了Java中的继承性及多态性,所谓继承,不难理解,存在于子父类间,子类继承父类中不被私有化的属性和方法.而多态性,顾 ...
- JAVA中的向上转型和向下转型
一.向上转型和向下转型 向上转型和向下转型是在JAVA继承操作中用到的东西,在讲到转型之前我们需要认识到继承过程中的对象类型转换,这种转换有两个特点: 1.这是继承过程中发生 ...
- java中向上转型和向下转型浅析
基础概念 向上转型就是子类对象被父类引用,例如动物和小鸟的关系,小鸟属于动物,动物不仅仅只包含小鸟,还包含猫和狗等,例如: Animal birdAnimal = new Bird();这种方式就是 ...
- 【Java挠头】继承、抽象、接口、多态、向上转型、向下转型等精妙干货
–本文摘要– 1.本文的目标读者:是了解Java基础,且对面向对象概念有所了解,但是对Java中继承.抽象类.接口.多态等等概念搞不清的初学者. 2.本文的内容摘要:讲述Java中的一 ...
- 重新精读《Java 编程思想》系列之向上转型与向下转型
前言 今天重读了一下向上转型与向下转型,有些新的体会,了解了向上转型的好处,及如何向下转型.在此分享给大家. 向上转型 向上转型是用来表现新类和基类之间的关系.在传统中,由导出类转型成基类,在继承图中 ...
- 第三次学JAVA再学不好就吃翔(part35)--多态向上转型和向下转型
学习笔记,仅供参考 文章目录 面向对象 多态 多态向上转型和向下转型 多态的好处和弊端 面向对象 多态 多态向上转型和向下转型 我们首先通过以下代码复习一下自动类型提升和强制类型转换: class B ...
- Java转型(向上转型和向下转型)
在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型. 5.13.1 向上转型 我们在现实中常常这样说:这个人会唱歌.在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就 ...
- [JAVA]向上转型与向下转型
要理解多态性,首先要知道什么是"向上转型"."向下转型". 对象的多态性:父子类对象的转换 **向上转型:**子类对象变为父类对象,语法: 父类 父类对象 = ...
- java 对象向上转型_JAVA对象向上转型和向下转型
今天做了一个测试的题目,发现自己还是很多问题没有静下心来做.很多问题是可以自己解决的但是自己一是没有读清题意,二是自己心里太急躁了.所以这个要自己应以为鉴! 对象的转型问题其实并不复杂,我们记住一句话 ...
- java 向下转型运行时错误_Java向上转型和向下转型
首先定义父类Animal,所有动物都有一个吃东西的方法:子类Dog还增加了一个叫的功能. public classAnimal {public voideat() { System.out.print ...
最新文章
- McCabe度量法计算程序的环路复杂性
- Python 进阶_闭包 amp; 装饰器
- 静态链接库与动态链接库的优缺点
- 02 基本序列以及序列表示
- 《每日一题》62. Unique Paths 不同路径
- mysql安装版安装
- Css3 display用法
- editor does not contain a main type的解决方案
- 基于jquery的tab切换
- react怎么引入jquery_在react里面使用jquery插件
- sql 随机函数newid()
- 关于软件实施经验分享
- 工业相机 - - 线阵相机
- 米勒拉宾算法——素性测试
- oracle recover database,recover database until cancel和 recover database区别
- Apollo搭建使用
- 如何批量将png格式改成jpg?
- 最强TI蓝牙5.0方案CC2652R芯片模块
- 书呆子rico_书呆子父母指南:何时以及如何向您的孩子介绍《星球大战》
- 武侠小说阅读记录 2009-02-18 21:14