类的继承

        Java类的继承是指在一个类的基础上创建一个新的类,新的类继承了原有类的所有属性和方法,并且可以在此基础上添加新的属性和方法。这种类之间的关系被称为父子类关系,原有类称为父类或超类,新的类称为子类或派生类。

     使用关键字 extends 来创建一个子类。子类继承父类的属性和方法,可以使用 super 关键字来访问父类的属性和方法。

例题:

java 抽象类有多个继承子类 java抽象类的继承_java

 

         在这个例子中, Dog 类继承自 Animal 类。 Dog 类中有一个新的方法 bark(),但是它也可以使用 其他方法,也是从 Animal 类中继承来的。

书本7.2

java 抽象类有多个继承子类 java抽象类的继承_开发语言_02

object类

        在 Java 中,所有类都直接或间接继承自 java.lang.Object 类。因此,Object 类是 Java 类层次结构的根类,它定义了所有 Java 对象的基本属性和方法。

常用方法:

equals(Object obj):比较对象是否相等,返回一个布尔值。

toString():返回对象的字符串表示形式,默认实现返回对象的类名和哈希码值。

getClass():返回对象的运行时类。

        还提供了一些其他方法,但这些方法通常需要在子类中重写才能使用。  实际开发中,我们可以通过重写 equals()hashCode()toString() 等方法来满足自己的需求。例如,在我们自定义的类中,重写 equals() 方法可以比较两个对象的属性是否相等,而不是只比较它们的引用是否相等。

getclass()方法

        在 Java 中,每个对象都有一个 getClass() 方法,它返回对象的运行实例。

格式:getClass();getname();

getClass() 方法返回一个 Class 类型的对象,它包含了与该对象相关的类的信息。使用 Class 对象,我们可以获取类的名称、包名、构造方法、字段、方法等信息,还可以通过反射来创建对象、调用方法等。

需要注意的是,getClass() 方法返回的是一个运行时类型,而不是编译时类型。如果对象为 null,则调用该方法将抛出 NullPointerException 异常。

toString()方法

        在 Java 中,所有类都直接或间接继承自 java.lang.Object 类。因此,Object 类的方法对于所有对象都是可用的,包括 toString() 方法。

java 抽象类有多个继承子类 java抽象类的继承_java 抽象类有多个继承子类_03

        这个例子中,我们将 toString() 方法重写为返回一个带有 nameage 属性值的字符串。然后我们可以使用 System.out.println() 方法来打印这个对象的字符串表示形式:

书本例7.3

java 抽象类有多个继承子类 java抽象类的继承_开发语言_04

equals()方法

        在 Java 中,所有类都直接或间接继承自 java.lang.Object 类。因此,Object 类的方法对于所有对象都是可用的,包括 equals(Object obj) 方法。

equals(Object obj) 方法用于比较两个对象是否相等,它的默认实现是比较两个对象的引用是否相等,即两个对象是否指向同一个内存地址。

        因此,我们需要在自己的类中重写 equals(Object obj) 方法,以便比较对象的属性值。重写 equals(Object obj) 方法时,通常还需要重写 hashCode() 方法,以确保相等的对象具有相同的哈希码。

java 抽象类有多个继承子类 java抽象类的继承_开发语言_05

 

        在这个例子中,我们重写了 equals(Object obj) 方法,比较了两个 Person 对象的 nameage 属性是否相等。我们还重写了 hashCode() 方法,使用 Objects.hash() 方法来计算哈希码,其中包含了 nameage 属性值。        

书本例7.4

java 抽象类有多个继承子类 java抽象类的继承_java_06

 

java 抽象类有多个继承子类 java抽象类的继承_java_07

 

对象类型的转换

         分为向上转型和向下转型两种。

向上转型

        指的是将一个子类对象赋值给一个父类引用变量,这个过程是自动的。也就是说,向上转型不需要显式的类型转换操作。

