Java类的继承是指在一个类的基础上创建一个新的类,新的类继承了原有类的所有属性和方法,并且可以在此基础上添加新的属性和方法。这种类之间的关系被称为父子类关系,原有类称为父类或超类,新的类称为子类或派生类。
extends
来创建一个子类。子类继承父类的属性和方法,可以使用 super
关键字来访问父类的属性和方法。例题:
在这个例子中, Dog
类继承自 Animal
类。 Dog
类中有一个新的方法 bark()
,但是它也可以使用 其他方法,也是从 Animal
类中继承来的。
书本7.2
在 Java 中,所有类都直接或间接继承自 java.lang.Object
类。因此,Object
类是 Java 类层次结构的根类,它定义了所有 Java 对象的基本属性和方法。
常用方法:
equals(Object obj)
:比较对象是否相等,返回一个布尔值。
toString()
:返回对象的字符串表示形式,默认实现返回对象的类名和哈希码值。
getClass()
:返回对象的运行时类。
还提供了一些其他方法,但这些方法通常需要在子类中重写才能使用。 实际开发中,我们可以通过重写 equals()
、hashCode()
和 toString()
等方法来满足自己的需求。例如,在我们自定义的类中,重写 equals()
方法可以比较两个对象的属性是否相等,而不是只比较它们的引用是否相等。
在 Java 中,每个对象都有一个 getClass()
方法,它返回对象的运行实例。
格式:getClass();getname();
getClass()
方法返回一个 Class
类型的对象,它包含了与该对象相关的类的信息。使用 Class
对象,我们可以获取类的名称、包名、构造方法、字段、方法等信息,还可以通过反射来创建对象、调用方法等。
需要注意的是,getClass()
方法返回的是一个运行时类型,而不是编译时类型。如果对象为 null
,则调用该方法将抛出 NullPointerException
异常。
在 Java 中,所有类都直接或间接继承自 java.lang.Object
类。因此,Object
类的方法对于所有对象都是可用的,包括 toString()
方法。
这个例子中,我们将 toString()
方法重写为返回一个带有 name
和 age
属性值的字符串。然后我们可以使用 System.out.println()
方法来打印这个对象的字符串表示形式:
书本例7.3
equals()方法
在 Java 中,所有类都直接或间接继承自 java.lang.Object
类。因此,Object
类的方法对于所有对象都是可用的,包括 equals(Object obj)
方法。
equals(Object obj)
方法用于比较两个对象是否相等,它的默认实现是比较两个对象的引用是否相等,即两个对象是否指向同一个内存地址。
因此,我们需要在自己的类中重写 equals(Object obj)
方法,以便比较对象的属性值。重写 equals(Object obj)
方法时,通常还需要重写 hashCode()
方法,以确保相等的对象具有相同的哈希码。
在这个例子中,我们重写了 equals(Object obj)
方法,比较了两个 Person
对象的 name
和 age
属性是否相等。我们还重写了 hashCode()
方法,使用 Objects.hash()
方法来计算哈希码,其中包含了 name
和 age
属性值。
书本例7.4
分为向上转型和向下转型两种。
指的是将一个子类对象赋值给一个父类引用变量,这个过程是自动的。也就是说,向上转型不需要显式的类型转换操作。
在这个例子中,我们创建了一个 Cat
对象,并将它赋值给一个 Animal
类型的引用变量 animal
。由于 Cat
类是 Animal
类的子类,因此这个过程是自动的,无需显式的类型转换。
向上转型的好处是可以提高代码的灵活性和可扩展性。因为父类引用可以指向子类对象,这样就可以在程序运行时动态地选择使用不同的子类对象,而不需要改变代码的其他部分。
在这个例子中,我们创建了一个 Animal
类型的对象,并将它赋值给一个 Animal
类型的引用变量 animal
。然后,我们将 animal
强制转换为 Cat
类型的引用变量 cat
。由于 animal
对象实际上是一个 Cat
类型的对象,因此这个强制类型转换操作是合法的。
Java 中的 instanceof
是一种运算符,用于判断一个对象是否为指定类型或其子类型的实例。
需要注意的是,使用 instanceof
运算符进行类型判断时,如果对象为 null
,则始终返回 false
书本7.4
Java 中的方法重载指的是在同一个类中定义多个方法,它们具有相同的名称,但是参数列表不同。方法重载允许使用相同的方法名称来执行不同的操作,以提高代码的灵活性和可读性。
在 Java 中,方法重载的规则如下:
public
方法和一个 private
方法,它们的名称和参数列表相同。书本7.8
是一个关键字,它可以用于修饰类、方法和变量,表示它们的值或引用是不可更改的。final
变量:用 final
关键字修饰的变量表示常量,即该变量的值一旦被赋值后就不能再被改变。可以在定义时直接赋值,也可以在构造方法中赋值
当 final
用于修饰类时,表示该类是不可继承的。也就是说,不能定义该类的子类。
当 final
用于修饰方法时,表示该方法是不可重写的。也就是说,不能在子类中重新定义该方法。
当 final
用于修饰变量时,表示该变量的值或引用是不可更改的。如果是基本数据类型,表示该变量的值不能更改;如果是引用类型,表示该变量引用的对象不能更改,但是对象的属性值可以更改。
如书本的7.10,在运行前不允许修改,会报错。
用 final
关键字修饰的方法表示该方法不能被子类重写。
用 final
关键字修饰的类表示该类不能被继承
使用 final
关键字可以提高程序的安全性和可维护性。常量不会被修改,可以确保程序中关键数值的不变性,避免出现不必要的错误;不可继承的类和方法则避免了不必要的复杂性,使程序更加稳定和可靠。
Java 的多态是指同一个方法名可以被不同的对象调用,产生不同的行为结果。具体来说,多态有两种形式:编译时多态和运行时多态。
书本7.12
多态是 Java 中的一个重要概念,可以提高代码的灵活性和可扩展性,使代码更加简洁和易于维护