对java多态的理解

java多态,如何理解父类引用指向子类对象

要理解多态性,首先要知道什么是“向上转型”。

        我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类。我可以通过   Cat c = new Cat(); 实例化一个Cat的对象,这个不难理解。

        但当我这样定义时:   Animal a = new Cat();  

表示定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。

     那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,   定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。 

    所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;   同时,父类中的一个方法只有在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;   对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。也可以叫做动态绑定。

     动态绑定是指”在执行期间(而非编译期间)“判断所引用对象的实际类型,根据实际的类型调用其相应的方法。

    看下面这段程序:

class Father {
    public void func1() 

   {
        func2();
    }

 // 这是父类中的func2()方法,因为下面的子类中重写了该方法 ,所以在父类类型的引用中调用时,这个方法将不再有效,取而代之的是将调用子类中重写的func2()方法
    public void func2() {
        System.out.println("AAA");
    }
}
class Child extends Father { // func1(int i)是对func1()方法的一个重载
   由于在父类中没有定义这个方法,所以它不能被父类类型的引用调用
    所以在下面的main方法中child.func1(68)是不对的
    public void func1(int i) {
        System.out.println("BBB");
    } // func2()重写了父类Father中的func2()方法   如果父类类型的引用中调用了func2()方法,那么必然是子类中重写的这个方法
    public void func2() {
        System.out.println("CCC");
    }
}
public class PolymorphismTest {
    public static void main(String[] args) {
        Father child = new Child();
        child.func1();// 打印结果将会是什么? } }

         上面的程序是个很典型的多态的例子。子类Child继承了父类Father,并重载了父类的func1()方法,重写了父类的func2()方法。重载后的 func1(int i)和func1()不再是同一个方法,由于父类中没有func1(int i),那么,父类类型的引用child就不能调用func1(int  i)方法。而子类重写了func2()方法,那么父类类型的引用child在调用该方法时将会调用子类中重写的func2()
    }
}

那么该程序将会打印出什么样的结果呢?       很显然,应该是“CCC”。     

    对于多态,可以总结它为:       

     一、使用父类类型的引用指向子类的对象;

    二、该引用只能调用父类中定义的方法和变量;

    三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)

    四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。

多态的3个必要条件:

        1.继承   2.重写   3.父类引用指向子类对象。

原文地址:https://www.cnblogs.com/shuaiblog/p/9043415.html

时间: 2024-10-13 15:08:46

对java多态的理解的相关文章

考考你对java多态的理解

请看如下代码, 如果你能不运行得出正确答案, 那你真的超过99%的java程序员了. [本人属于最大头的那部分] public class A{ public String s = "A"; public void setS(String s){ this.s = s; } public String getS(){ return this.s; } } public class B extends A{ public String s = "B"; public

JAVA多态的理解

面向对象的三大特性:封装.继承.多态,其中最难理解的就是多态 以下是网上某大神给的一个例子: 1.继承关系 class A {          public String show(D obj){                 return ("A and D");          }             public String show(A obj){                 return ("A and A");          } }

Java中的继承、封装、多态的理解

Java中的继承.封装.多态 继承的理解: 1.继承是面向对象的三大特征之一,也是实现代码复用的重要手段.Java的继承具有单继承的特点,每个子类只有一个直接父类. 2.Java的继承通过extends关键字来实现,实现继承的类被称为子类,被继承的类称为父类(有的也称其为基类.超类),父类和子类的关系,是一种一般和特殊的关系.就像是水果和苹果的关系,苹果继承了水果,苹果是水果的子类,水果是苹果的父类,则苹果是一种特殊的水果. 3.Java使用extends作为继承的关键字,extends关键字在

java中对于多态的理解

面向对象: 类:具体的对象抽象而来,可以抽象的表示一类具有相同特征和行为的对象 对象:是由类的实例化而来,对象是类的一个实例 java中关于多态的理解 打个比方 父亲person有行为这个方法,里面包括几个动作:吃饭,睡觉,走路 父亲有三个儿子,三个儿子都继承了父亲的行为方法,所以三个儿子都有吃饭,睡觉,走路这些动作,但是三个儿子又分别有自己的动作--大儿子A会弹吉他,二儿子B会唱歌,三儿子C会打鼓 ... 1.Person person = new A(); 不是父类对象指向子类引用而是父类引

关于java的this、继承、多态的理解

今天主要学习的内容是关于this.继承.多态的理解,并对其作出总结. 1.This 就目前来说,从个人的实验来看,this主要是对于一个类的对象的引用.它出现的位置主要是以它出现的形式决定的. ①.this(参数类型)这是在在构造方法中调用重写的构造方法. ②.作为某个类的对象来调用类中属性或方法.(用在某个类中的成员方法,因为某个类的对象就可以通过.来调用) 2.extends 继承之前已经了解了一些,接下来就是进一步的总结. ①.protected类型的变量是适合子类和父类之间的使用的,即使

深入理解Java多态机制

从字节码层面来看,Java中的所有方法调用,最终无外乎转换为如下几条调用指令. invokestatic: 调用静态方法. invokespecial: 调用实例构造器<init>方法,私有方法和父类方法. invokevirtual: 调用所有的虚方法. invokeinterface: 调用接口方法,会在运行时再确定一个实现此接口的对象. invokedynamic: 调用动态方法.JDK 7引入的,主要是为了支持动态语言的方法调用. JVM提供了上述5条方法调用指令,所以不妨从字节码层面

Java入门——深入理解Java三大特性

Java入门——深入理解Java三大特性 本Blog内容: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法(getter,setter),如果不想被外界方法,我们大可不必提供方法给外界访问. 封装确实可以使我们容易地修改类的内部实现,而无需修改使用了该类的客户代码. 可以对成员变量进行更精确的控制.(在setter方法中进行实际意义的校验) 总结:控制属性访问权限,不是你想改就能改.容易修改属性类型.精确控制属性的取值范围. 继承 继承是使用已存在的类

Java多态的学习

首先,我要说明的是,继承.封装.多态并不是针对JAVA,c#或者其他某种语言产生的,它是面向对象思想下产生的一个概念. 让我自己说的话,我只能用三句话来描述(不知道对不对,请高手指点): * 继承:使得子类继承父类的属性和方法,也可以使用父类的功能. * 封装:将具体实现隐藏,只留给用户使用的接口. * 多态:相似类型在使用同一基类方法时,可以表现出与基类不同的行为. 一直记不住这些概念,百度了下,放在这供参考: 1.继承(inheritance)     继承是使用已存在的类的定义作为基础建立

多态的理解

今天有开始对多态的理解加深了,基础不好的话看别人的程序很麻烦了,要不断地测试,测试--然后想想为什么,为什么--等过了一两年再看原来的基础代码的时候友开发犯迷糊了,又开始犯迷糊,然后测试测试--回忆一下为什么这样那样--     Father{      视察(){          System.out.println("大家好好工作啊,你们辛苦了!");          System.out.println("基层的每个官员给我贿赂300块大洋,我保你们平安"