zoukankan      html  css  js  c++  java
  • 多态

    当面临一个问题,有多种实现算途径的时候,要想到Java中的核心:多态。


    多态的思想:

    概括地讲,在运用父类引用指向子类对象的情况下,基本上就用到了多态了。(当父类引用指向子类对象时,调用的方法和成员变量,当子类进行方法重写或者变量与父类中的变量同名时,调用的都是子类的,否则,会调用父类中的)

    最简单的多态应该是继承:

    public class Tank {
    public void move() {
    System.out.println("I am father");
    }
    }

    public class Tank2 extends Tank{
    @Override
    public void move(){
    System.out.println("I am child a");
    }

     

    public class Client {
    public static void main(String[] args) {
    Tank t2 = new Tank2();  ///父类引用指向了子类对象
    t2.move();        ///父类中的move方法,但实际具体的实现是tank2对象对move的实现。

         }

    }

    接口和抽象类的例子:


    对于抽象类和接口,有许多类实现这个接口(或者继承这个抽象类)。
    在调用的时候,用父类引用指向子类对象的方法。然后,调用对象的方法,编译器就会自动根据这个对象实际属于哪个实现类,
    来调出这个类对于接口或者抽象类的具体实现。

    例:
    public class Address {
    private String name;
    public Address(String name){
    this.name = name;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    }

    定义基类(抽象类):
    public abstract class Vehicle {
    abstract void Go(Address address);
    }

    Car对于基类的实现:
    public class Car extends Vehicle{
    @Override
    public void go(Address address){
    System.out.println("Car to " + address.getName());
    }
    }

    Plane对于基类的实现:
    public class Plane extends Vehicle{
    @Override
    void go(Address address) {
    System.out.println("Plane to " + address.getName());
    }
    }


    Driver中多态:
    public void drive(Vehicle v){                  ///多态,父类引用指向子类对象,实际传过来的是抽象类Vehicle的子类,或者实现类,然后编译器会根据具体实现类,来找实现方法。
    v.go(new Address("杭州(abstract)"));    ///此方法在具体的实现中被重写
    }

    Test:
    public static void main(String[] args) {
    Driver d = new Driver();
    d.drive(new Plane());   //实际是Plane对象,则编译器就会找到Plane中,对go的实现
    d.drive(new Car());       //实际是Car对象,则编译器就会找到Plane中,对go的实现
    }

    输出结果:
    Plane to 杭州(abstract)
    Car to 杭州(abstract)

    事实上,这就是多态所起的作用,可以实现控制反转这在大量的J2EE轻量级框架中被用到,比如spring的依赖注射机制。
    (通过注入不同的bean,来得到不同的实现类)

    接口与抽象类的区别:

    有个概念,但还没有想到具体实现。
    对于一些共用的,已经有实现了,可以设计成接口。

    上面是抽象类,下面把它转化为接口:

    IVehicle.java
    public interface IVehicle {
    public void go(Address address);
    }

    CarImpl.java
    public class CarImpl implements IVehicle{
    public void go(Address address) {
    System.out.println("CarImpl to " +address.getName());
    }
    }

    PlameImpl.java
    public class PlaneImpl implements IVehicle{
    public void go(Address address) {
    System.out.println("PlaneImpl to " + address.getName());
    }
    }

    Driver.java
    ////多态之接口
    public void driveI(IVehicle v){
    v.go(new Address("杭州(interface)"));
    }

    Test.java
    ////用接口实现
    d.driveI(new PlaneImpl());
    d.driveI(new PlaneImpl());

    打印结果:
    PlaneImpl to 杭州(interface)
    PlaneImpl to 杭州(interface)

    多态的三要素:1.继承  2.重写  3.父类引用指向子类对象

    以上就是我目前学习中的总结,如有不足之处,还望多多赐教。

  • 相关阅读:
    Beta阶段团队项目开发篇章2
    Beta阶段团队项目开发篇章1
    Alpha阶段博客链接
    大学生对技术网站需求的调查问卷结果分析
    关于大学生对技术网站需求的问卷调查
    第十。。。三周嘞
    进入第十一周喽
    第十周了耶~
    第九周也要过去啦~~~
    第,八,周,啦
  • 原文地址:https://www.cnblogs.com/java-log/p/7327591.html
Copyright © 2011-2022 走看看