第二节 引用变量的强制类型转换

什么是多态

主讲人:王少华       QQ群号:483773664

学习目标:

1)父类与子类间转换:向上转型

2)使用父类作为方法形参实现多态

3)使用父类作为返回值实现多态

一、子类到父类的转换(向上转型)

(一)基本数据之间的类型转换

1.自动进行类型转换

//将int型常量或变量的值赋给double型变量,可以自动进行类型转换

int i = 5;

double dl = i;

2.强制类型的转换

类型转换运算符是小括号,类型转换运算符的用法是

(type)variable

//将double型常量或变量的值赋给int型变量,进行强制类型转换

double d2 = 3.14;

int a = (int)
d2;

3.基本数据类型转换注意事项

基本类型之间的转换只能在数值类型之间进行,这里所说的数值类型包括:整数型、字符型和浮点型。但数值类型和布尔类型之间不能进行类型转换。

(二)引用数据类型转型

数据类型转换不但存在于基本数据类型之间,还存在于引用类型之间,但引用数据类型转型存在一些规则

1.引用类型之间的转换只能在具有继承关系的两个类这间进行。

Person person
= new Dog();  //Error

2.将一个父类引用指向一个子类对象,称为向转型(upcasting),自动进行类型转换。

Pet pet
= new Dog();

二、使用父类作为方法形参

用父类作为方法的形参,是Java中实现和使用多态的主要方式之一。

(一)解决给宠物喂食的难题

1.Master

修改Master类,注释feed(Dog dog)和feed(Penguin
penguin)方法,增加唯一的feed(Pet pet)方法,如下所示

public class Master {

private String name = "";//
主人名字

private int money = 0; //
元宝数

/**

* 有参构造方法。

*

* @param name

*主人名字

* @param money

*元宝数

*/

public Master(String name, int money) {

this.name = name;

this.money = money;

}

public void setName(String name)
{

this.name = name;

}

public void setMoney(int money) {

this.money = money;

}

public int getMoney() {

return money;

}

public String getName() {

return name;

}

/**

* 主人给宠物喂食。

*/

public void feed(Pet pet) {

pet.eat();

}

}

2.Test:测试类

public class Test {

public static void main(String[] args) {

Dog dog = new Dog("欧欧", "雪娜瑞");

Penguin pgn = new Penguin("楠楠", "Q妹");

dog.setHealth(80); // 设置健康值,以便正常喂食

pgn.setHealth(80); // 设置健康值,以便正常喂食

Master master = new Master("王先生", 100);

master.feed(dog);// 主人给狗狗喂食

master.feed(pgn);// 主人给企鹅喂食

}

}

备注:

1)向上转型的规则:通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法;

2)使用多态的好处:减少代码量,提高代码的可扩展性。

3.验证:多态的扩展性

增加宠物Cat类,继承Pet类并重写eat()y方法

public class Cat extends Pet{

private String color;//颜色

public Cat(String name, String color) {

super(name);

this.color = color;

}

public void setColor(String
color) {

this.color = color;

}

public String getColor() {

return color;

}

/**

*  实现吃饭方法

*/

public void eat() {

if(getHealth()>=100){

System.out.println("狗狗"+this.getName() +"吃饱了,不需要喂食了!");

}else{

this.setHealth(this.getHealth()+4);

System.out.println("猫咪"+this.getName() + "吃饱啦!体力增加4。");

}

}

}

4.Test:添加领养和喂食猫的语句

public class Test {

public static void main(String[] args) {

Dog dog = new Dog("欧欧", "雪娜瑞");

Penguin pgn = new Penguin("楠楠", "Q妹");

Cat cat = new
Cat("Tomcat", "
黄色");

dog.setHealth(80); // 设置健康值,以便正常喂食

pgn.setHealth(80); // 设置健康值,以便正常喂食

cat.setHealth(80); //
设置健康值,以便正常喂食

Master master = new Master("王先生", 100);

master.feed(dog);// 主人给狗狗喂食

master.feed(pgn);// 主人给企鹅喂食

master.feed(cat);//
主人给猫喂食

}

}

(二)父类调用子类特有方法

1.需求:

假设主要可以同时给狗和企鹅喂食,但只能和狗玩飞盘游戏,只能和企鹅玩游泳游戏。

1)给Penguin类添加swim方法

