类的继承
Java类的继承是指在一个类的基础上创建一个新的类,新的类继承了原有类的所有属性和方法,并且可以在此基础上添加新的属性和方法。这种类之间的关系被称为父子类关系,原有类称为父类或超类,新的类称为子类或派生类。
使用关键字 extends
来创建一个子类。子类继承父类的属性和方法,可以使用 super
关键字来访问父类的属性和方法。
例题:
在这个例子中, Dog
类继承自 Animal
类。 Dog
类中有一个新的方法 bark()
,但是它也可以使用 其他方法,也是从 Animal
类中继承来的。
书本7.2
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()
方法。
这个例子中,我们将 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
类型的对象,因此这个强制类型转换操作是合法的。
使用instanceof关键字判断对象类型
Java 中的 instanceof
是一种运算符,用于判断一个对象是否为指定类型或其子类型的实例。
需要注意的是,使用 instanceof
运算符进行类型判断时,如果对象为 null
,则始终返回 false
书本7.4
方法的重载
Java 中的方法重载指的是在同一个类中定义多个方法,它们具有相同的名称,但是参数列表不同。方法重载允许使用相同的方法名称来执行不同的操作,以提高代码的灵活性和可读性。
在 Java 中,方法重载的规则如下:
- 方法名称必须相同。
- 方法的参数列表必须不同,可以包括参数的类型、数量和顺序。
- 方法的返回类型可以相同,也可以不同,但是不能仅仅通过返回类型的不同来区分方法。
- 方法的修饰符可以不同,例如可以有一个
public
方法和一个private
方法,它们的名称和参数列表相同。
书本7.8
final关键字
是一个关键字,它可以用于修饰类、方法和变量,表示它们的值或引用是不可更改的。final
变量:用 final
关键字修饰的变量表示常量,即该变量的值一旦被赋值后就不能再被改变。可以在定义时直接赋值,也可以在构造方法中赋值
当 final
用于修饰类时,表示该类是不可继承的。也就是说,不能定义该类的子类。
当 final
用于修饰方法时,表示该方法是不可重写的。也就是说,不能在子类中重新定义该方法。
当 final
用于修饰变量时,表示该变量的值或引用是不可更改的。如果是基本数据类型,表示该变量的值不能更改;如果是引用类型,表示该变量引用的对象不能更改,但是对象的属性值可以更改。
如书本的7.10,在运行前不允许修改,会报错。
final方法
用 final
关键字修饰的方法表示该方法不能被子类重写。
final类
用 final
关键字修饰的类表示该类不能被继承
使用 final
关键字可以提高程序的安全性和可维护性。常量不会被修改,可以确保程序中关键数值的不变性,避免出现不必要的错误;不可继承的类和方法则避免了不必要的复杂性,使程序更加稳定和可靠。
多态
同一个方法名可以被不同的对象调用,产生不同的行为结果。具体来说,多态有两种形式:编译时多态和运行时多态。
书本7.12
多态是 Java 中的一个重要概念,可以提高代码的灵活性和可扩展性,使代码更加简洁和易于维护