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多态的理解----部分非原创
所谓多态,其实就是对于同一件事情,不同的对象要采取不同的行为,或者同一个对象在不同的情况下需要采取不同的行为方式. 不同的对象要采取不同的行为: 这有两种实现方式:接口实现和子类重新父类方法.这两种实 ...
随机推荐
- React-Native基础-安卓篇(二)
前言:这一篇随笔将记录我在React-Native官网文档上学习的基础知识
- c# 编程--基础部分补全篇
C#基础 分支: switch switch(表达式) { case 具体值1: ...
- JavaScript常用技巧之进制转换
一.十进制转二进制 (8).toString(2) 二.二进制转十进制 parseInt("1000",2) 三.获取当前时间戳 // 方法 Date.now() // 对象和操作 ...
- Robot Framework使用技巧之内部变量
[转载] 1.变量的使用 变量可以在命令行中设置,个别变量设置使用--variable (-v)选项,变量文件的选择使用--variablefile (-V)选项. 通过命令行设置的变量是全局变量,对 ...
- 力扣 ——3Sum python (三数之和)实现
题目描述: 中文: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 英文: Give ...
- 第07章 JdbcTemplate
第07章JdbcTemplate 1. 概述 为了使JDBC更加易于使用,Spring在JDBC API上定义了一个抽象层,以此建立一个JDBC存取框架. 作为Spring JDBC框架的核心,JDB ...
- java解决高并发问题
对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并发问题是绝大部分的程序员头疼的问题, 但话又说回来了,既然逃避不掉,那我们就坦然面对吧~今天就让我们一起来研 ...
- sql中简单的触发器功能
触发器分为DML触发器和DDL触发器DML触发器包含After触发器,执行insert update delete语句后会触发after触发器,会事务回滚DML触发器还包含instead of触发器, ...
- <自动化测试>之<使用unittest Python测试框架进行参数化测试>
最近在看视频时,虫师简单提到了简化自动化测试脚本用例中的代码量,而python中本身的参数化方法用来测试很糟糕,他在实际操作中使用了parameterized参数化... 有兴趣就查了下使用的方法,来 ...
- lazy图片懒加载使用
看到一个小伙子写的言简意赅很不错,摘录如下: https://www.npmjs.com/package/vue-lazyload 首先我们先在npm上下载vue-lazyload的包 1 npm i ...