Java:多态性

Java的多态性:发送消息给某个对象,让该对象自行决定响应何种行为。 通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。

java的多态性要满足三个条件:

1、继承关系

2、在子类重写父类的方法

3、父类引用指向子类的对象,即animal p = new dog()

在多态中非静态成员函数的特点:

在编译时期:参阅引用形变量所属的类中是否有要调用的方法。如果有,编译通过;否则,编译不通过

在运行时期:参阅对象所属的类中是否有要调用的方法。如果有,运行成功;否则,运行失败。

总结:编译时期看做左边,运行时期看右边。

在多太中成员变量和静态成员函数的特点:

无论编译和运行都参考左边(引用类型变量所属的类)

例子1:创建父类动物类Animal、子类猫类Cat、子类狗类Dog

//创建父类animal动物类
abstract class Animal
{
     public abstract void eat();
}
//创建动物类子类:猫类
class Cat extends Animal
{
    public void eat()
    {
      System.out.println("吃鱼");
    }
}
//创建动物类子类:狗类
class Dog extends Animal
{
    public void eat()
    {
      System.out.println("吃骨头");
    }
}

//多态的表现形式
class DuoTaiDemo
{
    public static void main(String[] args)
    {
      Animal a = new Cat(); //父类的引用指向子类对象
      a.eat();  //父类中有eat()方法,编译通过,子类中也有eat()方法,所以最终编译成功

      function(new Cat());
      function(new Dog());
    }

    //将动物类的引用当做参数传递给方法
    public static void function(Animal a)
    {
        //判断如果是Dog
        if(a instanceof Dog )
        {
            a.eat(); //调用父类的eat()方法
            Dog b = (Dog) a; //调用Dog的eat()方法
            b.eat();
        }
        //如果是Cat
        else if(a instanceof Cat)
        {
            a.eat();//调用父类的eat()方法
            Cat b = (Cat) a;//调用Cat的eat()方法
            b.eat();
        }
    }
}

例子2:多态的功能扩展

基于电脑的实例(电脑主板)

扩展(网卡、声卡、、、)

interface PCI             //扩展功能的接口(规则)
{
    public abstract void open();
    public abstract void close();
}

class MainBoard          //主板类
{
    public void run()
    {
        System.out.println("Mi anBoard run");
    }
    public void usePCI(PCI p)    //PCI p = new NetCard() //接口型的引用指向自己的子类对象
    {
        p.open();
        p.close();
    }    

}

class NetCard implements PCI        // 实现网卡的连接
{
    public void open()
    {
      System.out.println("NetCard open");
    }
    public void close()
    {
       System.out.println("NetCard close");
    }
}

class SoundCard  implements PCI    // 实现声卡的连接
{
    public void open()
    {
      System.out.println("soundcard open");
    }
    public void close()
    {
       System.out.println("soundcard close");
    }
}

//主函数测试
class DuoTaiDemo1
{
    public static void main(String[] args)
    {
        MainBoard mb = new MainBoard();
        mb.run();
        mb.usePCI(new NetCard());
        mb.usePCI(new SoundCard());
    }
}

例子3:多态的扩展实例:连接数据库(用户可以create、add、update、delete)

interface UserInfoDao        //D:data  a:access  o:object
{
   public abstract void add();
   public abstract void deletde();
}

class UserInfoByJDBC  implements UserInfoDao        //手写连接数据库
{
    public void add()
    {
      1、JDBC连接数据库
      2、使用sql添加语句添加数据
      3、关闭数据库连接
    }
    public void delete()
    {
      1、JDBC连接数据库
      2、使用sql删除语句删除数据
      3、关闭数据库连接
    }
}

class UserInfoByHibernate implements UserInfoDao     //框架连接数据库
{
    public void add()
    {
      1、Hibernate连接数据库
      2、使用sql添加语句添加数据
      3、关闭数据库连接
    }
    public void delete()
    {
      1、Hibernate连接数据库
      2、使用sql删除语句删除数据
      3、关闭数据库连接
    }
}

