说一下Java的继承

发布于:2024-04-25 ⋅ 阅读:(20) ⋅ 点赞:(0)

概述

继承是面向对象的三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。继承是指在原有类的基础上,进行功能扩展,创建新的类型。

特点:

  • JAVA中类只有单继承,没有多继承。
  • 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。
  • 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。
  • extends的意思是“扩展”,子类是父类的扩展。
  • 子类可以有父类的内容,子类还可以有自己特有的内容。

语法格式

 public class 子类名 extends 父类名{}

例如:

public class Zi extends Fu {
    //Fu:是父类,也被称为基类、超类
    //Zi: 是子类,也被称为派生类
}

例如:

public class Person {
    //public 公共的
    public int money = 1_0000_0000;
    public void say(){
        System.out.println("说话");
    }

}
public class Student extends Person{

    public static void main(String[] args) {
        Student student = new Student();
        student.say();
        System.out.println(student.money);
    }
}

super

super 关键字的用法和 this 关键字的用法相似

  • this:代表本类对象的引用(this关键字指向调用该方法的对象一般我们是在当前类中使用this关键字所以我们常说this代表本类对象的引用)
  • super:代表父类存储空间的标识 (可以理解为父类对象引用)

定义一个父类Fu

public class Fu {
	public int age = 10;
}

定义一个子类Zi

 public class Zi extends Fu {
	public int age = 20;
 
	public void show() {
		int age = 30;
		System.out.println(age); // 30
		// 访问本类中的成员变量age
		System.out.println(this.age);
		// 访问Fu类中的成员变量age
		System.out.println(super.age);
	}
}

测试类:

public class Test {
	public static void main(String[] args) {
		Zi z = new Zi();
		z.show();
	}
}

结果为:

30
20
10

继承中父子类构造方法的访问特点

在继承关系中,子类必须调用父类的构造方法,子类构造方法中有一个隐含的“super()”调用,所以一定是先调用父类的无参构造方法,后执行子类的构造。所以,子类初始化之前,一定要先完成父类数据的初始化

子类中所有的构造方法默认都会访问父类中无参的构造方法。每一个子类构造方法的第一条语句默认都是: super()

  • super()是调用的父类的无参构造方法
  • 子类构造可以通过super关键字调用父类重载构造方法
  • 只有子类构造方法才能调用父类构造方法
  • super()的父类构造调用,必须是子类构造的第一个语句。
  • 一个子类构造不能多次调用super()构造。

例如:

  1. 创建一个父类Fu
public class Fu {
	public Fu() {
		System.out.println("Fu中无参构造方法被调用");
	}
 
	public Fu(int age) {
		System.out.println("Fu中带参构造方法被调用");
	}
}
  1. 创建一个子类Zi
 public class Zi extends Fu {
	public Zi() {
		// super();
		System.out.println("Zi中无参构造方法被调用");
	}
 
	public Zi(int age) {
		// super();
		System.out.println("Zi中带参构造方法被调用");
	}
}
  1. Test
public class Test {
	public static void main(String[] args) {
		Zi z = new Zi();
		System.out.println("-------------------");
		Zi zi = new Zi(18);
	}
}
  1. 结果
Fu中带参构造方法被调用
Zi中无参构造方法被调用
-------------------
Fu中带参构造方法被调用
Zi中带参构造方法被调用