java 怎样理解多态,理解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.父类引用指向子类对象

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值