Java的中继承
现实生活中常常出现一种大的类别里面细分了很多小的类别,比如大学生和学生,大学生除了学生的属性和方法外还有自己独有特别的属性和方法。这种情况,就需要用到继承
。
继承
继承就是让一个类拥有一个类的属性和方法。java中,Object是所有其他类的父类。
继承的关键字是extends。格式如下:
public class 子类名 extends 父类名{
}
访问修饰符
访问修饰符访问权限由小到大分为以下几类:
- private 私有的;
- package/friendly/default 缺省(不写);
- protected 受保护的;
- public 公共的;
具体的访问权限如下表(图片来自网络):
重写
有时候从父类继承的方法不一定符合子类的需求,这个时候就会用到重写,从而减少开发时间和维护成本。
重写需要满足:
- 必须既有继承关系;
- 子类除了访问权限可以扩大外,其他必须与父类一致;
隐藏
与重写类似,方法的重写是子类覆盖父类的对象方法 。隐藏
,就是子类覆盖父类的类方法
。
类方法指的就是静态方法,可以直接通过类调用,而无需实例化对象再调用。
public class VS {
public static void win(){
System.out.println("you win!")
}
public static void main(String[] args){
//类方法可直接通过类调用
VS.win();
}
类方法比较特殊的是,只根据引用的类型有关,与其具体指向无关。
Human h = new Woman();
h.paly();
这里虽然h实际指向是子类,但是依然会调用父类的类方法,即使h等于null,结果依然一样,所以为了避免歧义,建议直接用类名调用类方法
。
对象转型
对象和引用都是有类型的,通常情况下,引用类型和对象类型是一样的。但是如果两边类型不同,就需要用到对象转型了。
判断是否转换成功的技巧是:把右边当作左边用,看是否能说通
。
- 子类转成父类(向上转型)
自动转型
Student s = new Student();
Undergraduate u = new Undergraduate();
//把大学生当学生用,可行!
s = u;
- 父类转成子类(向下转型)
强制转型
Student s = new Student();
Undergraduate u = new Undergraduate();
Pupil p = new Pupil();
s = u;
//s实际指向的对象是大学生,所以可以成功
u = (Undergraduate)s;
s = p;
//s实际指向的对象是小学生类,失败。
u = (Undergraduate)s;
所以能否转换成功的关键就是看需要转换的引用实际指向的是什么对象。失败的话会抛出 ClassCastException
异常。
多态
多态包括两种,一种是操作符的多态
,另一种就是类的多态
。
- 操作符的多态指的就是:+可以作为算术运算,也可以作为字符串连接;
- 类的多态指的是:父类引用指向子类对象。
实现类的多态需要满足:
- 父类(接口)引用指向子类对象;
- 调用的方法有重写。
多态的意思就是都是同一个类型,调用同一个方法,却能呈现不同的状态
。
super
实例化子类,父类的构造方法一定会被调用,默认调用父类无参的构造方法。如果父类有多个构造方法,可使用关键字super 显式调用父类带参的构造方法,使用格式就是在子类构造方法中添加super(参数名)
。
除了构造方法之外,super.属性名
,super.方法名
可分别调用父类属性和方法,用法类似于this,区别在于一个指的是当前类,一个指的是父类。