Polymorphism[多态]
简述:
面向对象多态性指的是:发送消息给某个对象,让该对象自行决定响应何种行为。
通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用
多态的三个前提条件:
- 多态发生在有继承关系的类之间
- 子类要对超类方法进行重写
- 父类引用指向子类对象
要了解多态,先了解casting(对象转型)的概念。
Casting[对象转型]
1.基类的引用类型变量可以是指向子类的对象。
2.一个基类引用不能访问子类对象新增加的成员(属性和方法)
3.可以使用引用变量instaceof来判断该引用类型变量所“指向”的对象是否属于该类,或者该类的子类。
4. 子类对象可以作为基类对象使用,称为(upcasting)“向上转型”,反之,基类对象当做来使用称为(downcasting)“强制转换”。
实例
我们创建两个类,并且有继承关系,一个Animal类和Cat类
class Animal{
//每种动物都有名字
public String name;
//对应初始化方法
Animal(String name){
this.name=name;
}
}
class Cat extends Animal{
//猫眼睛的颜色
public String eyesColor;
//对应初始化
Cat(String name,String eyesColor){
super(name);
this.eyesColor=eyesColor;
}
}
然后我们在验证
"1.基类的引用类型变量可以是指向子类的对象"
public class Casting{
public static void main(String[] args){
System.out.println("-------------------------------");
//创建Animal引用
Animal coco=null;
//把子类对象赋给父类引用
coco=new Cat("mimi","black");//编译通过没问题
}
继续验证 "2.一个基类引用不能访问子类对象新增加的成员(属性和方法)
"
我们把两个类增加方法
class Animal{
//每种动物都有名字
public String name;
//对应初始化方法
Animal(String name){
this.name=name;
}
//动物叫声
public void say(){
System.out.println("name: "+name);
}
}
//猫
class Cat extends Animal{
//猫眼睛的颜色
public String eyesColor;
//对应初始化
Cat(String name,String eyesColor){
super(name);
this.eyesColor=eyesColor;
}
public void miaow(){
System.out.println("猫叫");
}
}
我们用coco对象分别访问父类和子类的成员和方法
//coco调用Cat中所有的成员
coco.name="mici";//可以访问子类继承到的name变量
System.out.println(coco.name);//输出mici
//coco.eyesColor="blue";
/*编译输出:cannot find symbol
说明父类引用看不到子类对象的成员,只能用父类Animal的视野看,
那就只能看见name咯
*/
coco.say();//编译运行没问题
//coco.miaow();
/*编译输出:cannot find symbol
同样是编译出错找不到成员,所以向上转型父类引用只能看见自己传下去的东西咯
*/
先面我们來用instanceof 来测试
首先
instanceof
instanceof是Java、php的一个二元操作符(运算符),和==,>,<是同一类东西。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是判断其左边对象是否为其右边类的实例,返回boolean类型的数据。可以用在继承中的子类的实例是否为父类的实现。
应用于上面的例子
全部代码,做了修改
//Have the courage to follow your heart and intuition.
//对象转型。向上转型
//1.基类引用可以指向子类引用
//2.基类引用不能访问子类新增加的成员(方法属性)
//3.可以用 instanceof判断引用类型是不是这个类或者子类
package me.animal;
class Animal{
//每种动物都有名字
public String name;
//对应初始化方法
Animal(String name){
this.name=name;
}
//动物叫声
public void say(Animal any){
System.out.println("name: "+any.name);
//判断是什么类型猫啊狗啊,然后调用子类相应的成员
if(any instanceof Cat){
Cat cat=(Cat)any;
System.out.println(" "+cat.eyesColor+" eyes");
}
else if(any instanceof Dog){
Dog dog=(Dog)any;
System.out.println(" "+dog.furColor+" fur");
}
}
}
//猫
class Cat extends Animal{
//猫眼睛的颜色
public String eyesColor;
//对应初始化
Cat(String name,String eyesColor){
super(name);
this.eyesColor=eyesColor;
}
public void miaow(){
System.out.println("猫叫");
}
}
//狗
class Dog extends Animal{
//狗毛的颜色
public String furColor;
//对应初始化
Dog(String name,String furColor){
super(name);
this.furColor=furColor;
}
//狗叫的方法
public void bark(){
System.out.println("狗叫了...");
}
}
public class Casting{
public static void main(String[] args){
System.out.println("-------------------------------");
//创建Animal引用
Animal coco=null;
//把子类对象赋给父类引用
coco=new Cat("mimi","black");//编译通过没问题
//coco调用Cat中所有的成员
coco.name="mici";//可以访问子类继承到的name变量
System.out.println(coco.name);//输出mici
coco.say();//编译运行没问题
//coco.eyesColor="blue";
/*编译输出:cannot find symbol
说明父类引用看不到子类对象的成员,只能用父类Animal的视野看,
那就只能看见name咯
*/
//coco.miaow();
/*编译输出:cannot find symbol
同样是编译出错找不倒成员,所以向上转型父类引用只能看见自己传下去的东西咯
*/
coco.
//创建猫狗对象
System.out.println("-------------------------------");
Cat nina=new Cat("nina","blue");
Dog hasx=new Dog("hasx","black");
Animal yoyo=new Animal("yoyo");
//用instanceof判断是不是对象属于类型
System.out.println("-------------------------------");
System.out.println("nina instanceof Cat = "+(nina instanceof Cat));//ture
System.out.println("nina instanceof Animal = "+(nina instanceof Animal));//true
//System.out.println("hasx instanceof Cat = "+(hasx instanceof Cat));
/* 这样编译错误:inconvertible types
使用instanceof 前提必须要有继承关系,
*/
System.out.println("-------------------------------");
System.out.println("hasx instanceof Dog = "+(hasx instanceof Dog));//true
System.out.println("hasx instanceof Animal = "+(hasx instanceof Animal));//true
//动物引用yoyo 判断关系
System.out.println("yoyo instanceof Animal = "+(yoyo instanceof Animal));//true
System.out.println("yoyo instanceof Cat = "+(yoyo instanceof Cat));//false
System.out.println("yoyo instanceof Dog = "+(yoyo instanceof Dog));//false
System.out.println("coco instanceof Animal = "+(coco instanceof Animal));//true
System.out.println("coco instanceof Cat = "+(coco instanceof Cat));//false
System.out.println("coco instanceof Dog = "+(coco instanceof Dog));//false
/*这行编译没错而且可以运行,因为引用类型coco是Animal,还是与Dog有继承关系*/
System.out.println("-------------------------------");
//向下转型,
Cat my=(Cat)coco;
//my引用类型是猫,猫的成员当然可以访问咯
System.out.println(my.eyesColor);
my.miaow();
//调用Animal创建的方法,可扩展行增强了
System.out.println("-------------------------------");
coco.say(coco);
coco.say(nina);
coco.say(hasx);
coco.say(yoyo);
System.out.println("-------------------------------");
}
多态实例
经过上面对对象转型的认识,可以编写测试多态的代码
//一.多态测试
//多态三个条件:1.有继承 2.有重写 3.父类引用指向子类对象
package me.polymoph;
//二.抽象方法就是用来重写的,1.继承下来的子类必须重写 2.抽象类不能不能new。3.
//Final 1.Final的变量值不能改变 2.Final 的方法不能重写 3.Final的方法不能被继承
abstract class Animal{
//~ public void enjoy(){
//~ //动物高兴了叫
//~ System.out.println("我叫叫叫~~");
//~ }
//抽象类改写
abstract void enjoy();
}
//子类
class Dog extends Animal{
//狗高兴不一定叫,我狗跳墙,复写方法
public void enjoy(){
System.out.println("我狗跳墙");
}
}
class Cat extends Animal{
//猫高兴了,走猫步,复写方法
public void enjoy(){
System.out.println("我走猫步");
}
}
class Wolf extends Animal{
//狼高兴了,我吃兔子
public void enjoy(){
System.out.println("我吃兔子");
}
}
//然后测试类
public class Polymoph{
public static void main(String[] args){
//创建动物对象,超类引用,赋予之类对象
Animal coco=new Dog();
//
coco.enjoy();
coco=new Cat();
coco.enjoy();
coco=new Wolf();
coco.enjoy();
/*输出:
我狗跳墙
我走猫步
我吃兔子
*///输出的是子类的方法
}
}
作者:YangGan
出处:http://blog.csdn.net/incyanggan
本文基于署名
2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名Yanggan(包含链接).
分享到:
相关推荐
Java中的多态性是面向对象编程的一个核心特性,它允许我们设计更加灵活和可扩展的代码。在Java中,多态性(Polymorphism)主要体现在两个方面:方法的重写(Overriding)和接口的实现(Interface Implementation)。...
在Java学习的过程中,初学者应该重视基础概念的理解,包括数据类型、控制结构、类和对象的定义以及使用,逐步深入到封装、继承和多态的实践应用。通过编写简单的程序,实践面向对象的设计原则,可以更好地掌握Java...
Educoder题目:Java面向对象 - 封装、继承和多态答案解析
### Java面向对象编程中的多态性详解 #### 一、面向对象编程概述 在Java语言中,面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它通过将程序分解为一系列相互作用的对象来组织代码。这种方式...
Java ------ 多态作业
Java基础教学 - 面向对象(4)- 多态 在本文中,我们将讨论Java语言中的一种重要概念 —— 多态(Polymorphism)。多态是面向对象编程(OOP)中的一个核心概念,它允许我们编写更加灵活和可扩展的代码。 一、多态...
Educoder题目:Java面向对象 - 封装、继承和多态的综合练习答案解析
根据给定文件的信息,我们可以总结出以下几个面向对象的基础知识点,并结合具体的题目来进行解析: ### 面向对象基础知识概述 面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它将数据和处理...
面向对象的基本特征三:多态的理解(java) * 多态:多种形态 * * 变量的引用形式: * (1)本态引用:左边的变量与右边的对象是同一种类型 * (2)多态引用:左边的变量是父类类型,右边的对象是子类的对象 ...
JAVA面向对象---多态(完结)
* 多态是面向对象中的一大特征 * 多态的发生前提:必须有继承或实现关系、有方法的重写、父类引用指向子类的对象 * 多态可以分为两种形式:方法多态和成员变量多态 Java 中的 final 关键字: * final 关键字可以...
面向对象编程是Java的核心特性,其中封装、继承和多态是三大基石。在这个主题中,我们将专注于"多态"这一特性,它是Java编程灵活性和可扩展性的重要体现。 多态(Polymorphism)在希腊语中意为“多种形态”,在编程...
C#面向对象编程-多态习题[整理].pdf
java面向对象三要素封装继承和多态源码java面向对象三要素封装继承和多态源码java面向对象三要素封装继承和多态源码java面向对象三要素封装继承和多态源码java面向对象三要素封装继承和多态源码java面向对象三要素...
面向对象编程(Object-Oriented Programming,OOP)是Java的核心理念,它基于类和对象的概念,提供了封装、继承和多态等特性,使得代码更加模块化,易于理解和维护。 在Java中,面向对象主要包含以下关键概念: 1....
计算机后端-Java-Java核心基础-第14章 面向对象06 07. 多态练习:调用方法和属性.avi
### Java面向对象编程——多态性详解 #### 一、多态的概念 多态是面向对象编程中的一个重要特性,它允许我们使用一个通用的方式处理不同的数据类型。在Java中,多态主要通过接口和继承机制来实现。多态使得代码更加...
多态是Java面向对象设计的重要特性,它提供了代码的复用性和灵活性。通过多态,我们可以设计出更加通用的代码,同时保持良好的扩展性。在实际开发中,多态广泛应用于各种场景,如集合框架中的泛型、设计模式等。理解...
Java是一种广泛使用的面向对象的编程语言,其设计目标是具有高度的可移植性、健壮性和安全性。在Java中,多态性(Polymorphism)是面向对象编程的三大特性之一,另外两个是封装和继承。多态性使得代码更加灵活,能够...