方法的多态

1.1什么是多态?

指一个对象在不同时刻拥有不同的形态。

例:猫 cat=new 猫();

​ 动物 animal=new 猫();

多态建立的条件:

  1. 建立在继承的关系上;
  2. 有方法重写;
  3. 有父类的引用指向子类对象(父类引用指向即 动物 animal)

我们通过代码进一步了解多态:

将多态建立的条件加入代码之中

//建立一个父类
public class Animals{
//创建父类方法
public void eat(){
System.out.println("动物在吃东西");
}
}
//建立一个子类
public class Cat extends Animals{//建立继承关系
//方法重写
public void eat(){
System.out.println("猫在吃鱼");
}
}
//建立一个测试类
public class Aplication{
public static void main(String[] args){
//建立父类的引用指向子类对象
Animals a=new Cat();
}
}

以上根据多态的三个前提条件我们建立了多态。

1.2多态中的成员访问特点

多态中的成员访问特点:

成员属性:编译和运行都看左边;

成员方法:编译看左边,运行看右边。

我们通过以下代码对特点进一步的了解:

//建立一个父类
public class Animals{
int age=40;
public void eat(){
System.out.println("动物在吃东西");
}
public void play(){
Sysem,out,println("动物在玩游戏");
}
}
//建立一个子类
public class Cat extends Animals{//建立继承关系
String name="花儿";
int age=5;
public void eat(){
System.out.println("猫在吃鱼");
}
public void shout(){
System.out.println("猫在叫");
} }
//建立一个测试类
public class Aplication{
public static void main(String[] args){
Animals a=new Cat(); //分别调用成员并输出
Sytem.out.println(a.age);
Sytem.out.println(a.name);
Sytem.out.println(a.eat);
Sytem.out.println(a.play);
Sytem.out.println(a.shout);
}
}
//输出结果
40
ClassCastException
猫在吃鱼
动物在玩游戏
ClassCastException

我们来对结果进行分析:

父类中的成员属性有age;子类的成员属性有name、age

我们建立的对象引用是父类的;但对象的实际本质是子类对象

这也就将对象实例化分为了左右,而外界看到的则是左侧的引用类型

所以当我们调用属性、方法时,最开始编译就从左边开始,然后运行右边

引用类型为父类,其成员含有age、eat、play;当我们调用age、eat、play时,我们是能够成功调用的;而调用name(非父类成员)时发现报错

由此我们可以得出第一个结论:

多态现象中,我们可以调用什么成员是由左边的引用类型决定的!

我们从结果发现a.age的结果是父类的属性

由此我们得到第二个结论:

多态现象中,属性的编译和运行都是由左边的引用类型决定的!

我们从输出结果发现我们调用eat方法时,输出的结果却是子类eat方法(重写)的结果;而调用play(未重写)方法时,输出的是父类的play方法;而调用shout方法则无法调用

由此我们可以得出第三个结论:

多态现象中,方法的编译是看左边,运行是看右边!


总结以上结论:

成员属性:编译和运行都看左边;

成员方法:编译看左边,运行看右边。

最新文章

  1. vuejs学习网站推荐
  2. C#编程总结(二)多线程基础
  3. codeforces733-C. Epidemic in Monstropolis 贪心加链表
  4. 解决ssh链接服务器超时自动断开的问题
  5. 数据库中间件mycat简单入门
  6. MySQL 加锁处理分析
  7. Google 宣布支持中文邮箱地址
  8. 开发服务器端——工程配置
  9. linux 设置 jdk环境变量
  10. 把一个select查询结果插入到一个表(可选指定字段和值实例)
  11. Android源代码分析-资源载入机制
  12. JAVA版A星算法实现
  13. 在mysql数据库中创建oracle scott用户的四个表及插入初始化数据
  14. 为什么分库分表使用2的N次方 一个字节用两位16进制
  15. 算法题:给出一组数字,拼接一个最大的值 PHP
  16. MySQL事物管理
  17. JQuery官方学习资料(译):避免与其他库的冲突
  18. python使用requests发送application/x-www-form-urlencoded请求数据
  19. C# 调用打印机 打印 Excel
  20. Codeforces Round #407 div2 题解【ABCDE】

热门文章

  1. HBase原理深入
  2. 跟羽夏学 Ghidra ——导航
  3. WSUS无法发现客户端
  4. Java中的SPI原理浅谈
  5. Mybatis框架搭建
  6. nacos基础知识理解
  7. MySQL集群搭建(4)-MMM+LVS+Keepalived
  8. SpringCloud组件编写Dockerfile文件模板
  9. Node.js(四)json
  10. 线上服务宕机,码农试用期被毕业,原因竟是给MySQL加个字段