目录
一. 继承
二. 多态
三. 引用类型的转换 检查
向上转型(Upcasting)
向下转型(Downcasting)
四. final关键字
一. 继承
在 Java 中,继承(Inheritance)是面向对象编程的一个重要特性,它允许一个类(子类)继承另一个类(父类)的属性和方法。
优点
代码复用:子类可以直接使用父类中定义的属性和方法,无需重新编写相同的代码,提高了代码的可重用性。
层次结构:有助于建立清晰的类层次结构,反映现实世界中的对象关系。
易于扩展:通过继承,可以在不修改父类代码的情况下,为子类添加新的属性和方法,扩展功能。
语法
使用 extends
关键字来表示继承关系。
class Parent {
// 父类的属性和方法
}
class Child extends Parent {
// 子类的属性和方法
}
访问控制
子类可以访问父类的
public
和protected
成员。如果子类和父类在同一个包中,子类还可以访问父类的默认访问权限(没有明确修饰符)的成员。
方法重写(Override)
子类可以重写父类的方法,方法名、参数列表和返回类型必须与父类被重写的方法相同。重写的方法体可以根据子类的需求进行修改。
class Parent {
public void method() {
System.out.println("Parent's method");
}
}
class Child extends Parent {
@Override
public void method() {
System.out.println("Child's method");
}
}
构造方法
子类的构造方法在创建对象时会首先调用父类的无参构造方法(如果父类没有定义无参构造方法,必须在子类的构造方法中显式地调用父类的有参构造方法)。
可以在子类的构造方法中通过
super
关键字调用父类的构造方法。
示例
class Animal {
protected String name;
public void eat() {
System.out.println(name + " is eating.");
}
}
class Dog extends Animal {
public Dog(String name) {
this.name = name;
}
public void bark() {
System.out.println(name + " is barking.");
}
public static void main(String[] args) {
Dog dog = new Dog("Buddy");
dog.eat();
dog.bark();
}
}
继承使得代码更加简洁、可维护和可扩展,但也要注意合理使用,避免过度复杂的继承层次和不必要的继承。
二. 多态
在 Java 中,多态(Polymorphism)是面向对象编程的重要特性之一,它允许不同的对象对同一消息或操作做出不同的响应。
多态的类型
-
编译时多态(方法重载 - Overloading):在同一个类中,存在多个方法具有相同的名称,但参数的数量、类型或顺序不同。在编译时,根据传递的参数类型和数量来决定调用哪个具体的方法。
例如:
class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
}
-
运行时多态(方法重写 - Overriding):子类继承父类的方法,并对其进行重新定义。在运行时,根据对象的实际类型来决定调用子类还是父类中被重写的方法。
例如:
class Animal {
public void makeSound() {
System.out.println("The animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("The dog barks");
}
}
实现多态的条件
-
继承:子类继承父类。
-
方法重写:子类重写父类的方法。
-
父类引用指向子类对象:通过父类类型的引用变量来引用子类对象。
例如:
Animal animal = new Dog();
animal.makeSound(); // 实际调用的是 Dog 类中重写的 makeSound 方法
多态的优点
增强了代码的灵活性和可扩展性,使得代码更易于维护和修改。
提高了代码的复用性,不同的对象可以通过相同的方法调用实现不同的功能。
使得程序的设计更加符合现实世界的逻辑,能够更好地模拟不同类型对象的行为差异。
总之,多态是 Java 中非常强大的特性,合理运用多态可以使程序更加简洁、高效和易于理解。
三. 引用类型的转换 检查
在 Java 中,当涉及多态和引用类型的转换时,需要特别注意类型的兼容性和转换的安全性。
向上转型(Upcasting)
将子类对象的引用赋值给父类类型的变量,这是自动进行的,因为子类对象总是可以被当作父类对象来处理。
例如:
class Animal {
public void eat() {
System.out.println("Animal is eating");
}
}
class Dog extends Animal {
@Override
public void eat() {
System.out.println("Dog is eating");
}
public void bark() {
System.out.println("Dog is barking");
}
}
public class PolymorphismExample {
public static void main(String[] args) {
Animal animal = new Dog(); // 向上转型,自动完成
animal.eat(); // 调用的是 Dog 类重写的 eat 方法
}
}
向下转型(Downcasting)
将父类对象的引用转换为子类类型的变量。这是不安全的,除非确定引用实际指向的是子类对象,否则可能会导致运行时错误 ClassCastException
。
在进行向下转型之前,需要使用 instanceof
运算符进行类型检查,以确保转换的安全性。
例如:
public class PolymorphismExample {
public static void main(String[] args) {
Animal animal = new Dog(); // 向上转型
if (animal instanceof Dog) { // 类型检查
Dog dog = (Dog) animal; // 向下转型
dog.bark();
}
}
}
instanceof
运算符用于判断一个对象是否是某个类或其子类的实例,如果是则返回 true
,否则返回 false
。
总之,在处理多态中的引用类型转换时,要谨慎进行,充分利用 instanceof
进行类型检查,以避免运行时错误。
四. final关键字
在 Java 中,final
关键字有多种用途:
-
修饰变量:
- 当
final
修饰基本数据类型的变量时,该变量的值一旦被初始化就不能再被修改。 - 当
final
修饰引用数据类型的变量时,该变量所引用的对象不能再被重新赋值,但对象的属性值可以修改。
例如:
- 当
final int num = 10; // 不能再修改 num 的值
final String str = "Hello"; // 不能再修改 str 的值
final List<String> list = new ArrayList<>(); // 不能将 list 重新指向其他对象,但可以修改 list 中的元素
-
修饰方法:被
final
修饰的方法不能被子类重写。例如:
class Parent {
final void finalMethod() {
// 方法实现
}
}
class Child extends Parent {
// 不能重写 finalMethod 方法
}
-
修饰类:被
final
修饰的类不能被继承。例如:
final class FinalClass {
// 类的实现
}
// 以下代码会报错,因为不能继承 final 类
// class SubClass extends FinalClass {}
使用 final
关键字可以提高代码的安全性和可读性,防止意外的修改和不必要的继承重写。