面向对象(一):继承

本文深入讲解面向对象编程的三大特性之一——继承,包括其概念、使用方式、与组合的区别,以及如何通过继承提高代码复用率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面向对象编程的有三大特性,分别是继承,封装,多态。这里就详细介绍下什么是继承,以及和继承相关的概念。

继承

继承是面向对象三大特性之一,使用关键字extends实现,写在类名的后面。作用是提高代码的复用率,方便我们建立模型,有利于对现有的类进行扩展。

举例:建立一个Person类,student类继承Person类

 class Person{
 	int age;
 	String name;
 }
 class student extends Person{
 
 }

在继承中,继承的一方称作子类,被继承的一方称作父类。子类在继承父类后可以获得父类的所有属性和方法。

注:

  1. Java中只存在单继承,因此不用考虑菱形继承之类的问题。至于多继承这方面则交给了接口(interface)去实现。
  2. 子类无法继承父类的构造方法以及父类中被private修饰的属性和方法
  3. 一个类如果没有写继承,则默认继承Object类
重写(Override)

子类继承父类的方法后不想按照父类的方法执行时,就可以用Override去重写父类的方法

举例(以上面代码来扩展):

 class Person{
 	int age;
 	String name;]
 	void takeRest{
 		System.out.println("晚上要睡觉");
 	}
 }
 class student extends Person{
 	@Override
 	void takeRest{
		System.out.println("通宵一时爽,一直通宵一直爽");
 	}
 }

从上面代码不难看出,方法的重写就是在子类中写一个和父类一样的方法(包括方法名和参数),至于要实现什么就自己写。

注:

  1. @Override可以省略不写。
  2. 子类重新的方法访问权限必须大于等于父类,参数类型,声明异常的类型必须小于等于父类。
  3. static方法不能被重写。
super关键字

super可以看做是一个指针,用来指向父类对象,通过super来父类中的属性,方法。

举例(同上):

 class Person{
 	int age;
 	String name;]
 	void takeRest{
 		System.out.println("晚上要睡觉");
 	}
 }
 class student extends Person{
 	@Override
 	void takeRest{
		System.out.println("通宵一时爽,一直通宵一直爽");
 	}

	public student(int age,String name){
			super();
			this.age = age;
			this.name = name;
	}
 }

子类通过super来调用父类中的普通方法,没有位置限制,随意调用。
在子类的构造方法中,第一行默认为super(),若是没有写(可以不写),Java也会默认调用super(),用来调用父类的无参构造方法。

继承树顺序

前面说过,每个类都存在继承关系(没写extends的默认继承Object),同时也存在多重继承(举例:你继承你的父母,你的父母又继承你的爷爷奶奶,依次向上)。因此,理清继承的顺序十分重要。

属性,方法继承顺序:

  1. 先从最底层的子类开始寻找。
  2. 找不到再依次向上找,直至Object,还没有则报错。
  3. 在这个过程中只要找到就结束寻找。

构造方法继承顺序:

  1. 和上面相反,从Object开始寻找
  2. 再依次向下寻找,直至子类。

题外话:
继承的主要作用就是提高代码的复用率,减少代码量。而在Java中除了继承之外还有一中方法能够实现继承的作用,这个方法就是组合。

组合

组合的核心思想是把父类对象做为子类的属性,子类通过调用这个属性来调用父类中的属性以及方法。

同样使用上面的代码来作为示例:

class Person{
	int age;
	String name;

	void Rest(){
		System.out.println("晚上要睡觉");
	}

	public Person(int age, String name){
		super();
		this.age = age;
		this.name = name;
	}
}

class Teacher{
	Person p = new Person();
	public Teacher(Person p){
		super();
		this.p = p;
	}
} 

class Student{
	Person p1 = new Person();
	public Student(int age,String name){
		super();
		this.p1.name =name;
		this.p1.age = age;
	}
}

public class Test{
	public static void main(String args[]){
		Teacher tea = new Teacher();
		tea.p.Rest();
		Student stu = new Student(20"zzl");
		stu.p1.Rest;
	}
}

对代码进行对比就能比较直观的了解继承和组合的区别。组合是在子类中创建一个父类对象,等需要调用父类方法和属性时通过这个对象去调用。

对于使用组合的类创建构造方法有两种方式:

  1. 直接使用父类的属性,this指针直接指向父类属性。(上面Student类)
  2. 构造父类对象,this指针指向对象。这种需要在父类中创建好构造方法。(上面Teacher类)

虽说组合用起来比继承更加的灵活,但是对于初学者来说,一旦遇到较为复杂的项目是,对于组合中逻辑不易理解,而继承则更为直观,逻辑也更加明朗。


面向对象其余两篇的链接:
面向对象(二):封装
面向对象(三):多态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值