当面临一个问题,有多种实现算途径的时候,要想到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程序的运行机制至关重要。在实际编程中,应充分利用多态来设计高效且易于维护的系统。
"北大青鸟javaOOP多态Ch03作业全集.rar"这个压缩包文件很显然是针对学习者提供的一系列关于Java多态性的练习和案例,帮助学生深入理解并掌握这一核心技能。 多态性是面向对象三大特性之一,另外两个是封装和继承。...
深入理解 Java 多态性 在 Java 编程语言中,多态性是指一个对象可以有多种形式的...多态性是 Java 编程语言中一个非常重要的概念,通过理解多态性,我们可以更好地应用 Java 编程语言,编写出更加灵活和强大的程序。
Java多态理解 java中的多态性是面向对象编程的精髓所在。多态性是指父类引用指向子类对象,例如父类Animal,子类Cat和Dog。其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类。Animal animal = ...
在深入理解和运用Java中的多态机制时,我们需要仔细研究类的继承结构,理解如何通过接口实现多态,掌握方法重写在实现多态中的作用,以及了解类型擦除和泛型编程在Java中的应用。通过实践和对文档内容的深入挖掘,...
4. instanceof关键字:用于判断对象是否是某个类或其子类的实例,是多态中常用的一个条件判断。 总的来说,Java的多态性是实现面向对象设计的重要工具,它使代码更加灵活、可扩展,同时也提高了代码的复用性。理解...
#### 一、理解Java多态 多态,作为面向对象编程的三大特性之一,是继抽象和继承之后的关键概念。它允许我们以统一的接口处理不同类型的对象,增强了代码的灵活性和可扩展性。在Java中,多态主要通过两种方式体现:*...
Java中的多态是面向对象编程的关键特性之一,它允许一个接口或者抽象方法被多个不同的类实现,从而使得代码更加灵活且可扩展。多态的概念基于一个接口可以有多种不同的实现方式,增强了程序的多样性和适应性。 在...
Java中的多态性是面向对象编程的一个核心特性,它允许我们使用父类引用指向子类对象,从而实现灵活的代码编写和复用。多态主要体现在子类型多态...理解和掌握多态的实现机制对于编写高效、健壮的Java应用程序至关重要。
Java多态是面向对象编程中的一个核心概念,它允许我们以一种统一的方式处理不同类型的对象。在Java中,多态性主要体现在方法的重写(Override)和重载(Overload)。通过多态,我们可以编写出更加灵活、可扩展的代码...
java程序设计中,多态的实现和理解,通过代码演示java程序设计中,多态的实现和理解,通过代码演示
Java的多态是学习Java的第一个重点,也是一个难点。在学习Java多态之前, 要学好封装和继承,封装和继承是理解多态的一个过程。在表现多态时,同 时也体现了封装和继承。
在Java编程语言中,多态(Polymorphism)是一种核心特性,它允许我们设计更加灵活、可扩展的代码。多态使得一个接口可以有多种不同的实现或者表现形式,...理解和熟练运用多态,对于编写高质量的Java应用程序至关重要。
本篇将深入探讨Java多态中的类型转换,包括向上转型(Upcasting)和向下转型(Downcasting),以及相关的注意事项。 1. **向上转型(Upcasting)** 向上转型是指将子类的对象引用赋值给父类的引用。在Java中,这是...
### C++和Java多态的区别 #### 一、概述 多态是面向对象编程语言中的一个核心特性,它允许程序员能够使用基类的指针或引用指向派生类的对象,并在运行时根据对象的实际类型来选择合适的方法进行调用。这一特性增强...