开发者社区> ghost丶桃子> 正文

Java千百问_05面向对象(009)_java的多态性都有什么表现

简介:
+关注继续查看

1、什么是多态

多态是对象具有多种表现形式的能力。 
在面向对象语言中,接口的多种不同的实现方式即为多态。 
多态性的科学解释:允许你将父对象设置成为一个或更多的他子对象的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。 
通俗的解释,就是一句话:可以把一个子类的对象转换为父类的对象。 
Java中,所有的Java对象是多态的,因为任何对象都可以设置为自己本身的类和Object类(Object是所有类的父类)。

了解跟多继承看这里:java类的继承有什么意义

2、如果表现多态

让我们来看一个例子。 
例子:

public interface Vegetarian{}
public class Animal{}
public class Deer extends Animal implements Vegetarian{}


现在,Deer类被认为是多态的,因为这有多重继承。于是:

  • 鹿is-a动物(is-a等于继承,了解更多is-a看这里:is-a,has-a,like-a是什么
  • 鹿like-a素食(is-a等于实现)
  • 鹿 is-a Object

由于多态性,下面的声明是合法的:

Deer d = new Deer();
Animal a = d;
Vegetarian v = d;
Object o = d;




所有d的参考变量d,a,v,o在堆中都指向相同的Deer对象。

了解更多引用传递看这里: 
了解更多变量内存存储看这里:

3、方法多态是什么

我们知道方法覆盖,其中一个子类可以在其父覆盖的方法。即覆盖方法的本质是隐藏父类方法,除非子类使用的重载方法中的super关键字。无论子类以何种形态被声明,都会执行子类的方法,这就是方法的多态

了解更多覆盖看这里:java中覆盖是什么 
了解更多重载和覆盖的区别看这里:java中重载和覆盖有什么关系 
例如:

/* File name : 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;
   }
}

Salary类继承Employee类,如下所示:

/* File name : Salary.java */
public class Salary extends Employee
{
   private double salary; //Annual salary
   public Salary(String name, String address, int number, double
      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 computePay()
   {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }
}

测试代码:

/* File name : VirtualDemo.java */
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("
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

结论如下: 
1. 在调用s.mailCheck()时,调用Salary类中的mailCheck()。 
2. 在调用e.mailCheck()时,由于e是Salary对象的一个引用,所以实际调用的是Salary类中的mailCheck()。 
3. 这种调用被称为虚拟方法调用,该方法被称为虚拟方法


原文地址:http://blog.csdn.net/ooppookid/article/details/51220407





版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java开发——9.面向对象的特点(2.1):继承VS抽象
面向对象的特点:封装、继承和多态。
16 0
Java开发——9.面向对象的特点(二):继承+super
面向对象的特点:封装、继承和多态。
20 0
Java开发——11.面向对象的特点(三):多态
面向对象的特点:封装、继承和多态。
14 0
java面向对象思维程序设计开发以及案例 -电梯运行问题对象分析与程序设计(2)
java面向对象思维程序设计开发以及案例 -电梯运行问题对象分析与程序设计(2)
14 0
java面向对象思维程序设计开发以及案例 -电梯运行问题对象分析与程序设计(1)
java面向对象思维程序设计开发以及案例 -电梯运行问题对象分析与程序设计(1)
24 0
2022年/一月18号善于复盘回顾内容一(java的面向对象编程中的类对象属性 方法)Java面向对象的核心继承 封装 多态。(二)
2022年/一月18号善于复盘回顾内容一(java的面向对象编程中的类对象属性 方法)Java面向对象的核心继承 封装 多态。
15 0
2022年/一月18号善于复盘回顾内容一(java的面向对象编程中的类对象属性 方法)Java面向对象的核心继承 封装 多态。(一)
2022年/一月18号善于复盘回顾内容一(java的面向对象编程中的类对象属性 方法)Java面向对象的核心继承 封装 多态。
18 0
【Java SE】面向对象三大特性之多态
【Java SE】面向对象三大特性之多态
17 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Java工程师必读手册
立即下载
Java应用提速(速度与激情)
立即下载
Java单元测试实战
立即下载