Java基础(六)-类的继承

继承的概念

  • 子类(subclass)继承于父类/超类(superclass),最多只能继承一次。
  • 继承的关键字是extends。
  • 通过类的继承,子类可以调用、覆盖父类的成员,并添加新的成员。
  • 所有的类都直接或间接继承于java.lang.Object类,因此都具备该类的方法。

子类覆盖父类成员

  • 覆盖是Java的“多态性”的体现。
  • 子类中,定义相同名字的成员变量,会覆盖父类的成员变量。
  • 定义相同名字与相同参数列表的成员方法,会覆盖父类的成员方法。
    • 覆盖后,父类成员被隐藏,需要是用super调用。

子类继承于父类

  • 在子类中,可用super.成员 调用父类成员。
    • 调用父类构造方法为super()。
  • 同名的外部传参覆盖子类变量,同名的子类变量覆盖父类变量。
    • 即,同名外部传参出现时,调用子类需要this.成员。
    • 同名子类成员出现时,调用父类需要super.成员。
  • 注意:
    • new子类对象时,会先调用父类的构造方法,再调用子类的构造方法。
      • 为了帮助继承自父类的成员做初始化操作。
    • 子类的构造方法中,如果有super(),则其必须是第一个语句。
    • 子类若不使用super(),那么父类必须提供参数为空的构造方法。
    • 父类的私有成员不会被继承,父类的构造方法亦然。

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类

You may also like...

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注