Java引用变量有两个类型:编译时类型和运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。

若编译时类型和运行时类型不一致,就出现多态

正常的方法调用(本态调用)

Person e = new Person();
e.say();
Student e = new Student();
e.say;

虚拟方法调用(多态情况下)

Person e = new Student();
e.say(); // 调用Student类的say()方法

编译时类型和运行时类型

编译时e为Person类型,而方法的调用是在运行时确定的,所以调用的是Student类的say()方法。——动态绑定

在虚拟方法调用情况下,方法看重写后的,但属性没有重写一说,e.name为Person中的name。

引用类型之间的类型转换(对象的多态)

前提:父子关系

一、向上转型

本质:父类的引用指向了子类的对象

语法:

父类类型 引用名 = new 子类类型();

特点:

编译看左边,运行看右边
可以调用父类类型中的所有成员,不能调用子类类型中特有成员;最终运行效果看子类的具体实现!

二、向下转型

语法:

子类类型 引用名 = (子类类型)父类引用;

特点:

① 只能强转父类的引用,不能强转父类的对象
② 要求父类的引用必须指向的是当前目标类型的对象(已经指向子类类型的)
③ 可以调用子类类型中所有的成员

示例:

public class TestPoly {

    public static void main(String[] args) {

        //子类——>父类
// 向上转型(自动类型转换):小——>大
Animal a =new Cat();
//可以调用哪些成员
a.eat();
a.run();
a.age=10;
a.name="";
a.method();
// a.climb(); // 向下转型(强制类型转换)
Cat c = (Cat) a;
// Cat c2 = (Cat)(new Animal()); // 报错,必须是父类的引用 // Animal b = new Pig();
// Cat c3 = (Cat)b;         // 可能不报错,但实际应用内部不是Pig
//可以调用哪些成员?
c.run();
c.eat();
c.climb();
c.method();
c.name="";
c.age=1;
c.color="";
}
} class Animal{
String name;
int age;
public void eat(){
System.out.println("动物的吃");
}
public void run(){
System.out.println("动物的跑");
}
public void method(){
System.out.println("method");
}
} class Pig extends Animal{ }
class Cat extends Animal{
String color; public void run(){
System.out.println("猫飞快的跑");
} public void climb(){
System.out.println("猫爬树");
}
}

instanceof 判断对象所属类

x instanceof A:检验x是否为类A的对象,返回值为boolean型。

要求x所属的类与类A必须是子类和父类的关系,否则编译错误。

如果x属于类A的子类B,x instanceof A值也为true。

public class Person extends Object {…}
public class Student extends Person {…}
public class Graduate extends Person {…}
-------------------------------------------------------------------
public void method1(Person e) {
if (e instanceof Person)
// 处理Person类及其子类对象
if (e instanceof Student)
//处理Student类及其子类对象
if (e instanceof Graduate)
//处理Graduate类及其子类对象
}