java 抽象类有多个继承子类 java抽象类的继承_开发语言_08

在这个例子中,我们创建了一个 Cat 对象,并将它赋值给一个 Animal 类型的引用变量 animal。由于 Cat 类是 Animal 类的子类,因此这个过程是自动的,无需显式的类型转换。

 

向上转型的好处是可以提高代码的灵活性和可扩展性。因为父类引用可以指向子类对象,这样就可以在程序运行时动态地选择使用不同的子类对象,而不需要改变代码的其他部分。

向下转型

        向上转型之后,父类引用变量只能访问子类对象中继承自父类的属性和方法,而无法访问子类中特有的属性和方法。如果需要访问子类中特有的属性和方法,需要将父类引用变量转换为子类类型,这就是向下转型。

java 抽象类有多个继承子类 java抽象类的继承_java 抽象类有多个继承子类_09

         在这个例子中,我们创建了一个 Animal 类型的对象,并将它赋值给一个 Animal 类型的引用变量 animal。然后,我们将 animal 强制转换为 Cat 类型的引用变量 cat。由于 animal 对象实际上是一个 Cat 类型的对象,因此这个强制类型转换操作是合法的。

使用instanceof关键字判断对象类型

        Java 中的 instanceof 是一种运算符,用于判断一个对象是否为指定类型或其子类型的实例。

        需要注意的是,使用 instanceof 运算符进行类型判断时,如果对象为 null,则始终返回 false

 书本7.4

java 抽象类有多个继承子类 java抽象类的继承_开发语言_10

 

方法的重载

Java 中的方法重载指的是在同一个类中定义多个方法,它们具有相同的名称,但是参数列表不同。方法重载允许使用相同的方法名称来执行不同的操作,以提高代码的灵活性和可读性。

在 Java 中,方法重载的规则如下:

  • 方法名称必须相同。
  • 方法的参数列表必须不同,可以包括参数的类型、数量和顺序。
  • 方法的返回类型可以相同,也可以不同,但是不能仅仅通过返回类型的不同来区分方法。
  • 方法的修饰符可以不同,例如可以有一个 public 方法和一个 private 方法,它们的名称和参数列表相同。

书本7.8

java 抽象类有多个继承子类 java抽象类的继承_子类_11

 

java 抽象类有多个继承子类 java抽象类的继承_java_12

 

final关键字

是一个关键字,它可以用于修饰类、方法和变量,表示它们的值或引用是不可更改的。final 变量:final 关键字修饰的变量表示常量,即该变量的值一旦被赋值后就不能再被改变。可以在定义时直接赋值,也可以在构造方法中赋值

        当 final 用于修饰类时,表示该类是不可继承的。也就是说,不能定义该类的子类。

        当 final 用于修饰方法时,表示该方法是不可重写的。也就是说,不能在子类中重新定义该方法。

        当 final 用于修饰变量时,表示该变量的值或引用是不可更改的。如果是基本数据类型,表示该变量的值不能更改;如果是引用类型,表示该变量引用的对象不能更改,但是对象的属性值可以更改。

如书本的7.10,在运行前不允许修改,会报错。

java 抽象类有多个继承子类 java抽象类的继承_子类_13

 

final方法

final 关键字修饰的方法表示该方法不能被子类重写。

final类

final 关键字修饰的类表示该类不能被继承

        使用 final 关键字可以提高程序的安全性和可维护性。常量不会被修改,可以确保程序中关键数值的不变性,避免出现不必要的错误;不可继承的类和方法则避免了不必要的复杂性,使程序更加稳定和可靠。

多态

同一个方法名可以被不同的对象调用,产生不同的行为结果。具体来说,多态有两种形式:编译时多态和运行时多态。

书本7.12

java 抽象类有多个继承子类 java抽象类的继承_java 抽象类有多个继承子类_14

         多态是 Java 中的一个重要概念,可以提高代码的灵活性和可扩展性,使代码更加简洁和易于维护