面向对象——三大特征之一继承

98 阅读7分钟

继承

一些基本概念

  1. 子类可以继承父类的非私有属性和方法。子类可以使用父类的属性和方法,无需重写编写相同的代码。
  2. 子类可以添加自己的属性和方法。子类可以增加父类中没有的属性和方法,从而增加代码的灵活性和可拓展性。
  3. 子类的构造方法可以调用父类的构造方法。在子类的构造方法中使用super关键字可以调用父类的构造方法,从而初始化父类的属性。但不能继承构造方法
  4. Object类是所有类的根类
  5. Java中的类只支持单一继承,每个类只能有一个父类(直接父类)。单继承特性
  6. 子类可以成为其他类的父类,从而建立多级继承关系

tips:

继承提供了一种有效的方式类重用代码和组织类层次结构。但是,过度使用会导致复杂的代码结构和性能问题。

示例

// 父类:动物
class Animal {
    String name;

    public void eat() {
        System.out.println("动物吃东西");
    }

    public void sleep() {
        System.out.println("动物睡觉");
    }
}

// 子类:狗
class Dog extends Animal {
    public void bark() {
        System.out.println("狗叫");
    }
}

// 测试类
public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.name = "旺财";
        dog.eat(); // 调用父类的方法
        dog.sleep(); // 调用父类的方法
        dog.bark(); // 子类自己的方法
    }
}

使用继承实现子类以及super关键字调用

  1. 使用继承定义部门类及子类

  2. 使用super关键字调用父类成员

    super的目的是访问直接父类中被隐藏的内容,进一步提高代码的重用性和灵活性。

    其可以访问父类的构造方法,还可以访问父类的成员,包括父类的字段、普通方法等。

    语法规则:

    调用父类构造方法:super([实参列表]);

    调用父类属性和方法:super.<父类字段名/方法名>

this和super的区别

区别说明
调用方法this访问本类中的方法,包括从父类继承的方法;super访问父类的方法。
调用构造方法this([参数列表])表示调用本类的构造方法,必须放在构造方法的首行;super.([参数列表])表示调用父类构造,必须放在子类构造方法的首行。如果表示用父类的无参构造,即super()可省略。
调用字段this. 字段:调用的时当前对象的字段,包括从父类继承的字段;super.字段:调用父类中的字段。
使用this在实例方法中可以使用,在static方法中不能使用,每个类都有this;super在实例方法中可以使用,在static方法中不能使用,只能出现在子类。
其他区别this表示当前对象,super不能表示当前对象。

重写

在子类中可以以根据需求对从父类继承的方法进行重新编写,这称为方法的重写或方法的覆盖。

方法重写需满足以下要求:

  1. 在继承关系中。
  2. 重写方法与被重写方法必须有相同的方法名称。
  3. 重写方法与被重写方法必须有相同的参数列表。
  4. 重写方法的返回值类型必须和被重写方法的返回值类型相同或是其子类。
  5. 重写方法缩小被重写方法的访问权限。
  6. 不能用子类的非静态犯法重写(覆盖)父类的静态方法,否则编译错误。
  7. 不能重写父类中的最终方法。
  8. 不能用子类的静态方法重写父类的实例方法。

重载和方法重写的区别

方法重载指的是在同一个类中,定义了多个方法,它们的方法名相同但参数列表不同(参数类型、个数和顺序)。编译器会根据不同参数列表自动匹配调用对应的方法。方法重载的目的是为了提高代码的复用性和可读性。

方法重写指的是子类重写了父类的方法,方法名和参数列表都相同。重写方法必须与父类方法的返回类型、异常抛出等相同或兼容。当我们调用一个对象的被重写的方法时,实际上会调用子类中的方法,而不是父类中的方法。重写方法的目的是为了改变方法的实现方式,使得子类可以根据自己的特殊需求来实现父类的方法。

总的来说,方法重载是在一个类中定义多个同名但参数不同的方法,而方法重写是在子类中重写父类的方法,方法名和参数都相同。方法重载是编译时对台,方法重写是运行时多态。

final关键字

在Java中,final是一个关键字,用于修饰变量、方法和类,表示他们是不可改变的或不可继承的。

  1. final修饰变量:final修饰的变量称为常量,一旦被初始化,就无法再次被修改。
  2. final修饰方法:final修饰的方法称为不可覆盖方法,子类无法重写该方法。
  3. final修饰类:final修饰的类称为不可继承类,表示该类不能被其他类继承。

方法隐藏

父类和子类拥有相同名字的属性或者方法(方法隐藏只有一种形式,就是父类和子类存在签名相同的静态方法)时,父类的同名属性或者方法形式上不见了,实际还是存在。

示例

class Parent {
    public void method() {
        System.out.println("Parent method");
    }
}

class Child extends Parent {
    // 隐藏父类的 method() 方法
    public void method() {
        System.out.println("Child method");
    }

    public static void main(String[] args) {
        Child child = new Child();
        child.method(); // 输出 "Child method"
    }
}

Object类

Object类是Java语言中类层次结构的根类,也就是说任何一个类都是该类的直接或者间接子类。如果定义一个Java类时没有使用extends关键字声明其父类,则其父类为java.lang.Object类。Object类定义了“对象”的基本行为,被子类继承并实现 。

Java Object 类可以解决参数的统一问题,也就是说使用 Object类可以接收所有的数据类型。在Java中,只有Object不存在继承关系,所有类默认情况下都是Object子类。

常用方法

Object类中定义了一些方法,这些方法可以被子类继承和重写。以下是Object类中的一些常用方法:

  1. public String toString(): 返回对象的字符串表示形式,通常用于调试和日志记录。
  2. public boolean equals(Object obj): 比较两个对象是否相等,默认情况下使用引用相等性比较。
  3. public int hashCode(): 返回对象的哈希码值,用于散列表等数据结构中。
  4. protected void finalize() throws Throwable: 在对象被垃圾回收器回收之前调用,可以在此方法中释放资源。
  5. public final Class<?> getClass(): 返回对象的运行时类。
  6. public String getName(): 返回对象的类名。
  7. public void setName(String name): 设置对象的类名。
  8. public Method[] getMethods(): 返回对象的所有公共方法。
  9. public Object invokeMethod(String name, Object args): 调用对象的指定公共方法。
  10. public Object invokeMethod(String name, Object arg1, Object arg2, ...): 调用对象的指定公共方法,可变参数。
  11. public Field getField(String name): 返回对象的指定公共字段。
  12. public Object getField(String name): 返回对象的指定公共字段的值。
  13. public boolean isInstance(Object obj): 判断对象是否是该类的实例。
  14. public Class<?> getSuperclass(): 返回对象的父类。
  15. public boolean isPrimitive(): 判断对象是否为原始类型。
  16. public void setAccessible(boolean flag): 设置对象的可访问标志。

以上是Object类中的一些常用方法,子类可以通过重写这些方法来实现自己的行为。