继承基础
什么是继承?
继承是面向对象编程的三大特性之一(封装、继承、多态),它允许我们创建一个新类(子类或派生类),该类继承现有类(父类或基类)的属性和方法。通过继承,子类可以重用父类的成员变量和方法,而无需重新编写相同的代码。
在Java中,使用extends关键字可以创建一个类的子类。子类会继承父类的成员变量和方法。继承体现了"is-a"关系,即子类是父类的一种类型。例如,如果有一个Vehicle父类,那么Car子类可以继承Vehicle,因为汽车是一种交通工具。
继承的基本语法
在Java中,通过extends关键字可以声明一个类是另一个类的子类,一般形式如下:
class 父类 { }
class 子类 extends 父类 { }
为什么需要继承?
通过继承,我们可以:
- 减少代码冗余,避免重复编写相同的代码
- 建立类之间的逻辑关系,使代码结构更加清晰
- 实现多态,提高程序的灵活性和可扩展性
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关键字的注意事项
- 调用super()必须是类构造函数中的第一个语句,否则编译不通过
- 每个子类构造方法的第一条语句,都是隐含地调用super()
- super不能访问父类的私有成员
- 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);
}
}
1448

被折叠的 条评论
为什么被折叠?



