java基础(十二)继承和多态

本文详细介绍了Java中的继承和多态概念。继承允许子类重定义父类的属性和方法,多态则允许父类引用指向子类对象。动态绑定在运行时决定调用哪个重写的方法。此外,还探讨了对象转换、instanceof操作符以及Object类的equals方法的使用。最后,介绍了如何使用final关键字防止继承和方法重写。

1.1 基本概念(简单,自己理解)

继承:在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。

多态:使用父类对象的地方都可以使用子类的对象。多态意味着父类型的变量可以引用子类型的对象。

 

1.2 动态绑定

方法可以在沿着继承链的多个类中实现。JVM决定运行时调用哪个方法。

问题引出:已知GeometricObject()是Object的子类。toString方法在Object中定义,在GeometricObject内重写。

Object o = new GeometricObject();
System.out.println(o.toString);

求问,这里的o调用的哪个toString()呢?

 

为了回答这个问题,首先介绍两个术语:声明类型和实际类型

一个变量必须被声明为某种类型,变量的这个类型被称为它的声明类型,这里o的声明类型就是Object。

一个引用类型变量可以是一个null值或者是一个对声明类型实例(实例可以使用声明类型或它的子类型的构造方法创建)的引用。变量的实际类型是被变量引用的对象的实际类。这里o的实际类型是GeometricObject,o调用哪个toString()方法是由o的实际类型决定的,这称为动态绑定。会不停的向父类上面找相应的方法,直到在某一层找到这个方法(从实际类型子类到父类顺序找)进行调用。在编译时,编译器会根据参数类型、参数个数和参数顺序找到匹配的方法。

 

1.3 对象转换和instanceof操作符

一个对象的引用可以类型转换为对另一个对象的引用,这称为对象转换。

对象转换:

(1)隐式转换:Object o = new Student(); //子类直接赋给父类,隐式转换成父类类型

(2)显式转换:Student b = (Student) o; //显式转换,将一个父类变成一个子类(向下转换)否则编译器就不知道要转换的是哪个子类。

为了使得显示转换转换成功,必须确保要转换的对象是子类的一个实例(o是b的一个父类),为了验证这一点,使用操作符instanceof来实现。

void someMethod(Object myObject){
    if(myObject instanceof Circle){
       (Circle)myObject;
}
}

((Circle)object).getArea();//对象成员访问操作符(.)优先于类型转换操作符

基本数据类型转换会创建新的对象,而引用变量类型转换不会创建新的引用。

 

1.4 Object类的equals方法

equals(Object)方法是定义在Object类中的另外一个有用的方法,这个方法测试两个对象是否相等,源码实现如下:

public boolean equals(Object o){
    return (this==obj)
}

equals方法在JavaAPI的许多类中被重写,比如String类中的equals方法,被重写为了比较两个字符串内容是否相同

 

1.5 防止继承和重写

一个被final修饰的类和方法都不能被继承。被final修饰的数据域是一个常数。(表示最终类或者最终方法)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值