Java基础(六)-类的继承
继承的概念
- 子类(subclass)继承于父类/超类(superclass),最多只能继承一次。
- 继承的关键字是extends。
- 通过类的继承,子类可以调用、覆盖父类的成员,并添加新的成员。
- 所有的类都直接或间接继承于java.lang.Object类,因此都具备该类的方法。
子类覆盖父类成员
- 覆盖是Java的“多态性”的体现。
- 子类中,定义相同名字的成员变量,会覆盖父类的成员变量。
- 定义相同名字与相同参数列表的成员方法,会覆盖父类的成员方法。
- 覆盖后,父类成员被隐藏,需要是用super调用。
子类继承于父类
- 在子类中,可用super.成员 调用父类成员。
- 调用父类构造方法为super()。
- 同名的外部传参覆盖子类变量,同名的子类变量覆盖父类变量。
- 即,同名外部传参出现时,调用子类需要this.成员。
- 同名子类成员出现时,调用父类需要super.成员。
- 注意:
- new子类对象时,会先调用父类的构造方法,再调用子类的构造方法。
- 为了帮助继承自父类的成员做初始化操作。
- 子类的构造方法中,如果有super(),则其必须是第一个语句。
- 子类若不使用super(),那么父类必须提供参数为空的构造方法。
- 父类的私有成员不会被继承,父类的构造方法亦然。
- new子类对象时,会先调用父类的构造方法,再调用子类的构造方法。
public class Student extends Person{
//继承Person类
String school;
Student(String name, String school){
super(name);
//子类中调用父类构造方法
this.school = school;
}
void show(){
System.out.println(name+" "+school);
}
public static void main(String[] args){
Student s = new Student("student name", "student school");
s.show();
}
}
class Person{
//Person类
String name;
Person(String name){
this.name = name;
}
}
父类对象指向子类对象
- 使用父类对象指向子类对象后:
- 该对象仅留下父类成员,及被子类覆盖的父类成员,子类新成员不保留。
- 格式为Superclass className = new Subclass();
- 这种指向操作被称为“向上转型”,是安全的。
- 对应的,有一种“向下转型”,是将父类对象,显示类型转换成子类对象后,赋值给子类对象。
- 即
Student stu = (Student) per;
- 即
- 对应的,有一种“向下转型”,是将父类对象,显示类型转换成子类对象后,赋值给子类对象。
class Student extends Person{
void show(){
System.out.println("show1");
}
void show2(){
System.out.println("show2");
}
public static void main(String[] args){
Person per = new Student();
per.show();
//per.show2();
//调用了子类特有方法,会出错。
}
}
class Person{
void show(){
System.out.println("Person class");
}
}
不可被继承的成员与最终类
- 不可被继承的成员:
- 使用final修饰的成员。
- 可被继承,但无法被覆盖。
- 最终类:
- 由final修饰的类。
- 不可被继承,无子类。
- 最终的方法:
- 由final或private修饰的方法。
- 都不可被覆盖,因此被称为最终的方法。
- 常量:
- 由final与static修饰。
- 只能赋值一次。
所有类的父类-Object类
常用的Object类方法
方法 | 功能 |
public boolean equals(Object obj) | 判断两个对象是否相同 |
public String toString() | 将对象转换成字符串 |
public final Class getClass() | 返回运行时对象所属的类 |
protected Object clone() | 返回对象副本 |
- equals():
- 比较内容是否一致。
- 与==不同,==是比较地址,即是否是同一个对象。
- toString():
- 将对象转换成字符串返回。
- 通常返回结果不是我们所需要的,因此一般会覆盖它。
- instanceof:
- 判断对象是否属于某类
- this instanceof Student == true;表示本对象属于Student类
共有 0 条评论