Java 多态基础
多态的定义
程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在运行期间才确定。
或者是同一个行为具有多个不同表现形式或形态的能力。
多态的体现
在玩LOL时,W键是技能;而且不同英雄的W的效果是不一样的。
在吃鸡中,W是前进。
在Word中,W就在字母按键。
实现多条的条件
① :必须是存在继承关系父类/子类
② :子类对父类的方法进行重写
③ :父类对象指向子类引用/向上转型
多态的简单示例
/**
* @author qiuling
*/
public class AnimalTest { class Animal {
public void eat (){
System.out.println("动物进食.");
}
} /**
* 多态条件1 发生继承关系
*/
class Bird extends Animal {
/**
* 多态条件2 进行父类方法的重写
*/
@Override
public void eat() {
System.out.println("小鸟吃虫子");
} /**
* 发生向上转型后 只能调用父类存在的属性或方法
* Animal bird = new Bird(); bird.fly()无法进行调用
*/
public void fly (){
System.out.println("一只小鸟飞飞飞");
}
} class Dog extends Animal {
@Override
public void eat() {
System.out.println("小狗吃肉");
}
} public static void main (String[] args){
//多态条件3 父类对象指向子类的引用/向上转型
Animal bird = new AnimalTest().new Bird();
Animal dog = new AnimalTest().new Dog();
bird.eat();
dog.eat();
//要调用子类特有的方法 只能向下转型
((Bird) bird).fly();
}
写博客发现一个蛮有意思的例子
/**
* @author qiuling
*/
public class Test {
class A {
public void show(D obj) {
System.out.println("A and D");
}
public void show(A obj) {
System.out.println("A and A");
}
}
class B extends A{
/**
* 此方法其实是对 本类覆写父类方法的重载
* A a2 = new Test().new B();向上转型后不会调用此方法
* @param obj
*/
public void show(B obj) {
System.out.println("B and B");
}
@Override
public void show(A obj) {
System.out.println("B and A");
}
}
class C extends B{
}
class D extends B{
} public static void main(String[] args){
A a1 = new Test().new A();
A a2 = new Test().new B();
B b =new Test().new B();
C c = new Test().new C();
D d = new Test().new D();
//A and A
a1.show(b);
//A and A
a1.show(c);
//A and D 前三个应该没问题
a1.show(d);
//B and A 向上转型后不会调用show(B obj)
//a2的声明类型为A,方法从A类开始搜索,A类没有show(B obj)的方法
//兼容找到show(A obj),因为a2的实际类型为B类,B类覆写了show(A obj),故是 B and A
a2.show(b);
//B and A
a2.show(c);
//A and D
a2.show(d);
//B and B 继承关系调用方法顺序,从本类到父类
b.show(b);
//B and B
b.show(c);
//A and D
b.show(d);
}
}
参考博文:https://my.oschina.net/langxSpirit/blog/1541074
https://www.cnblogs.com/chenssy/p/3372798.html
Java 多态基础的更多相关文章
- java多态——基础
多态 定义: 一个接口,多种实现,就是多种状态 价值: 特点:多态存在的特点,就是必须要有继承.覆盖.父类变量调用子类对象 场景: 首先检查父类中是否有该方法,如果没有,则编译错误:如果有,则 ...
- 【JAVA零基础入门系列】Day13 Java类的继承与多态
继承是类的一个很重要的特性,什么?你连继承都不知道?你是想气死爸爸好继承爸爸的遗产吗?(滑稽) 开个玩笑,这里的继承跟我们现实生活的中继承还是有很大区别的,一个类可以继承另一个类,继承的内容包括属性跟 ...
- [ Java学习基础 ] Java的继承与多态
看到自己写的东西(4.22的随笔[ Java学习基础 ] Java构造函数)第一次达到阅读100+的成就还是挺欣慰的,感谢大家的支持!希望以后能继续和大家共同学习,共同努力,一起进步!共勉! ---- ...
- Java 多态——与C++的比较
学习了Java和C++之后,由于长期不使用C++,而java的基础知识掌握不牢,现在已经搞不清java多态了.现在先来谈谈java多态,稍后有时间再更新C++的多态,并进行比较~ 一. Java的多态 ...
- C++和java多态的区别
C++和java多态的区别 分类: Java2015-06-04 21:38 2人阅读 评论(0) 收藏 举报 转载自:http://www.cnblogs.com/plmnko/archive ...
- Android开发之Java必备基础
Android开发之Java必备基础 Java类型系统 Java语言基础数据类型有两种:对象和基本类型(Primitives).Java通过强制使用静态类型来确保类型安全,要求每个变量在使用之前必须先 ...
- JAVA面试基础
JAVA相关基础知识1.面向对象的特征有哪些方面 ?1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂 ...
- 【重走Android之路】【Java面向对象基础(三)】面向对象思想
[重走Android之路][基础篇(三)][Java面向对象基础]面向对象思想 1 面向对象的WWH 1.1 What--什么是面向对象 首先,要理解“对象”.在Thinkin ...
- java多态的理解----部分非原创
所谓多态,其实就是对于同一件事情,不同的对象要采取不同的行为,或者同一个对象在不同的情况下需要采取不同的行为方式. 不同的对象要采取不同的行为: 这有两种实现方式:接口实现和子类重新父类方法.这两种实 ...
随机推荐
- 容器改变/窗口改变重新渲染echarts
是否遇见使用侧边栏菜单收缩/展开,echarts容器大小变化,但是echarts不重新自适应容器.或者,window窗口改变但是echarts不随着改变,针对这两种echarts不自适应的情况,分享下 ...
- SQL数据库—<1>SQL语言
关系数据库.SQL语言简单.学习软件介绍 SQL:Structured Query Language 结构化查询语言 数据库分为:层次型,网状型,关系型. 关系型数据库:是一个二维表的集合,可以用来存 ...
- Netflix:我们为什么要将GraphQL引入前端架构?
作者|Artem Shtatnov译者|无明 在这篇文章中,我们将分享 Netflix 在这些应用程序的前端架构中引入 GraphQL 所积累的经验. 在内部,我们把用于管理广告创建和组装的主要应用程 ...
- 带你逐行阅读redux源码
带你逐行阅读redux源码 redux版本:2019-7-17最新版:v4.0.4 git 地址:https://github.com/reduxjs/redux/tree/v4.0.4 redux目 ...
- Bootstrap 警告框
<div class="panel panel-primary"> <div class="panel-heading"> <h3 ...
- Concurrent - 并发框架
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11426833.html SynchronizedMap和ConcurrentHashMap有什么区别? ...
- 【leetcode】654. Maximum Binary Tree
题目如下: Given an integer array with no duplicates. A maximum tree building on this array is defined as ...
- 【Flutter学习】页面跳转之SliverAppBar,CustomScrollView,NestedScrollView的使用
一,flutter SliverAppbar 控件介绍 SliverAppBar “应用栏” 相当于升级版的 appbar 于 AppBar 位置的固定的应用最上面的; 而 SliverAppBar ...
- Another Blog
I also hold a blog with thoughts of English learning. Get there ===>. It's a private blog. Actual ...
- [CSP模拟测试43、44]题解
状态极差的两场.感觉现在自己的思维方式很是有问题. (但愿今天考试开始的一刻我不会看到H I J) A 考场上打了最短路+贪心,水了60. 然而正解其实比那30分贪心好想多了. 进行n次乘法后的结果一 ...