20180816-Java 多态
Java 多态
多态是同一个行为具有多个不同表现形式或形态的能力。
多态性是对象多种表现形式的体现。
比如我们说"宠物"这个对象,它就有很多不同的表达或实现,比如有小猫、小狗、蜥蜴等等。那么我到宠物店说"请给我一只宠物",服务员给我小猫、小狗或者蜥蜴都可以,我们就说"宠物"这个对象就具备多态性。
接下来让我们通过实例来了解Java的多态。
public interface Vegetarian{}
public class Animal{}
public class Deer extends Animal implements Vegetarian{}
因为Deer类具有多重继承,所以它具有多态性。以上实例解析如下:
一个 Deer IS-A(是一个) Animal
一个 Deer IS-A(是一个) Vegetarian
一个 Deer IS-A(是一个) Deer
一个 Deer IS-A(是一个)Object
在Java中,所有的对象都具有多态性,因为任何对象都能通过IS-A测试的类型和Object类。
访问一个对象的唯一方法就是通过引用型变量。
引用型变量只能有一种类型,一旦被声明,引用型变量的类型就不能被改变了。
引用型变量不仅能够被重置为其他对象,前提是这些对象没有被声明为final。还可以引用和它类型相同的或者相兼容的对象。它可以声明为类类型或者接口类型。
当我们将引用型变量应用于Deer对象的引用时,下面的声明是合法的:
Deer d = new Deer();
Animal a = d;
Vegetarian v =d;
Object o =d;
所有的引用型变量d,a,v,o都指向堆中相同的Deer对象。
虚方法
我们将介绍在Java中,当设计类时,被重载的方法的行为怎样影响多态性。
我们已经讨论了方法的重载,也就是子类能够重载父类的方法。
当子类对象调用重载的方法时,调用的是子类的方法,而不是父类中被重载的方法。
要想调用父类中被重载的方法,则必须使用关键字super。
/* 文件名: Employee.java */
public class Employee{
private String name;
private String address;
private int number;
public Employee(String name,String address,int number){
System.out.println("Constructing an Employee");
this.name = name;
this.address = address;
this.number = number;
}
public void mailCheck(){
System.out.println("Mailing a check to "+this.name
+" "+this.address);
}
public String toString(){
return name + "" + address + "" +number;
}
public String getName(){
return name;
}
public String getAddress(){
return address;
}
public void setAddress(String newAddress){
address = newAddress;
}
public int getNumber(){
return number;
}
}
假设下面的类继承Employee类:
/* 文件名: Salary.java */
public class Salary extends Employee{
private double salary; //Annual salary
public Salary(String name,String address,int salary){
super(name,address,number);
setSalary(salary);
}
public void mailCheck(){
System.out.println("Within mailCheck of Salary class");
System.out.println("Mailing check to " + getName() + "with salary " +salary);
}
public double getSalary(){
return salary;
}
public void setSalary(double newSalary){
if(newSalary >=0.0){
salary = newSalary;
}
}
public double computerPay(){
System.out.println("Computing salary pay for" + getName());
return salary/52;
}
}
public class VirtualDemo{
public static void main(String[] args){
Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
System.out.println("Call mailCheck using Salary reference --");
s.mailCheck();
System.out.println("\n Call mailCheck using Employee reference--");
e.mailCheck();
}
}
以上实例编译运行结果如下:
Constructing an Employee
Constructing an Employee
Call mailCheck using Salary reference --
Within mailCheck of Salary class
Mailing check to Mohd Mohtashim with salary 3600.0
Call mailCheck using Employee reference--
Within mailCheck of Salary class
Mailing check to John Adams with salary 2400.0
例子中,我们实例化了两个Salary对象。一个使用Salary引用s,另一个使用Employee引用。
编译时,编译器检查到mailCheck()方法在Salary类中的声明。
在调用s.mailCheck()时,Java虚拟机(JVM)调用Salary类的mailCheck()方法。
因为e是Employee的引用,所以调用e的mailCheck()方法则有完全不同的结果。
当编译器检查e.mailCheck()方法时,编译器检查到Employee类中的mailCheck()方法。
在编译的时候,编译器使用Employee类中的mailCheck()方法验证该语句, 但是在运行的时候,Java虚拟机(JVM)调用的是Salary类中的mailCheck()方法。
该行为被称为虚拟方法调用,该方法被称为虚拟方法。
Java中所有的方法都能以这种方式表现,借此,重写的方法能在运行时调用,不管编译的时候源代码中引用变量是什么数据类型。
20180816-Java 多态的更多相关文章
- 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 ...
- 深入理解Java多态机制
从字节码层面来看,Java中的所有方法调用,最终无外乎转换为如下几条调用指令. invokestatic: 调用静态方法. invokespecial: 调用实例构造器<init>方法,私 ...
- Java 多态 父类和子类方法的访问控制权限
Java 多态 父类和子类方法的访问控制权限 @author ixenos 父类和子类方法的访问控制权限 继承是为了扩展类的功能,而这种扩展显然就是对一个原始类的扩展,目的还是向上转型来调用,所以这就 ...
- Java多态(二)
public class ExtendsTest { public static void main(String[] args) { A a1 = new A(); A a2 = new B(); ...
- 从JVM角度看Java多态
首先,明确一下,Java多态的三个必要条件: 1. 继承 2. 子类重写父类方法 3. 父类引用指向子类对象 然后看一个例子 package test.xing; class Father{ prot ...
- 关于java多态的理解
要理解多态,就必须有一个大的理解方向,不然很容易绕进去. 首先知道多态的释义:多态性是指一个名词可以有多种语义. 对于java的多态性学习者来说,就是必须要知道多个同名方法在不同情况下的使用规则. j ...
- Java经验杂谈(2.对Java多态的理解)
多态是面向对象的重要特性之一,我试着用最简单的方式解释Java多态: 要正确理解多态,我们需要明确如下概念:・定义类型和实际类型・重载和重写・编译和运行 其中实际类型为new关键字后面的类型. 重载发 ...
- 学JAVA第十六 天,JAVA多态
今天老师讲了多态的使用 多态是同一个行为具有多个不同表现形式或形态的能力. 多态的优点: 1. 消除类型之间的耦合关系 2. 可替换性 3. 可扩充性 4. 接口性 5. 灵活性 6. 简化性 我个 ...
- 对java多态的理解
java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过 Cat c = new C ...
随机推荐
- YOLOv3 算法的详细说明
YOLOv3没有太多的创新,主要是借鉴一些好的方案融合到YOLO里面.不过效果还是不错的,在保持速度优势的前提下,提升了预测精度,尤其是加强了对小物体的识别能力. 本文主要讲v3的改进,由于是以v1和 ...
- C#打印单据
HTML: <form id="form1"> <div id="t_border"> <!- ...
- Java{0}占位符替换字符串
Java{0}占位符替换字符串 public class Test { public static void main(String[] args) { System.out.println(Stri ...
- web 前端1 拾遗
1.整体布局 三个div header body footer 2.div的居中 width:980px margin:0 auto 3.内联标签 inline #内联 无法使用高度.宽度 block ...
- Java第四周编程总结
第四周编程总结 1.写一个名为Rectangle的类表示矩形.其属性包括宽width.高height和颜色color,width和height都是double型的,而color则是String类型的. ...
- UVA-10462.Is There A Second Way Left(Kruskal+次小生成树)
题目链接 本题大意:这道题用Kruskal较为容易 参考代码: #include <cstdio> #include <cstring> #include <vector ...
- 通过document.domain实现跨域访问
通过document.domain实现跨域访问:https://blog.csdn.net/nlznlz/article/details/79506655 前端跨域方法之document.domain ...
- ZOJ-1610 线段树+两种查询方法(弥补我线段树区间填充的短板)
ZOJ-1610 线段树+两种查询方法(弥补我线段树区间填充的短板) 题意 题意:给一个n,代表n次操作,接下来每次操作表示把[l,r]区间的线段涂成k的颜色其中,l,r,k的范围都是0到8000 这 ...
- 谈Apache OFbiz 会员模块表结构设计
数据库表的结构设计可谓是ofbiz除技术框架之外,另一个非常值得学习的方向.这篇文章我们来谈谈ofbiz对电子商务会员表的设计. PARTY ofbiz对人.团体进行了抽象,称之为party,翻译为中 ...
- JavaScript基础9——操作DOM树
appendChild()方法:添加子节点到末尾 类似于剪切粘贴的效果 insertBefore(newNode, oldNode)方法:在某个节点之前插入一个节点 newNode为要插入的节点, ...