Java面向对象----多态概念,对象上下转型
概念:同一操作作用于某一类对象,可以有不同的解释,产生不同的执行结果
多态存在的三个必要条件
- 需要存在继承和实现关系
- 同样的 方法调用而执行不同操作,运行不同的代码(重写操作)
- 在运行时父类或者接口的引用变量可以引用其子类的 对象
package com.tanlei.newer; public class AnimalDemo {
public static void main(String[] args) {
Animal animal=new Dogg("哈哈");
Animal animal2=new Cat("花花");
animal.eat();
animal2.eat();
}
} class Animal {
private String name; public Animal(String name) {
this.name = name;
} // 这是一个通用方法
// 只是告诉其子类去实现它
public void eat() { } } class Dogg extends Animal { public Dogg(String name){
super(name);
}
public void eat() {
System.out.println("狗啃骨头");
}
} class Cat extends Animal {
public Cat(String name){
super(name);
}
public void eat() {
System.out.println("猫吃鱼");
}
}
对象上下转型
向上转型 子类 --->父类
Animal animal=new Dogg("哈哈");//向上转型
//向上转型 安全 但可能会导致子类的方法丢失
//父类的引用变量只能调用父类中有的方法或者子类重写的方法
向下转型 父类--->子类
//向下转型 不安全
if(animal2 instanceof Cat) {
Cat cat=(Cat)animal2;
cat.sleep();
}
instanceof
用法:
object instanceof class / /object是class或其子类的一个实例
动态绑定
编译前绑定 (静态绑定)
Person.sayHi();
运行时,根据变量实际引用的对象类型决定调用哪个方法(动态绑定)
Person p =new Teacher(); p.sayHi();
多态案例---使用多态实现士兵作战下程序
package com.tanlei.newer; public class SoldierDemo {
public static void main(String[] args) {
Soldier soldier=new KJSolider("TANL", 22);
soldier.attack();
Soldier soldier1=new KJSolider("aa", 22);
soldier1.attack();
Soldier soldier2=new KJSolider("ccc", 22);
soldier2.attack();
}
} abstract class Soldier{
private String name;
private int age;
public Soldier(String name, int age) {
this.name = name;
this.age = age;
}; public String getName() {
return name;
} //所有部队行动
public void gongji() {
start();
attack();
end();
} public void start() {
System.out.println("准备攻击");
}
public void end() {
System.out.println("攻击完成");
} public abstract void attack();
} //海军
class HJSolider extends Soldier{ public HJSolider(String name, int age) {
super(name, age); } public void attack() {
System.out.println(getName()+"海军打海炮");
}
} //空军
class KJSolider extends Soldier{
public KJSolider(String name, int age) {
super(name, age); } public void attack() {
System.out.println(getName()+"空军发炮");
}
} //陆军
class LJSolider extends Soldier{
public LJSolider(String name, int age) {
super(name, age); } public void attack() {
System.out.println(getName()+"陆军打炮");
}
}
Java面向对象----多态概念,对象上下转型的更多相关文章
- Java面向对象多态
Java面向对象多态 7.2对象 7.2.1创建对象 对象是类的实例 类的名称 对象名称 = new 类的名称(); 7.3继承 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域 ...
- Java面向对象-类与对象
Java面向对象-类与对象 类与对象的关系 我们通俗的举个例子,比如人类是一种类,张三这个人就是人类的具体的一个个体,也就是java中的对象:这就是一个类与对象的关系: 类的定义 下面看实例 类的创建 ...
- Java面向对象--类和对象
面向对象是相对于面向过程而言的,是软件开发方法.面向对象把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统设计,更贴近事物的自然运行模式.本篇博客介绍Java面向对象的类和对象 目录: 面 ...
- -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal
java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型 也就是 ...
- java面向对象1-面向对象概念
面向对象概念-类与对象的关系 封装:指隐藏对象的属性和实现细节,仅对外提供公共访问方式,private-构造方法/构造器-this关键字-static关键字(javadoc制作工具类) -代码块 继承 ...
- JAVA面向对象-多态的理解
面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据. 继承是为了重用父类代码,同时为实现多态性作准备.那么什么是多 ...
- Java面向对象的概念整理
Java中一切皆是对象! 注意:8种基本数据类型不支持面向对象的编程机制,基本数据类型的数据也不具备“对象”的特性:没有成员变量.方法可以被调用. 为解决8种基本数据类型不能当成Object类型(所有 ...
- Java面向对象——类,对象和方法
1.类的概念 在生活中,说到类,可以联想到类别,同类,会想到一类人,一类事物等等.而这一类人或事物都是具有相同特征或特点和行为的,我们根据不同的特征或特点和行为将他们归类或分类.同时,当我们认识一个新 ...
- Java面向对象-------多态总结
1.多态:是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作,如图所示: 多态性是对象多种表现形式的体现. 2.多态作用: 1. 消除类型之间的耦合关系 ...
随机推荐
- mysqldump与mydumper
mydumper -u root -S /srv/my3308/run/mysql.sock -B trade_platform -o /data/trade_platform
- Redis源码解析:28集群(四)手动故障转移、从节点迁移
一:手动故障转移 Redis集群支持手动故障转移.也就是向从节点发送"CLUSTER FAILOVER"命令,使其在主节点未下线的情况下,发起故障转移流程,升级为新的主节点,而原 ...
- c++设计模式:访问者模式(visitor模式)
1.c语言中回调基本都过函数指针来完成.c++中主要通过接口的方式完成回调.而visitor就是实现接口回调的一种方式. 1.首先定义个一个接口visitor类, class classVisitor ...
- canvas扇形进度圈动态加载
效果图如下:动态加载的 实现代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- linux操作系统清除报错Disk /dev/mapper/ddf1_4c53492....
现象描述 Disk /dev/mapper/ddf1_4c5349202020202010000055000000004711471100000a28p1: 666.0 GB, 66600088934 ...
- Kubernetes 基于 ubuntu18.04 手工部署 (k8s)
由于工作的需要, 手工部署一个 Kubernetes 环境(k8s).(以前都是云上搞定,拿来用) 习惯把这种工作记录下来,自己备查也和别人分享 网上相关文章很多, 我也参考了很多,这里推荐一个 链接 ...
- 使用netbeans 搭建maven工程 整合spring springmvc框架
使用netbeans7.4 自带的tomcat7.0 所以jdk选择7.xx 然后等待生成空的工程,会缺一些文件夹,和文件,后续需要的时候补齐 然后修改pom.xml添加引用,直接覆盖dependen ...
- 使用neo4j-import导入数据及关系
背景 上节我们了解了什么是图数据库,作为研究对象的neo4j的特点,优缺点以及基本的环境搭建. 现在我们要讲存储在csv中的通话记录数据导入到neo4j中去,并且可以通过cql去查询导入的数据及关系 ...
- Linux远程管理Windows程序Rdesktop详解
#rpm –q rdesktop //查找是否已经安装 #yum install rdesktop //使用yum安装 rde ...
- JZOJ 5455 拆网线
Time Limits: 1000 ms Memory Limits: 65536 KB Detailed Limits Description 企鹅国的网吧们之间由网线互相连接,形成一棵树的结构.现 ...