java中的多态,多态的例子

2019-03-28 21:57|来源: 网络

当面临一个问题,有多种实现算途径的时候,要想到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.父类引用指向子类对象

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


Formhttp://www.blogjava.net/1186858036/archive/2012/04/19/375236.html

 

 



相关问答

更多
  • 这只是隐式类型转换,Java中的多态一般是指函数重载(简而言之是同名函数不同参数实现相似功能)、InterfaceImplemention(即接口类)、抽象类、函数覆盖 类似于: interface C { public abstract byte method(int i); // 4 } abstract class B implements C { public abstract char method(int i, int j); // 5 public void method(int i, Obj ...
  • 首先多态是多种形式或形态,它在计算机程序设计语言中代表一种能力,即用一个特定类型的变量来引用不同类型的对象,并且根据引用对象的不同而自动的调用相应的方法。比如说我们想象一个农民种蔬菜的列子,Vagetable包括Potato和Cabbage两种蔬菜。农民中类中只需种蔬菜,并不用知道它具体是哪种蔬菜,只需要把实现了蔬菜类的土豆和大白菜放进方法里就可以了,然后java会根据多态的特性来自动为我们调用土豆类的方法和大白菜类的方法。创建了一个抽象类Vagetable(蔬菜)类,这个类中有个抽象的方法public a ...
  • 多态,就是重载和重写.重载发生在一个类中.重写发生在子类,意思就是子类重写父类相同名称的方法.刚学语言有的东西,不必搞得那么清楚,只有知道怎么用就行了,有的问题你要想真正把它搞得很懂,短时间是不可能的,比如说接口,没有几年工作经验你根本不可能真正理解什么是接口,甚至有的人工作四,五年也没搞明白什么是接口,不要花太多时间去搞这些不容易搞懂的问题. 重载的特性,方法名相同.返回类型,传入方法的参数不同(包括个数和类型). 重写的特性,方法名相同,返回类型,参数均相同,必须发生在子类. 1.Java语言允许某个类 ...
  • Java中的多态允许父类指针指向子类实例。如:Father obj=new Child();(其中Child是Father的子类)。这样就产生了一个问题—— 使用这个父类型的指针访问类的属性或方法时,如果父类和子类都有这个名称的属性或方法,哪一个属性或方法会被调用呢? 最好的办法是实验: class Father { int r; Father() { r=4; } void printname() { System.out.println("I’m father"); } } class Child ex ...
  • 重载和多态是两个概念。 重载:是说方法的重载。 要求是 1:相同的方法名。 2:参数列表不同(也就是参数的类型不同 或者是 参数的个数不同 再或者是 参数出现的次序不同) 3:返回值可以不同,但是最好是相同的。 多态:只有在发生继承的时候才会出现多态。 多态又分为 类的多态 和 方法的多态(就是方法的重写)。
  • 继承和多态[2022-01-20]

    class a{ public static int b; a(){ System.out.println("早上好"); } } public class Test14 extends a{ public static void main(String[] args) { System.out.println(b); //为什么能打印,因为继承了上面的变量 a a1 = new Test14();//为什么能指向子类,因为父类引用指向子类对象,多态 } public Test14(){ System.ou ...
  • 不一样。java的class只能继承一个parent,需要interface或者需要parent是abstract class;python的class可以继承多个parent,所以不需要interface,另外,因为python是dynamically typed,所以即使完全不继承parent,也可以做到多态。
  • 编译时间和运行时多态性与解析调用的时间直接相关。 在编译时间多态性中,在编译期间解析调用。 加载方法是编译时多态性的一个例子。 重载无论是在实例级别还是在类级别 示例: public class Sample { static void doSomething(InputStream is) { System.out.println("is"); } static void doSomething(OutputStream os) { System ...
  • 在第二种形式中, orderList只能被视为ArrayList或从ArrayList继承的东西。 在第一种形式中, orderList被视为List ,当您仅使用List接口定义的功能时,建议使用此List 。 这样代码更灵活,可以轻松重构(例如,你意识到你需要一个LinkedList ,你改变了初始化,大多数代码都不需要改变)。 此外,如果可能的话,代码重构有助于使用接口而不是实际类型(例如,使用List类型的参数而不是Array ...