面向对象的三大特征:

1.封装   (将一类属性封装起来,并提供set()和get()方法给其他对象设置和获取值。或者是将一个运算方法封装起来,其他对象需要此种做运算时,给此对象调用)

2.继承   (继承关系通过extends关键字体现)

3.多态   (父类的引用指向子类的对象,或者接口的引用类型变量指向接口实现类的对象)


1、多态的含义

父类的引用指向子类的对象,或者接口的引用类型变量指向接口实现类的对象

2、多态的应用

1.多态应用于形式参数的时候,可以接收更多类型的数据.
    2.多态用于返回值时,可以返回更多类型的数据.

3、多态的好处

提高了代码的拓展性.

4、多态的弊端

虽然提高了扩展性,但是只能使用父类引用指向父类成员。

5、多态的前提

类与类之间有关系,继承或者实现

6、多态体现

1:父类引用变量指向了子类的对象
    2:父类引用也可以接受自己的子类对象

7、类型转换场景的问题

java.lang.ClassCaseException.类型转换失败

8、附录

如果需要访问子类特有的成员,那么需要进行强制类型转换

1、基本数据类型转换:
  小数据类型------>大数据类型 自动转换
  大数据类型------>转小数据类型 强制类型转换 2、引用类型转换:
  小数据类型------->大数据类型 自动转换
  大数据类型------->转小数据类型 强制类型转换

9、实现关系下的多态

接口的引用类型变量指向接口实现类的对象
格式:
接口 变量 = new 接口实现类的对象

例子:

 interface Dao {  //接口的方法全部都是非静态的方法
public void add();
public void delete();
} //接口的实现类
class UserDao implements Dao{
public void add(){
System.out.println("添加员工!!!");
}
public void delete(){
System.out.println("删除员工");
}
} class Demo2 {
public static void main(String[] args) {
//实现关系下的多态
Dao d=new UserDao(); //接口的引用类型变量指向接口的实现类的对象
d.add();
d.delete();
}
}

10、实例

例子1:

/*
1:Father类
1:非静态成员变量x
2:静态成员变量y
3:非静态方法eat,方法体输出父类信息
4:静态方法speak();方法体输出父类信息
2:Son类
1:非静态成员变量x
2:静态成员变量y
3:非静态方法eat,方法体输出子类信息
4:静态方法speak();方法体输出子类信息
*/
class Father {
int x = 1;
static int y = 2; void eat() {
System.out.println("开吃");
}
static void speak() {
System.out.println("小头爸爸");
}
} class Son extends Father {
int x = 3;
static int y = 4; void eat() {
System.out.println("大头儿子很能吃");
}
static void speak() {
System.out.println("大头儿子。");
}
} class Demo10 {
public static void main(String[] args) {
Father f = new Son(); // 父类引用指向了子类对象。
System.out.println(f.x); //返回结果:1
System.out.println(f.y); //返回结果:2 f.eat(); // 输出的是子类的方法
f.speak(); // 输出的是父类的方法
}
}

解析:子类(Son)继承父类(Father)

1:创建Father f=new Son();
1:这就是父类引用指向了子类对象。
2:问f.x=?(非静态)
3:问f.y=?(静态)
4:问f.eat()输出的是子类还是父类信息?(非静态)
5:问f.speak()输出的是子类还是父类信息?(静态)

总结:

1:当父类和子类具有相同的非静态成员变量,那么在多态下访问的是父类的成员变量
2:当父类和子类具有相同的静态成员变量,那么在多态下访问的是父类的静态成员变量     所以:父类和子类有相同的成员变量,多态下访问的都是父类的成员变量。
3:当父类和子类具有相同的非静态方法(就是子类重写父类方法),多态下访问的是子类的成员方法。
4:当父类和子类具有相同的静态方法(就是子类重写父类静态方法),多态下访问的是父类的静态方法。

例子2:

 //动物类
