java——多态

来源:互联网 发布:关于现代武器的软件 编辑:程序博客网 时间:2024/06/02 06:01
package project;public class test001 {public static void main(String[] args) {Salary s = new Salary( "员工A", "北京", 3, 3600.00 );Employee e = new Employee( "员工B", "上海", 2 );        System.out.println( "使用Salary的引用调用mailCheck--" );        s.mailCheck();        System.out.println( "\n使用Employee的引用调用mailCheck--");        e.mailCheck();}}//java多态//多态是同一个行为具有不同表现形式或形态的能力。//多态的有点//1.消除类型之间的耦合关系//2.可替换性//3.可扩充性//4.接口性//5.灵活性//6.简化性//多态存在的三个必要条件//继承//重写//父类的引用指向子类//比如://Parent p = new Child();//当时用堕胎方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。//多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。//一下是一个多态实例的演示,详细说明请看注释:class Test{public static void main( String[] args ){show( new Cat() );show( new Dog() );Animal a = new Cat();a.eat();Cat c = new Cat();c.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。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.address = 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 int getNumber(){return number;}}class Salary extends Employee{    private double salary;public Salary(String name, String address, int number, double salary ) {super(name, address, number);setSalary( salary );}public double getSalary(){return salary;}public void setSalary(double newSalary) {if( newSalary >= 0.0 ){this.salary = newSalary;}}public void mailCheck(){System.out.println( "Salary类的mailCheck方法" );System.out.println( "邮寄支票给:" + getName() + ",工资为:" + salary );}public double computePay(){System.out.println( "计算工资,付给:" + getName() );return salary/52;}}//例子分析//实例中,实例化了两个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中所有的方法都能以这种方式表现,因此,重写的方法能在运行时调用,不管编译的时候源代码中引用变量是什么数据类型。//多态的实现方式//方法一:重写//方法二:接口

0 0
原创粉丝点击