Java面向对象编程:继承与多态入门指南

继承基础

什么是继承?

继承是面向对象编程的三大特性之一(封装、继承、多态),它允许我们创建一个新类(子类或派生类),该类继承现有类(父类或基类)的属性和方法。通过继承,子类可以重用父类的成员变量和方法,而无需重新编写相同的代码。

在Java中,使用extends关键字可以创建一个类的子类。子类会继承父类的成员变量和方法。继承体现了"is-a"关系,即子类是父类的一种类型。例如,如果有一个Vehicle父类,那么Car子类可以继承Vehicle,因为汽车是一种交通工具。

继承的基本语法

在Java中,通过extends关键字可以声明一个类是另一个类的子类,一般形式如下:

class 父类 { }

class 子类 extends 父类 { }

为什么需要继承?

通过继承,我们可以:

  1. 减少代码冗余,避免重复编写相同的代码
  2. 建立类之间的逻辑关系,使代码结构更加清晰
  3. 实现多态,提高程序的灵活性和可扩展性

uper关键字详解

super关键字是Java面向对象编程中的一个关键概念,它在继承机制中扮演着重要角色。

super关键字的基本概念

super关键字用于引用父类对象,可以在以下几种场景中使用:

  • 调用父类的构造方法
  • 调用父类的方法
  • 访问父类的属性

调用父类的构造方法

在子类的构造方法中,super()必须是第一条语句,用于调用父类的构造方法。默认情况下,子类的构造方法会自动调用父类的无参构造方法。如果需要调用父类的有参构造方法,需要显式地使用super(参数)。

例如:

class Animal {
    private String name;
    public Animal(String name) {
        this.name = name;
        System.out.println("创建了一只名为 " + name + " 的动物");
    }
}
class Dog extends Animal {
    public Dog(String name) {
        super(name); // 调用父类的构造方法
        System.out.println("这是一只狗,名字是 " + name);
    }
}
public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("旺财");
    }
}

访问父类的属性

当父类和子类存在相同数据成员时,可以使用super关键字访问父类的属性。例如:

class Parent {
    protected int value = 10;
}
class Child extends Parent {
    private int value = 20;
    public void printValues() {
        System.out.println("子类中的value: " + value);
        System.out.println("父类中的value: " + super.value);
    }
}

调用父类的方法

子类可以通过super调用父类被重写的方法。例如:

class Parent {
    void display() {
        System.out.println("Parent display method");
    }
}
class Child extends Parent {
    @Override
    void display() {
        System.out.println("Child display method");
    }
    void callSuperDisplay() {
        super.display(); // 调用父类的display方法
    }
}

super关键字的注意事项

  1. 调用super()必须是类构造函数中的第一个语句,否则编译不通过
  2. 每个子类构造方法的第一条语句,都是隐含地调用super()
  3. super不能访问父类的私有成员
  4. super和this在构造函数中只能有一个,且都必须是构造函数当中的第一行

super与this的区别

引用对象不同

  • super:引用父类对象
  • this:引用当前对象

使用场景不同

  • super:主要用于继承关系中,用于访问父类成员或调用父类构造方法
  • this:可用于任何类中,用于引用当前对象、解决变量名冲突或调用本类其他构造方法

调用构造器的位置

  • super:必须位于子类构造器第一行
  • this:必须位于构造器第一行

访问权限

  • super:只能访问父类可见的成员
  • this:可以访问当前类所有成员

继承方式

单继承与多重继承

Java采用单继承模式,即一个类只能有一个直接父类。单继承性使得Java简单,易于管理程序,不会出现逻辑错误以及多继承自身的缺陷。

为了克服单继承的缺点,Java使用了接口。一个类可以实现多个接口,从而在另一个更合理的角度来实现纯粹的多重继承性。实现接口使用关键字implements

多层继承(多重继承)

虽然Java不支持类之间的多继承,但它支持多层继承。多层继承是指一个类可以继承另一个类,而这个类又可以继承更上层的类。

例如:

class A {}
class B extends A {}
class C extends B {}

此时,C类拥有A类和B类的所有操作。

通过接口实现多重继承

在Java中,由于不支持多重继承,因此无法直接通过类来实现多重继承。但是可以通过接口来实现多重继承的效果。

例如:

interface Interface1 {
    void method1();
}
interface Interface2 {
    void method2();
}
class MyClass implements Interface1, Interface2 {
    public void method1() {
        System.out.println("Method 1");
    }
    public void method2() {
        System.out.println("Method 2");
    }
}

final关键字在继承中的应用

final关键字在Java中可以用于修饰类、方法和变量。当final用于继承的情境时,它会产生以下影响:

修饰类

当一个类被声明为final时,表示该类不能被继承。例如,Java中的java.lang.String类就是一个被声明为final的类,因此它不能被继承。

修饰方法

当方法被声明为final时,表示该方法不能被子类重写。这意味着,即使子类继承了该方法,子类也只能使用父类中的实现,而不能修改它。

例如:

class Parent {
    final void eat() {
        System.out.println("Parent eat method");
    }
}
class Child extends Parent {
    // 无法重写eat方法,编译器会报错
    // void eat() {
    //     System.out.println("Child eat method");
    // }
}

修饰变量

当变量(实例变量或静态变量)被声明为final时,表示该变量的值在初始化后不能被修改。对于实例变量,这意味着它们只能被赋值一次,之后就不能再改变。

例如:

class FinalExample {
    final int number; // final变量必须在构造器中初始化或声明时初始化
    FinalExample() {
        number = 10; // 可以在构造器中初始化
    }
    void display() {
        System.out.println("Number: " + number);
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值