没有合适的资源?快使用搜索试试~ 我知道了~
Java面向对象(进阶)- 面向对象特征之三:多态性
需积分: 5 0 下载量 92 浏览量
2023-11-11
20:43:28
上传
评论
收藏 3.66MB PDF 举报
温馨提示
试读
63页
Java面向对象(进阶)-- 面向对象特征之三:多态性
资源推荐
资源详情
资源评论
一、多态的形式和体现
(1)为什么需要多态性(polymorphism)?
(2) 对象的多态性
二、 多态的理解
(1)如何理解多态性
(2)Java中多态性的体现
(3)多态性的应用
(4)虚方法调用
(5)多态的使用注意事项
(6)举例
(7)多态的好处和弊端
1、好处
举例1
举例2
2、弊端
(8)成员变量没有多态性
三、向上转型与向下转型
(1)为什么要类型转换
(2) 如何向上或向下转型
(3) instanceof关键字
四、 练习
(1)练习1
(2)练习2
(3)练习3
(4)练习4
五、面试题
(1)题目1
(2)题目2
一千个读者眼中有一千个哈姆雷特。--多种形态
一、多态的形式和体现
(1)为什么需要多态性(polymorphism)?
开发中,有时我们在设计一个数组、或一个成员变量、或一个方法的形参、返回值类型时,无法确
定它具体的类型,只能确定它是某个系列的类型。
案例:
(1)声明一个Dog类,包含public void eat()方法,输出“狗啃骨头”
(2)声明一个Cat类,包含public void eat()方法,输出“猫吃鱼仔”
(3)声明一个Person类,功能如下:
包含宠物属性
包含领养宠物方法 public void adopt(宠物类型Pet)
包含喂宠物吃东西的方法 public void feed(),实现为调用宠物对象.eat()方法
(2) 对象的多态性
多态性,是面向对象中最重要的概念,在Java中的体现:
对象的多态性:父类的引用指向子类的对象
格式:(父类类型:指子类继承的父类类型,或者实现的接口类型)
举例:
public class Dog {
public void eat(){
System.out.println("狗啃骨头");
}
}
public class Cat {
public void eat(){
System.out.println("猫吃鱼仔");
}
}
public class Person {
private Dog dog;
//adopt:领养
public void adopt(Dog dog){
this.dog = dog;
}
//feed:喂食
public void feed(){
if(dog != null){
dog.eat();
}
}
/*
问题:
1、从养狗切换到养猫怎么办?
修改代码把Dog修改为养猫?
2、或者有的人养狗,有的人养猫怎么办?
3、要是还有更多其他宠物类型怎么办?
如果Java不支持多态,那么上面的问题将会非常麻烦,代码维护起来很难,扩展性很差。
*/
}
父类类型 变量名 = 子类对象;
对象的多态:在Java中,子类的对象可以替代父类的对象使用。所以,一个引用类型变量可能指向
(引用)多种不同类型的对象
二、 多态的理解
(1)如何理解多态性
理解:理解为一个事物的多种形态。
生活举例:
女朋友:我想养一个宠物。(若将宠物看作变量类型,真正赋的值是一个具体的宠物,它有多
种)
孩子:我想要一个玩具。(最终的玩具有很多种,不确定)
老板:张秘书,安排一个技术科的同事,跟我一起下周出差。(最终的技术科同事有很多,不
确定)
(2)Java中多态性的体现
Java代码层面多态性:比如需要一个人,现在声明就是一个Person,但是实际上给这个Person赋值
的时候,new的不是Person,而是Person子类的一个对象。
举例:
父类【Person.java】
子类【Man.java】
Person p = new Student();
Object o = new Person();//Object类型的变量o,指向Person类型的对象
o = new Student(); //Object类型的变量o,指向Student类型的对象
package yuyi06;
public class Person {
//属性
String name;
int age;
//方法
public void eat(){
System.out.println("人要吃饭");
}
public void walk(){
System.out.println("人要走路");
}
}
子类【Woman.java】
测试类【PersonTest.java】
package yuyi06;
public class Man extends Person {
//属性
boolean isSmoking;
//方法
//重写
public void eat(){
System.out.println("男人吃饭不要挑食");
}
public void walk(){
System.out.println("男人走路要端正");
}
public void earnMoney(){
System.out.println("男人要挣钱养家糊口");
}
}
package yuyi06;
public class Woman extends Person{
//属性
boolean isBeauty;
//方法
//重写
public void eat(){
System.out.println("女人吃饭要根据自己喜好");
}
public void walk(){
System.out.println("女人走路很有特色");
}
public void goShopping(){
System.out.println("女人喜欢逛街");
}
}
子类对象的多态性:父类的引用指向子类的对象。(或子类的对象赋给父类的引用)
比如: Person p2 = new Man(); (声明是一个父类的,在new具体对象的时候,拿的是具体子类的
对象)
(3)多态性的应用
Java引用变量有两个类型: 编译时类型 和 运行时类型 。编译时类型由 声明 该变量时使用的类型决
定,运行时类型由 实际赋给该变量的对象 决定。简称:编译时,看左边;运行时,看右边。
若编译时类型和运行时类型不一致,就出现了对象的多态性(Polymorphism)
多态情况下,“看左边”:看的是父类的引用(父类中不具备子类特有的方法)
“看右边”:看的是子类的对象(实际运行的是子类重写父类的方法)
举例:
测试类【PersonTest.java】
上面的代码输出结果?
很明显,p2它new的对象是Man,所以输出就是Man里面重写的方法。如下:
package yuyi06;
public class PersonTest {
public static void main(String[] args) {
//多态性之前
Person p1=new Person(); //声明的是Person,new的也是Person
Man m1=new Man();
//多态性:子类对象的多态性
Person p2=new Man(); //声明的是Person,new的是Man
}
}
package yuyi06;
public class PersonTest {
public static void main(String[] args) {
//多态性之前
Person p1=new Person(); //声明的是Person,new的也是Person
Man m1=new Man();
//多态性:子类对象的多态性
Person p2=new Man(); //声明的是Person,new的是Man
//多态性的应用
p2.eat();
p2.walk();
}
}
剩余62页未读,继续阅读
资源评论
雨翼轻尘
- 粉丝: 6w+
- 资源: 130
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功