abstract class Animal{
String name;
public Animal(String name){
this.name=name;
} public abstract void run(); //抽象方法
}
//老鼠类
class Mouse extends Animal{
public Mouse(String name){ //调用父类构造器,目的:获取成员变量name中的值
super(name);
}
public void run(){ //重写父类的抽象方法
System.out.println(name+"四条腿慢慢走");
} public void dig(){//Mouse子类特有的方法
System.out.println(name+"老打洞..."); }
}
//鱼类
class Fish extends Animal{
public Fish(String name){
super(name);
}
public void run(){ //重写父类的抽象方法
System.out.println(name+"摇着尾巴游啊游...");
}
public void bubble(){ //Fish子类特有的方法
System.out.println(name+"吹泡泡....");
}
} class Demo6 {
public static void main(String[] args) {
Animal a=new Mouse("米老鼠");//多态,父类的引用指向子类的对象
a.run();
//a.dig(); //报错 Mouse m=(Mouse)a;//强制类型转换
m.dig(); //如果直接用a.dig()的话,会报错,因为是多态(父类中没有dig()方法),所以要强制转换类型 Animal a1=new Fish("金枪鱼");
Fish f=(Fish)a1;
print(f);
} //需求,定义一个函数可以接收任意类型的动物对象,在函数的内部要调用到动物特有的方法
//instanceof
public static void print(Animal a){//Animal a=new Fish();
if(a instanceof Fish){
Fish f=(Fish)a;
f.bubble();
}else if(a instanceof Mouse){
Mouse m=(Mouse)a;
m.dig();
}else{
System.out.println("输入错误");
}
}
}

例子3:instanceof关键字(在末尾)

 //形状类
abstract class MyShape{//抽象类
public abstract void getLength(); //抽象方法
public abstract void getArea(); //抽象方法
}
//圆形
class Circle extends MyShape{
public final static double PI=3.14; //常量
double r;
public Circle(double r){
this.r=r;
} public void getLength(){
System.out.println("这是圆形的周长"+2*PI*r);
}
public void getArea(){
System.out.println("这是圆形的面积"+PI*r*r); }
}
//矩形
class Rect extends MyShape{
int width;
int height; public Rect(int width,int height){
this.width=width;
this.height=height;
}
public void getLength(){
System.out.println("这是矩形的周长"+2*(width+height));
}
public void getArea(){
System.out.println("这是矩形的面积"+width*height);
}
public void t(){
System.out.println("来咬我啊!!!");
}
} class Demo5 {
public static void main(String[] args) {
MyShape mp=new Circle(3.0);//多态,父类的引用指向了子类的对象
mp.getLength();
mp.getArea();
47     //方法2
     Circle c = new Circle(3.0);
Rect r = new Rect(5,8);
MyShape m = new Rect(8,3);
//m.t(); //报错,此处需要强制类型转换
print(r);
print(c);//new Circle(3.0)
} //需求1.定义一个函数可以接收任意类型的对象,并且打印图形的面积与周长
public static void print(MyShape s){//相当于:MyShape s=new Circle(3.0)
s.getLength();
s.getArea();
MyShape m = getShape(1);
} //需求2:定义一个函数可以返回任意类型的图形对象.
public static MyShape getShape(int i){ if(i == 1){
return new Circle(2.0);
}else if(i == 0){
return new Rect(6,9);
}else{
return null;
}
}
}

原创作者:DSHORE

作者主页:http://www.cnblogs.com/dshore123/

原文出自:http://www.cnblogs.com/dshore123/p/8891998.html

欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