2.实现:

给Dog类添加catchingFlyDisc()

public void catchingFlyDisc(){

if(super.getLove()>=100){

super.setLove(100);

}else {

super.setLove(super.getLove()+10);

}

}

在测试类中,通过Pet调用Dog类中的cathingFlyDisc

3.原因及结论

因为主人类只晓得它是一个宠物,而不知道它是狗还是企鹅,所以主人不知道应该跟这个宠物玩什么游戏。因此,在多态中,通过父类引用变量无法调用子类特有的方法

三、使用父类作为方法返回值

使用父类作为方法的返回值,是Java中实现和使用多态的另一种方式。

(一)需求

以使用父类作为方法返回值的方式,来实现主人领养宠物的功能

1)给Master类添加getPet(String typeId)方法,实现领养功能

2)创建测试类,根据主人选择宠物的类型编号来领养宠物

3)调用给宠物喂食,测试是否正确领养

(二)实现

1.Master

修改Master类添加getPet(String typeId)方法,以父类Pet作为方法返回值。

/**

* 主人领养宠物

* @param typeId 宠物编号

* @return

*/

public Pet getPet(int typeId){

Pet pet=null;

if(typeId==1){

pet= new Dog("欧欧", "雪娜瑞");

}elseif(typeId==2){

pet  = new Penguin("楠楠", "Q妹");

}

return pet;

}

2.Test

在Test类中,添加领养信息

public class Test {

public static void main(String[] args) {

Master master = new Master("王先生", 100);

Scanner input = new Scanner(System.in);

System.out.println("欢迎您来到宠物店!");

System.out.print("请选择要领养的宠物类型:(1、狗狗 2、企鹅)");

int typeId = input.nextInt();

Pet pet = master.getPet(typeId);

if (pet != null) {

System.out.println("领养成功!");

pet.setHealth(80); //设置健康值,以便正常喂食

master.feed(pet);

} else {

System.out.println("对不起,没有此类型的宠物,领养失败");

}

}

}

四、总结

(一)实现多态的条件

通过以上示例对多态功能的详解,总结实现多态的3个条件

1)继承的存在,继承是多态的基础,没有继承就没有多态

2)子类重写父类方法,多态下调用子类重写后的方法;

3)父类引用变量指向子类对象,不能调用子类对象特有的方法

(二)多态中的方法

1)通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法

2)通过父类引用变量无法调用子类特有的方法

来自为知笔记(Wiz)

时间: 04-13

第二节 引用变量的强制类型转换的相关文章

instanceof运算符与引用变量的强制类型转换

一.instanceof运算符 instanceof是Java语言中的一个二元运算符,它的作用是判断一个引用类型的变量所指向的对象是否是一个类(或接口.抽象类.父类)的实例,即它左边的对象是否是它右边的类的实例该运算符返回boolean类型的数据. 常见的用法为:result=object instanceof class.如果object是clas的一个实例,那么instanceof运算符返回true:如果object不是class的一个实例,或者object是null,那么instanceo

跟王老师学多态(二): 引用变量的强制类型转换

什么是多态 主讲人:王少华       QQ群号:483773664 学习目标: 1)父类与子类间转换:向上转型 2)使用父类作为方法形参实现多态 3)使用父类作为返回值实现多态 一.子类到父类的转换(向上转型) (一)基本数据之间的类型转换 1.自动进行类型转换 1 2 3 //将int型常量或变量的值赋给double型变量,可以自动进行类型转换 int i = 5; double dl = i; 2.强制类型的转换 类型转换运算符是小括号,类型转换运算符的用法是 (type)variable

