jquery动态绑定事件的方法_关于多态方法动态绑定的一点思考

学习关于多态方法方法动态绑定,有一点让我疑惑。《java核心技术卷一》和廖雪峰的官方java教程都给出了非常权威的讲解,但仍让我产生一些疑问,这里是我的一点思考。

这里我仍采用廖雪峰老师的示例:

class Person{
    public void run(){
        System.out.println("Person.run");
    }
}
​
class Student extends Person{
    @override
    public void run(){
        System.out.println("Student.run");
    }
}
​
Person p = new Student();

廖老师堆以上示例说:

那么,一个实际类型为 Student,引用类型为 Person的变量,调用其 run()方法,调用的是 Person还是 Studentrun()方法?

可见p的实际类型为Student,引用类型为Person。

根据《java核心技术卷一》第164页第四点:

程序运行并且采用动态绑定调用方法时,虚拟机必须调用与x所引用对象的实际类型对应的那个方法。假设x的实际类型是D,它是C的子类。如果D类定义了方法f(String),就会调用这个方法;否则,将在D类的超类中寻找f(String),以此类推。

和廖雪峰的java教程面向对象基础中的多态一节:

Java的实例方法调用是基于运行时的实际类型的动态调用,而非变量的声明类型。

按照《java核心技术》和廖老师的讲解,p调用的run方法是Student类的方法,即结果为"Student.run"。

p.run();
// "student.run"

事实也的确如此,没毛病。但来看另一种情况:

class Student extends Person{
    @override
    public void run(){
        System.out.println("Student.run");
    }
    // 在子类中定义自身特有的方法
    public void show(){
        System.out.println("my own method");
    }
}
​
Person p = new Student();

按照《java核心技术》和廖老师的讲解,p的实际类型为Student,那么就应该能调用自己的show方法。可实际上并不能。

p.show() // 会报错

这里百思也得不到他的姐姐了,问题出在哪呢?

p的实际类型不是Student嘛,为什么调用不了show方法呢?这说不通。

因此,我猜测,p的实际类型并不是Student,而是Person!

那这么说来《java核心技术》和廖老师还能错了?我认为《核心技术》书和廖老师并没有错,而是容易让初学者理解错。

问题出在哪?我猜测是如廖老师的讲解,run方法调用时p的实际类型的确是Student。p的实际类型可以为Student,但是需要一个条件。这个条件就是run方法的调用,也就是存在子类重写父类方法的情况。

只有存在子类重写父类方法且调用此重写方法时,p的实际类型暂时可以看成是子类Student。但是除此之外,p的类型始终为Person。这样貌似就说的通了。

// 第一种
Person p1 = new Studnet();
// 第二种
Student s = new Student();
Person p2 = (Person) s;

我认为以上两种写法是等价的,既然第二种写法p2的类型为Person,那么第一种也应该是Person。这是以上我大胆猜测的简单证明。

注:

  1. 以上纯粹属于个人观点,如有不妥之处,望指正
  2. 本文有引用《java核心技术卷一》一书和廖雪峰的官方网站java教程的部分内容
  3. 若未获得本人同意,请勿转载本文
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值