class DBoperate
{
    public static void main(String[] args)
    {
    /*  UserInfoDao ui = new UserInfoByJDBC();         //多态引用类型指向子类对象
        ui.add();
        ui.delete();
        UserInfoDao ui = new UserInfoByHibernate();    //多态引用类型指向子类对象
        ui.add();
        ui.delete();
    */

        ui.add(new UserInfoByJDBC());
        ui.delete(new UserInfoByJDBC());
        ui.add(new UserInfoByHibernate());
        ui.delete(new UserInfoByHibernate());

    }
}
时间: 2024-10-13 06:01:07

Java:多态性的相关文章

java 多态性详解及常见面试题

java多态性 多态分两种: (1)   编译时多态(设计时多态):方法重载. (2)   运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态.(我们平时说得多的事运行时多态,所以多态主要也是指运行时多态) 运行时多态存在的三个必要条件: 一.要有继承(包括接口的实现): 二.要有重写: 三.父类引用指向子类对象. 多态的好处: 1.可替换性(substitutability).多态对已存在代码具有可替换性.例如,多态对圆Circle类工作,对其他任

java多态性

深入理解java多态性 昨天看到一个关于多态性的帖子,参考了回帖者的理解,加入了一些自己的看法,整理出来供大家参考,不一定完全正确,欢迎大家批评指正. (一)相关类 class A ...{         public String show(D obj)...{                return ("A and D");         }          public String show(A obj)...{                return (&quo

java 多态性

引言:多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定.因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性.多态性增强了软件的灵

[转载]深入理解java多态性

FROM:http://blog.csdn.net/thinkGhoster/article/details/2307001 昨天看到一个关于多态性的帖子,参考了回帖者的理解,加入了一些自己的看法,整理出来供大家参考,不一定完全正确,欢迎大家批评指正. (一)相关类 class A ...{         public String show(D obj)...{                return ("A and D");         }          public

Java多态性的表现

Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制. 方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现. 重写是父类与子类之间多态性的一种表现,重载是一个类中多态性的一种表现. 如果在子类中定义某方法与其父类有相同的名称和参数,我们就说该方法被重写:子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了.如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同

Java多态性的体现方式

Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制. 方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现. 重写是父类与子类之间多态性的一种表现,重载是一个类中多态性的一种表现. 如果在子类中定义某方法与其父类有相同的名称和参数,我们就说该方法被重写:子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了.如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同

Java多态性理解

Java多态性理解 Java中多态性的实现 什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法. 多态的作用:消除类型之间的耦合关系.

Java多态性的“飘渺之旅”

原文出处:斯武丶风晴 摘要: 如何从Java多态性进行飘渺之旅呢? 我们用例子来旅行. 1 朵星人A:人类,是一个很奇妙的物种. 2 朵星人B:他们好像分为两种,嗯 先生,以及美女? 3 朵星人C:对,更年轻的有叫 美少女的. 4 朵星人D:他们之间怎么打招呼的?我们问问AI(编译器大佬)吧.. 5 朵星人A:可以有.启动吧~ 第一次启动: 1 /** 2 * 编译时多态 3 * 4 * @author Sven Augustus 5 */ 6 public class StaticTest {

Java 多态性理解

什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法.特别注意:当所引用的类型存在继承关系时候,会结合参数的类型,选择相应的方法.可以结合

Java多态性 抽象类

一   多态性是面向对象的三大特征之一               多态的含义是:对外一种表现形式,内在有多种具体实现 Java中多态的具体体现              方法重载              方法覆盖              多态参数(新内容,重点.难点) 多态环境下对象造型 向下造型 –又称向下转型 向上造型 –又称向上转型 例如:(里面包含了多态的对象造型等) public class aabb { public static void main(String[] args