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





相关文章
|
20天前
|
搜索推荐 Java
Java的面向对象特性主要包括封装、继承和多态
【4月更文挑战第5天】Java的面向对象特性主要包括封装、继承和多态
15 3
|
22小时前
|
安全 Java
Java基础&面向对象&继承&抽象类
Java基础&面向对象&继承&抽象类
|
23小时前
|
Java
【Java基础】详解面向对象特性(诸如继承、重载、重写等等)
【Java基础】详解面向对象特性(诸如继承、重载、重写等等)
5 0
|
6天前
|
安全 Java 机器人
《Java 简易速速上手小册》第2章:面向对象的 Java(2024 最新版)
《Java 简易速速上手小册》第2章:面向对象的 Java(2024 最新版)
19 0
|
9天前
|
存储 Java
Java基础教程(7)-Java中的面向对象和类
【4月更文挑战第7天】Java是面向对象编程(OOP)语言,强调将事务抽象成对象。面向对象与面向过程的区别在于,前者通过对象间的交互解决问题,后者按步骤顺序执行。类是对象的模板,对象是类的实例。创建类使用`class`关键字,对象通过`new`运算符动态分配内存。方法包括构造函数和一般方法,构造函数用于对象初始化,一般方法处理逻辑。方法可以有0个或多个参数,可变参数用`类型...`定义。`this`关键字用于访问当前对象的属性。
|
13天前
|
存储 Java 编译器
对象的交响曲:深入理解Java面向对象的绝妙之处
对象的交响曲:深入理解Java面向对象的绝妙之处
46 0
对象的交响曲:深入理解Java面向对象的绝妙之处
|
18天前
|
Java
在Java中,多态性允许不同类的对象对同一消息做出响应
【4月更文挑战第7天】在Java中,多态性允许不同类的对象对同一消息做出响应
17 2
|
30天前
|
算法 IDE Java
【软件设计师备考 专题 】面向对象程序设计语言:C++、Java、Visual Basic和Visual C++
【软件设计师备考 专题 】面向对象程序设计语言:C++、Java、Visual Basic和Visual C++
41 0
|
1月前
|
Java
java面向对象高级分层实例_测试类(main方法所在的类)
java面向对象高级分层实例_测试类(main方法所在的类)
10 1
|
1月前
|
Java 数据库
java面向对象高级分层实例_数据库操作类
java面向对象高级分层实例_数据库操作类
11 1