Java对象多态性——对象的转型(引用类型之间的类型转换)的更多相关文章

  1. 关于Java中的对象、类、抽象类、接口、继承之间的联系

    关于Java中的对象.类.抽象类.接口.继承之间的联系: 导读: 寒假学习JavaSE基础,其中的概念属实比较多,关联性也比较大,再次将相关的知识点复习一些,并理顺其中的关系. 正文: 举个例子:如果 ...

  2. 菜鸡的Java笔记 第二十二 - java 对象多态性

    本次只是围绕着多态性的概念来进行讲解,但是所讲解的代码与实际的开发几乎没有关系,而且多态一定是在继承性的基础上才可以操作的,        而本次将使用类继承的关系来描述多态的性质,实际的开发中不会出 ...

  3. java类和对象之间的差

    java类和对象之间的差别是一个普遍的问题,刚开始学习java当它来到与类和对象接触.今天就来总结一下它们之间的差异. 先说说class和object差异.事实上,词:object是全部class的父 ...

  4. JAVA中JavaBean对象之间拷贝的方法

    JAVA中JavaBean对象之间的拷贝通常是用get/set方法,但如果你有两个属性相同的JavaBean或有大部分属性相同的JavaBean,有个更简便的方法,他们之间的拷贝可以通过copyPro ...

  5. java入门之——对象转型

    对象的类型转换是我们在编程的时候常常会遇到的,java平台也是如此.比方一些基本类型的数据转型和复合数据的转换. 举例 java语言中主要分为向上转型和向下转型,怎样来了解和掌握这两者转型的关系呢?首 ...

  6. java四种对象引用类型

    java四种对象引用类型 对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序 ...

  7. JAVA中JavaBean对象之间属性拷贝的方法

    JAVA中JavaBean对象之间的拷贝通常是用get/set方法,但如果你有两个属性相同的JavaBean或有大部分属性相同的JavaBean,对于这种情况,可以采用以下几个简便方法处理. 下面对这 ...

  8. JAVA类和对象创建

    面向对象 学习目标: 理解面向对象的编程思想 理解类与对象的关系 如何创建类与对象 方法重载 一:什么是面向对象编程(OOP) 面向对象编程(Object Oriented Programming,O ...

  9. 【JAVA】 02-Java对象细节

    链接: 笔记目录:毕向东Java基础视频教程-笔记 GitHub库:JavaBXD33 目录: <> <> 内容待整理: 面向过程: 代表语言-c:即通过函数体现,并不断调用函 ...

随机推荐

  1. GUI学习之二十五——QFontDialog学习总结

    今天学习字体对话框——QFontDialog()控件. QFontDialog()是继承自QDialog()的一个子类,用来选择给定的字体(包括字体.字号.样式等) 一.构造函数 QFontDialo ...

  2. 【洛谷P2398】GCD SUM

    题目大意:求 \[\sum\limits_{i=1}^n\sum\limits_{j=1}^ngcd(i,j)\] 题解: 最重要的一步变换在于. \[\sum\limits_{k=1}^n k \s ...

  3. 【牛客Wannafly挑战赛23】F 计数

    题目链接 题意 给定一张边带权的无向图,求生成树的权值和是 k 的倍数的生成树个数模 p 的值. \(n\leq 100,k\leq 100,p\mod k=1\) Sol 看见整除然后 \(p\mo ...

  4. hihocode 1584 : Bounce (找规律)(2017 北京网络赛G)

    题目链接 比赛时随便找了个规律,然后队友过了.不过那个规律具体细节还挺烦的.刚刚偶然看到Q巨在群里提到的他的一个思路,妙啊,很好理解,而且公式写起来也容易.OrzQ巨 #include<bits ...

  5. handy源码阅读(六):udp类

    分为UdpServer类和UdpConn类. struct UdpServer : public std::enable_shared_from_this<UdpServer>, priv ...

  6. IntelliJ IDEA VM options(转)

    Custom IntelliJ IDEA VM options # Custom IntelliJ IDEA VM options ##################JVM模式########### ...

  7. 【CF1252F】Regular Forestation(重心,树同构)

    题意:给定一棵n个点的树,问删去某个点之后所有的树同构,这样分割出来的树最多能有几棵 n<=4000 思路:分割成至少两个size相等的联通块之后size必定小于n/2,与树的重心的定义相同 预 ...

  8. AI移动,缓慢转身设置(针对AI Character)

    AICharacter自身: Use Controller Rotation Yaw设为False Auto Possess AI 设为 Placed in World or Spawned Char ...

  9. org.xml.sax.SAXParseException: 元素类型 "input" 必须由匹配的结束标记 "</input>" 终止。

    错误记录 Spring Boot推荐使用thymeleaf作为视图,按照SpringBoot实战一书的案例写Demo. 发生错误: org.xml.sax.SAXParseException: 元素类 ...

  10. Broken pipe

    出现broken pipe 的一种情况是向socket写数据,但是对端已经关闭socket连接,此时会触发SIGPIPE信号,该信号可以捕获. signal(SIGPIPE, SIG_IGN);