继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

java多态

英明神武的牛
关注TA
已关注
手记 317
粉丝 30
获赞 175

多态的优点

  1. 消除类型之间的耦合关系

  2. 可替换性

  3. 可扩充性

  4. 接口性

  5. 灵活性

  6. 简化性
    多态存在的三个必要条件
    继承
    重写
    父类引用指向子类对象
    比如:
    Parent p = new Child();
    当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
    多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
    以下是一个多态实例的演示,详细说明请看注释:
    Test.java 文件代码:
    public class Test {
    public static void main(String[] args) {
    show(new Cat());  // 以 Cat 对象调用 show 方法
    show(new Dog());  // 以 Dog 对象调用 show 方法

    Animal a = new Cat();  // 向上转型  
    a.eat();               // 调用的是 Cat 的 eat
    Cat c = (Cat)a;        // 向下转型  
    c.work();        // 调用的是 Cat 的 work
    }

    public static void show(Animal a)  {
    a.eat();  
    // 类型判断
    if (a instanceof Cat)  {  // 猫做的事情
    Cat c = (Cat)a;  
    c.work();  
    } else if (a instanceof Dog) { // 狗做的事情
    Dog c = (Dog)a;  
    c.work();  
    }  
    }  
    }

abstract class Animal {  
abstract void eat();  
}

class Cat extends Animal {  
public void eat() {  
System.out.println("吃鱼");  
}  
public void work() {  
System.out.println("抓老鼠");  
}  
}

class Dog extends Animal {  
public void eat() {  
System.out.println("吃骨头");  
}  
public void work() {  
System.out.println("看家");  
}  
}
执行以上程序,输出结果为:
我们将介绍在Java中,当设计类时,被重写的方法的行为怎样影响多态性。
我们已经讨论了方法的重写,也就是子类能够重写父类的方法。
当子类对象调用重写的方法时,调用的是子类的方法,而不是父类中被重写的方法。
要想调用父类中被重写的方法,则必须使用关键字super。
Employee.java 文件代码:
/ 文件名 : 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("Employee 构造函数");
this.name = name;
this.bjrongjinhuiyin.comaddress = address;
this.number = number;
}
public void mailCheck() {
System.out.println("邮寄支票给: " + 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 文件代码:
    / 文件名 : Salary.java /
    public class Salary extends Employee
    {
    private double salary; // 全年工资
    public Salary(String name, String address, int number, double salary) {
    super(name, address, number);
    setSalary(salary);
    }
    public void mailCheck() {
    System.out.println("Salary 类的 mailCheck 方法 ");
    System.out.println("邮寄支票给:" + getName()

  • " ,工资为:" + salary);
    }
    public double getSalary() {
    return salary;
    }
    public void setSalary(double newSalary) {
    if(newSalary >= 0.0) {
    salary = newSalary;
    }
    }
    public double computePay() {
    System.out.println("计算工资,付给:" + getName());
    return salary/52;
    }
    }
    现在我们仔细阅读下面的代码,尝试给出它的输出结果:
    VirtualDemo.java 文件代码:
    / 文件名 : VirtualDemo.java /
    public class VirtualDemo {
    public static void main(String [] args) {
    Salary s = new Salary("员工 A", "北京", 3, 3600.00);
    Employee e = new Salary("员工 B", "上海", 2, 2400.00);
    System.out.println("使用 Salary 的引用调用 mailCheck -- ");
    s.mailCheck();
    System.out.println("\n使用 Employee 的引用调用 mailCheck--");
    e.mailCheck();
    }
    }
    以上实例编译运行结果如下:
    Employee 构造函数
    Employee 构造函数
    使用 Salary 的引用调用 mailCheck --
    Salary 类的 mailCheck 方法
    邮寄支票给:员工 A ,工资为:3600.0

使用 Employee 的引用调用 mailCheck--
Salary 类的 mailCheck 方法
邮寄支票给:员工 B ,工资为:2400.0
例子解析
实例中,实例化了两个 Salary 对象:一个使用 Salary 引用 s,另一个使用 Employee 引用 e。
当调用 s.mailCheck() 时,编译器在编译时会在 Salary 类中找到 mailCheck(),执行过程 JVM 就调用 Salary 类的 mailCheck()。
因为 e 是 Employee 的引用,所以调用 e 的 mailCheck() 方法时,编译器会去 Employee 类查找 mailCheck() 方法 。
在编译的时候,编译器使用 Employee 类中的 mailCheck() 方法验证该语句, 但是在运行的时候,Java虚拟机(JVM)调用的是 Salary 类中的 mailCheck() 方法。
以上整个过程被称为虚拟方法调用,该方法被称为虚拟方法。
Java中所有北京股票配资的方法都能以这种方式表现,因此,重写的方法能在运行时调用,不管编译的时候源代码中引用变量是什么数据类型。
多态的实现方式
方式一:重写:
这个内容已经在上一章节详细讲过,就不再阐述,详细可访问:Java 重写(Override)与重载(Overload)。
方式二:接口

  1. 生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型。

  2. java中的接口类似于生活中的接口,就是一些方法特征的集合,但没有方法的实现。具体可以看 java接口 这一章节的内容。
    方式三:抽象类和抽象方法
    详情请看 Java抽象类 章节。
    Java 重写(Override)与重载(Overload) Java 抽象类
    笔记列表

    小丫小石头116***1009@qq.com
    br/>对于多态,可以总结以下几点:
    一、使用父类类型的引用指向子类的对象;
    二、该融金汇银引用只能调用父类中定义的方法和变量;
    三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用);
    四、变量不能被重写(覆盖),"重写"的概念只针对方法,如果在子类中"重写"了父类中的变量,那么在编译时会报错。
    小丫小石头
    小丫小石头
    116***1009@qq.com<br <="" a="">参考地址
    10个月前 (03-29)九刃
    528***187@qq.com

  3. 九刃


  4. 528***187@qq.com


class Dog extends Animal{
public double age;
public void move(){
age = 10.00;
System.out.println("狗可以跑和走");
}
public void bark(){
System.out.println("狗可以吠叫");
}
}

class Cat extends Animal{
public void move(){
super.age = 3;
System.out.println("猫可以跳");
}
}

public class TestOverride{
public static void main(String args[]){
Animal a = new Animal(); // Animal 对象
Animal b = new Dog(); // Dog 对象
Dog c = new Dog();
Cat d = new Cat();

  a.move();// 执行 Animal 类的方法  b.move();//执行 Dog 类的方法  c.move();//执行 Dog 类的方法  d.move();//执行 Cat 类的方法  Object aValue = a.age;  Object bValue = b.age;  Object cValue = c.age;  System.out.println("The type of "+a.age+" is "+(aValue instanceof Double ? "double" : (aValue instanceof Integer ? "int" : "")));  System.out.println("The type of "+b.age+" is "+(bValue instanceof Double ? "double" : (bValue instanceof Integer ? "int" : "")));  System.out.println("The type of "+c.age+" is "+(cValue instanceof Double ? "double" : (cValue instanceof Integer ? "int" : "")));// 覆盖age属性  System.out.println("The age of cat  is "+d.age);

}
}
编译值:
动物可以移动
狗可以跑和走
狗可以跑和走
猫可以跳
The type of 0 is int
The type of 0 is int
The type of 10.0 is double
The age of cat  is 3

九刃


528***187@qq.com<br/" rel="nofollow">

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP