`
liqian5251
  • 浏览: 16125 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

理解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.父类引用指向子类对象
分享到:
评论

相关推荐

    对java中多态理解

    代码演示对java中多态的理解 从代码演示中更好的理解多态的作用

    java中多态的内存分析

    想要下载此文件,请先下载本人“java程序中的内存分配问题”,因为那个例子比较简单而且分析详细透彻,可以使你更容易理解,如果你对java程序执行过程中的内存分配有一定的了解,可以直接下载本文件

    java多态理解

    java 个人对于多态理解和一些笔记。

    深入理解Java多态

    本文带您通过几个类的示例和讲解来理解Java多态性,Java多态性的概念也可以被说成“一个接口,多个方法

    java 多态 经典讲解

    利用大量代码讲解java的多态,让你更容易理解和应用。

    java多态代码

    java程序设计中,多态的实现和理解,通过代码演示java程序设计中,多态的实现和理解,通过代码演示

    Java的多态.md

    Java的多态是学习Java的第一个重点,也是一个难点。在学习Java多态之前, 要学好封装和继承,封装和继承是理解多态的一个过程。在表现多态时,同 时也体现了封装和继承。

    【Java面试题】谈谈对Java多态的理解

    【Java面试题】谈谈对Java多态的理解

    进一步理解Java中的多态概念

    主要介绍了进一步理解Java中的多态概念,是Java入门学习中的基础知识,需要的朋友可以参考下

    java中多态的使用实例

    主要java中接口,继承以及抽象等基础内容的实例,实初学者能刚好的理会多态的具体含义

    对于多态的理解

    对 于java的多态理解

    java多态的讲解

    用代码实例和注释向你讲述什么是多态,实例更容易理解

    Java零基础-多态.md

    内容概要: 本文介绍了Java中多态(Polymorphism)的概念和用法。读者将学习什么是多态,为什么需要多态,以及如何在程序中实现多态。此外,还会讨论多态时的一些注意事项和规则。 能学到什么: 理解多态的定义、...

    深入理解Java多态.pptx.pptx

    多态是面向对象编程中的一个重要特性,它允许一个类的引用变量指向多种实际类型。这意味着在运行时,可以调用不同的方法实现不同的功能 多态的实现方式 多态可以通过继承、接口和重写实现。子类继承父类后,可以使用...

    理解java多态

    深入理解java多态中的变化提高代码的可维护性和可扩展性

    JAVA多态的理解.pdf

    JAVA多态的理解.pdf

    Java多态的深度剖析

    帮助你完全理解java多态的含义并附实例代码

Global site tag (gtag.js) - Google Analytics