对象转型

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

 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. Fast data loading from files to R

    Recently we were building a Shiny App in which we had to load data from a very large dataframe. It w ...

  2. iOS安全攻防之越狱设备检测

    iOS 越狱(iOS Jailbreaking),是用于获取苹果公司便携装置操作系统iOS最高权限的一种技术手段,用户使用这种技术及软件可以获取到 iOS 的最高权限,甚至可能可以进一步解开运营商对手 ...

  3. 3分钟带你了解PowerShell发展历程——PowerShell各版本资料整理

    本文带你了解PowerShell发展历程,顺便整理了一点资料,方便大家查询. Windows PowerShell® 是基于任务的命令行管理程序和脚本语言,专为进行系统管理而设计. 在 .NET Fr ...

  4. js 玩一玩

    闲着没事学了学js,做了一个下页面玩玩. 下面是html代码: <!DOCTYPE html><html> <head> <meta charset=&quo ...

  5. 我做的第一个程序(菜鸟的java课堂笔记)

    内存: 堆区,栈区,常量区,计数区,代码区: 数据类型: 基本数据类型:整形,浮点型,布尔型 boolean 只能返回真假值,字符型: 引用数据类型:类,数组: 基本数据类型-->直接存放到栈区 ...

  6. C#程序遍历数组A中所有元素

    ] { "a1","a2","a3","a4","a5"}; //第一种方法 ; i < A. ...

  7. DOM知识梳理

    DOM 我们知道,JavaScript是由ECMAScript + DOM + BOM组成的.ECMAScript是JS中的一些语法,而BOM主要是浏览器对象(window)对象的一些相关知识的集合. ...

  8. map | make_pair

    #include <map> void func(std::map<int,std::pair<const char*,int>> &T_map) { st ...

  9. intel hex 格式的几个链接

    intel hex GENERAL: INTEL HEX FILE FORMAT Intel Hex文件格式说明 - starspace - 博客园 C# Hex文件转bin文件 - bule - 博 ...

  10. Mac 上Python多版本切换

    Mac上自带了Python2.x的版本,有时需要使用Python3.x版本做开发,但不能删了Python2.x,可能引起系统不稳定,那么就需要安装多个版本的Python. 1.安装Python3.x版 ...