引用变量的强制转换类型

源代码: public class Java9 { public static void main(String[] args) { Object hello="Hello";//Object类是所有类的父类,Object类和String类存在着继承的关系 System.out.println("字符串是否是Object类的实例"+(hello instanceof Object)); System.out.println("字符串是否是String类的实

JAVA-初步认识-第二章-自动类型提升&强制类型转换

一. 深入理解变量 在之前的讲解中,我们谈论的都是定义不同类型的变量时要注意的问题.这一节中,我们将变量投入运算,探索在运算过程中,应该遵守的规则. 在这里对上一节<变量的基本演示>做一个小结,主要有三点.直接书写数字常量时,系统会给常量一个默认的类型,如int和double,当书写的常量赋值给定义好类型的变量时,就会产生错误.还有就是书写的常量和本身默认的类型起冲突.最后一点就是在书写源程序的过程中,一定要采用英文字符. 二. 变量的运算规则 运算的两端都是相同类型才可以,不然无法进行运算.

003_常量,变量和强制类型转换

1.常量 -整数型 -小数型 -布尔型(true或false) -字符型('') -字符串型("") -null 2.变量(对应内存中一块存储区域)   (1)在Java中,浮点数默认是double类型,整数默认是int类型. (2)定义long和float类型后面要加l或f. 3.类型提升和强制类型转换       (1)不同数值型运算时,内存区域较低的类型会转化为内存区域较大的类型再运算. (2)Java不允许不同类型之间直接赋值,如果非要赋值的话只能强制类型转换,强制取后面低位(

php第二节(变量、常量)

<?php /** * 类型转换 * 自动转换 数据在运算过程中自动转换 * 空字符串 false * "0" false * null false * 0 false * 空数组 false * 1. 转为布尔型(即返回值为0) * 空字符串''或"" * 数字0或0.0 字符'0'或"0" * 空值NULL 没有成员的数组 false ** 其余都转换成布尔型true,包含资源 *2. 转为整数或浮点型 * 如果字符串为合法的数字字符串

《Java开发手册》学习进程之对象引用与接口引用间的赋值和强制类型转换问题

对象引用之间: 子类引用可以赋值给父类引用. 父类引用需要在强制转换之后才能赋值给子类引用. 对于对象引用的强制转换,只要被转换的引用类型与转换后的目标类型之间是派生或被派生的关系,就可以通过编译.如果没有这些关系而去强制转换,则编译报错. 即使编译通过,如果被转换的引用指向的对象类型与转换后的目标类型之间不相符或不兼容(即被转换的引用指向的对象类型不能转换为除自身或者自身父类的其他类型,同下),则运行出错. 接口引用之间: 子接口引用可以赋值给父接口引用. 父接口引用需要在强制类型转换之后才能

java中强制类型转换

在Java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需要强制转换.因为子类拥有比父类更多的属性.更强的功能,所以父类转换为子类需要强制.那么,是不是只要是父类转换为子类就会成功呢?其实不然,他们之间的强制类型转换是有条件的. 当我们用一个类型的构造器构造出一个对象时,这个对象的类型就已经确定的,也就说它的本质是不会再发生变化了.在Java中我们可以通过

JAVA强制类型转换(转载+自己的感想) - stemon

JAVA强制类型转换(转载+自己的感想) - stemon 时间 2013-10-29 15:52:00  博客园-Java原文  http://www.cnblogs.com/stemon/p/3394464.html 首先声明:这篇文章的大部分是转载的,但是又有自己增加的部分,觉得这样才完整.我增加的部分只是自己的个人见解,推荐出来希望能得到大神的指正.再次说明我推荐出来是讨论的,虽然我潜水很久了,我依旧是菜鸟一枚. 在java中强制类型转换分为基本数据类型和 引用数据类型 两种,这里我们讨