理解父类引用指向子类对象

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.父类引用指向子类对象。

 

 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个引用指的是继承,它是一种多态的一种体现方式。继承可以让子类拥有父类的属性和方法,并且在此基础上可以添加新的属性和方法。子类可以覆盖或重写父类的方法,实现不同的行为。继承是面向对象编程的重要特性之一。 ### 回答2: 多态是面向对象编程中非常重要的概念,它是指同一个对象在不同的情况下会呈现出不同的形态,这种灵活性和可扩展性使得程序更加复杂而富有弹性。父类的引用指向自己子类的对象,就是其中一种体现形式。 在面向对象编程中,父类和子类之间存在着继承关系。父类可以作为子类的通用模板,子类可以从父类继承其属性和方法,并且还可以定义自己的属性和方法。当父类的引用指向自己子类的对象时,程序就可以利用多态性来调用子类独有的方法,实现更加丰富的操作。 比如,假设有一个图形类Shape,它有一个方法draw用于绘制各种形状。然后我们有一个矩形类Rectangle和一个圆形类Circle,它们都是Shape类的子类,并且都有自己的draw方法。如果我们建立一个Shape类型的对象,然后让它调用子类的draw方法,就可以利用多态性实现不同形状的绘制。 具体实现的方式是,用Shape类的一个引用指向Rectangle或Circle类的一个对象,然后调用draw方法即可。由于Rectangle和Circle类都是Shape类的子类,它们都重写了父类的draw方法,因此程序会根据实际情况调用正确的draw方法,实现多态效果。 总之,父类的引用指向自己子类的对象是多态性的一种典型体现,它可以使程序更加灵活和扩展性强,提高了代码的可读性和可维护性。在面向对象编程中,多态性是非常重要的概念,程序员需要了解它的原理和实现方式,才能更好地利用它开发高质量的程序。 ### 回答3: 在面向对象编程中,多态是指同一个方法或操作可以被不同的对象执行,不同的对象可以拥有相同的方法但是会有不同的实现,这就是多态的体现。而父类的引用指向自己子类的对象也是多态的一种体现形式。 例如,假设有一个父类Animal和两个子类Cat和Dog,它们都有一个方法叫做makeSound()。当我们新建一个Animal类型的变量并将其赋值为Cat类型的实例时,我们可以通过调用makeSound()方法来发出猫的声音。同样地,当我们将Animal类型的变量赋值为Dog类型的实例时,我们调用该变量的makeSound()方法就可以听到狗的声音。 通过这种方式,我们可以在代码中使用父类的方法和属性,同时还可以使用子类的方法和属性,从而实现了多态。这种多态可以让我们的代码更加灵活和可扩展,因为我们可以在不修改原有代码的情况下添加新的子类来实现不同的功能。 总之,父类的引用指向自己子类的对象是多态的一种体现形式,它可以让我们的代码更加灵活和可扩展,从而提高代码的质量和可维护性。这也是面向对象编程中一个非常重要的概念,值得我们深入学习和理解

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值