java基础14 多态(及关键字:instanceof)的更多相关文章

  1. Java基础十一--多态

    Java基础十一--多态 一.多态定义 简单说:就是一个对象对应着不同类型. 多态在代码中的体现: 父类或者接口的引用指向其子类的对象. /* 对象的多态性. class 动物 {} class 猫 ...

  2. Java基础之多态和泛型浅析

    Java基础之多态和泛型浅析 一.前言: 楼主看了许多资料后,算是对多态和泛型有了一些浅显的理解,这里做一简单总结 二.什么是多态? 多态(Polymorphism)按字面的意思就是“多种状态”.在面 ...

  3. java基础(多态)_03

    一.多态 1.概念:一个对象的多种形态 2.前提: a:必须有继承 b:必须有重写(只有重写才会有意义,没重写语法没错) 3.体现形式: 父类类型 变量名 = new 子类类型(): 4.注意事项: ...

  4. Java 基础(6)——关键字 & 标识符 & 转义字符

    依然是基础的一天,看一看就好~ 关键字 之前就有说过关键字哦~ 注:关键字就是程序发明者规定的有特殊含义的单词. from Java基础(2) Java 中除了关键字以外还有暂时没有成为关键字的保留字 ...

  5. Java基础知识之常见关键字(1)

    static 特点: 随着类的加载而加载 优先于对象存在 被所有对象所共享 可以直接被类名调用 注意点: 静态方法只能访问静态方法 但是非静态成员可以直接访问静态成员 静态方法中不可以使用this , ...

  6. Java基础知识之常见关键字以及概念总结

    static 特点: 随着类的加载而加载 优先于对象存在 被所有对象所共享 可以直接被类名调用 使用注意: 静态方法只能访问静态成员 但是非静态成员可以直接访问静态成员 静态方法中不可用使用this, ...

  7. Java基础进阶:多态与接口重点摘要,类和接口,接口特点,接口详解,多态详解,多态中的成员访问特点,多态的好处和弊端,多态的转型,多态存在的问题,附重难点,代码实现源码,课堂笔记,课后扩展及答案

    多态与接口重点摘要 接口特点: 接口用interface修饰 interface 接口名{} 类实现接口用implements表示 class 类名 implements接口名{} 接口不能实例化,可 ...

  8. java基础(2):注释、关键字、标识符、数据

    1. 注释.关键字与标识符 大家可以安装一个文本编辑软件notepad++,有利于java代码的查看与编写. 1.1 程序注释 通常我们需要在源代码中添加文字用来对进行代码解释说明,但这些文字并不是J ...

  9. Java基础—private、this关键字及get/set方法

    Java基础-private\this关键字以及get\set方法 1.private关键字 private关键字通常用来修饰成员变量用来保护原有数据的安全,比如在下面学生类中 然后在测试类中调用成员 ...

随机推荐

  1. Tajo--一个分布式数据仓库系统(设计架构)

    上一篇Tajo--一个分布式数据仓库系统(概述)废话了一通,下面介绍一下Tajo的体系结构.以及官方的实验成果吧 一.体系架构 Tajo采用了Master-Worker架构(下图虚线框目前还在计划中) ...

  2. python基础----文件处理

    一.文件处理流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 正趣果上果 Interesting fruit fruit 词:郭婞 曲:陈粒 编曲/混音/和声:燕池 萧: ...

  3. Nginx -- proxy_pass配置

    一.proxy_pass 作用域: location 不影响浏览器地址栏的url 设置被代理server的协议和地址 协议可以为http或https 地址可以为域名或IP 二.配置规则 2.1 测试环 ...

  4. 驱动学习5: zynq实现点亮led

    驱动代码: #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #i ...

  5. Asp.Net MVC +EF CodeFirst+多层程序设计

    1.概述 这是一个基于个人博客的一个项目,虽然博客根本没必要做这么复杂的设计.但是公司有需求,所以先自己弄个项目练练手.项目需要满足下列需求 1.层与层之间需要解耦,在后期上线更新维护时不需要覆盖,只 ...

  6. JS-DOM-随时更新

    DOM里有三种节点:元素节点.文本节点和属性节点 getElmentById(); //id选择器  在JS中用此方法来查找获取  建议大小写 以免不兼容 有时候查找不到  DOM操作必须等到HTML ...

  7. eclipse常用快捷键大全 (转)

    Eclipse中10个最有用的快捷键组合  一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的浏览源代码,使得整体的开发效率和质量得到提升.    ...

  8. 2017-2018-2 20179207 《网络攻防技术》第十三周作业 python3实现SM234算法

    国密算法SM234 的python3实现 国家标准 GM/T 0002-2012 <SM4分组密码算法> GM/T 0003.1-2012 <SM2椭圆曲线公钥密码算法 第1部分:总 ...

  9. 51nod 1171 大灾变

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1757 二分答案mid 避难所拆为mid个点 每个避难所的第一个点向第二个 ...

  10. Elasticsearch Java API 配置测试

    Elasticsearch1.X,2.X,5.X随着版本的迭代,除了系统升级,Java API也做了相对较大的调整,也就是说,1.X的API在2.X以及5.X乃至未来6.X版本都不是通用的. 本例子使 ...