对象转型

  学习多态前先明白一个叫对象转型的概念,如:

 class Animal{
void sleep(){
System.out.println("睡觉");
}
} class Cat extends Animal{
void catchMouse(){
System.out.println("捕鼠");
}
} class Dog extends Animal{ } public class Test { public static void main(String[] args) {
Animal a = new Cat(); //向上转型
Cat c = (Cat) a; //向下转型
c.catchMouse();
// Dog d = (Dog) a;  运行时会报错,a实际是Cat,不能转成Dog,两者没有关系
System.out.println(a instanceof Animal);
} }

Cat向上转型之后,视为Animal类,只能访问到父类中的成员,而不能访问Cat中的成员,如需访问,需再次强制转向下转换成Cat类,使用多态过程中,一般都默认会涉及到对象转型。

多态概述

  多态体现在父类引用指向子类对象。实现多态的前提是:1.类与类之间存在关系,可以是继承关系或者是实现关系;2.而且子类中必须要有方法的重写;3.有父类或者父类接口引用指向子类对象。代码示例:

 class Animal{
void sing(){
System.out.println("唱歌");
}
} class Cat extends Animal{
void sing(){
System.out.println("喵喵");
}
} class Dog extends Animal{
void sing(){
System.out.println("汪汪");
}
} public class Test { public static void main(String[] args) {
Cat c = new Cat();
function(c);
// Dog d = new Dog();
// function(d);
} public static void function(Animal a){ //相当于Animal a = new Cat()对象转型
a.sing();
} }

这段代码最终运行输出的是:喵喵。主函数中创建了一个c对象,并调用function方法,很明显function方法中参数为Animal a,由于Cat继承了Animal,没有问题,可是最终输出为什么不是Animal中的方法唱歌,这是由多态成员方法的特点来决定的。
1.编译期间:参阅的是引用型变量所属的类中是否有调用的方法,很明显这里的Animal是有方法的sing的;
2.运行期间:参阅对象所属的类中是否有调用方法,很明显这里的Cat中也是有sing方法的;
所以最终运行出来的是Cat中的方法。也就是说子类中必须要有重写,才是多态。

多态的分类
  1.具体类多态,如:

 class Fu{]

 class Zi extends Fu {}

 Fu f = new Zi();

  2.抽象类多态,如:

abstract class Fu {}
class Zi extends Fu {}
Fu f = new Zi();

  3.接口多态,如:

interface Fu{}
class Zi implements Fu{}
Fu f = new zi();

 多态中的成员访问特点
  1.对于成员变量:编译看左边,运行看左边。(即编译的时候检查父类中是否存在该变量名,运行的时候访问的也是父类中该变量的值)
  2.对于构造方法:子类的构造都会默认访问父类构造。
  3.对于成员方法:编译看左边,运行看右边。
  4.对于静态方法:编译看左边,运行看右边。

Java自学手记——多态的更多相关文章

  1. Java自学手记——struts2

    struts2框架 struts2是一种基于MVC模式的框架,是在struts1的基础上融合了xwork的功能. struts2框架预处理了一些功能: >请求数据自动封装, >文件上传的功 ...

  2. Java自学手记——Java中的关键字

    Java中的一些关键字对于初学者来说有时候会比较混乱,在这里整理一下,顺便梳理一下目前掌握的关键字. 权限修饰符 有四个,权限从大到小是public>protected>defaul(无修 ...

  3. Java自学手记——接口

    抽象类 1.当类和对象被abstract修饰符修饰的时候,就变成抽象类或者抽象方法.抽象方法一定要在抽象类中,抽象类不能被创建对象,如果需要使用抽象类中的抽象方法,需要由子类重写抽象类中的方法,然后创 ...

  4. Java自学手记——servlet3.0新特性

    servlet3.0出来已经很久了,但市场上尚未普遍应用,servlet3.0有三个比较重要的新特性:使用注解来代替配置文件,异步处理以及上传组件支持. 支持servlet3.0的要求:MyEclip ...

  5. Java自学手记——注解

    注意区分注释和注解,注释是给人看的,注解是给程序看的. 注解的作用是代替配置文件,在servlet3.0中,就可以不再使用web.xml文件,而是所有配置都是用注解!比如注解类 @WebServlet ...

  6. Java自学手记——泛型

    泛型在集合中的应用 泛型在集合经常能看到,有两个好处:1.把运行时出现 的问题提前至了编译时:2.避免了无谓的强制类型转换. 用法:两边泛型的类型必须相同,可允许一边不写,只是为了兼容性,并不推荐. ...

  7. Java自学手记——集合

  8. 【转】JAVA自学之路

    JAVA自学之路 一: 学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向 ...

  9. JAVA自学笔记09

    JAVA自学笔记09 1.子类的方法会把父类的同名方法覆盖(重写) 2.final: 1)可修饰类.方法.变量 2)修饰类时:此时该类变为最终类,它将无法成为父类而被继承 3)修饰方法时:该方法将无法 ...

随机推荐

  1. 11.Java 加解密技术系列之 总结

    Java 加解密技术系列之 总结 序 背景 分类 常用算法 原理 关于代码 结束语 序 上一篇文章中简单的介绍了第二种非对称加密算法 — — DH,这种算法也经常被叫做密钥交换协议,它主要是针对密钥的 ...

  2. $.when()方法翻译

    地址:http://api.jquery.com/jQuery.when/ jQuery.when( deferreds ),returns Promise 正文 Description: Provi ...

  3. ArrayList构造方法源码分析

    首先看一下无参的构造方法: private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; transient Object ...

  4. MySQL主从搭建

    主服务器配置 1.编辑配置文件 # 如果不存在,就手动创建一个 vim /etc/my.cnf 在配置文件加入如下值: [mysqld] # 唯一的服务辨识号,数值位于 1 到 2^32-1之间. # ...

  5. 可视化Git版本管理工具SourceTree的使用

    最近去了新公司,发现公司使用的团队版本管理工具是SourceTree,本人一直是SVN的热衷粉,很少使用git,所以从头学习git及可视化客户端SourceTree的使用,本贴只针对新手,大牛可以无视 ...

  6. 分享几个python小脚本

    by 梁凯 今天我想给大家分享几个python脚本,分别是: 1.公司访问外网认证脚本(最初有同事写过,我优化了一下). 2.统计周报系统所有同事的最近一篇周报. 3.统计测试技术分享里指定一个月所有 ...

  7. MySQL1-基础知识点

    目录 零.MySQL安装与配置 一.基本概念 二.基本语法 三.常用指令 四.四种SQL语句       零.MySQL安装与配置 http://www.cnblogs.com/hikarusun/a ...

  8. SpringMVC form:form的一个错误(没有传到前台绑定类)

    SpringMVC form:form的一个错误(没有传到前台绑定类) 报错信息: Neither BindingResult nor plain target object for bean nam ...

  9. WLAN高密无线网络部署的信道问题

    WIFI信号的信道有两部分,其中2.4G频段有13个左右交叠的信道(14信道只在日本使用),其中只能找出3个相互不重合的信道(具体请参考文末的链接),最常用的就是1.6.11这三个,当然也可以使用其他 ...

  10. 如何使用wait(), notify() and notifyAll() – Java

    Java多线程是个很复杂的问题,尤其在多线程在任何给定的时间访问共享资源需要更加注意.Java 5引入了一些类比如BlockingQueue 和Executors 类提供了易于使用的API,避免了一些 ...