继承

本文探讨了编程中的继承概念,如何在类间传递特性与行为,以及如何选择合适的父类。通过实例演示Animal、Dog和Bird类的继承关系,展示了代码复用和扩展性。重点讲解了构造方法、访问修饰符和方法覆盖的原则。
摘要由CSDN通过智能技术生成

继承

生活中的“继承”是施方的一种赠与,受方的一种获得。

将一方所有的东西给予另一方。→往往二者之间具有继承关系(直系、亲属)

程序中的继承

  • 程序中的继承,是类与类之间特征和行为的一种赠与或获得。
  • 两个类之间的继承关系,必须满足“is a” 的关系。

父类的选择

  • 现实生活中,很多类别之间都存在着继承关系,都满足“is a”的关系。

  • 狗是一种动物、狗是一种生物、狗是一种物质。

  • 多个类别都可以作为“狗”的父类,需要从中选择出最适合的父类。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ks3TbeTt-1616919155955)(C:\Users\【徐先生】\AppData\Roaming\Typora\typora-user-images\image-20210312141717497.png)]

  • 功能越精细,重合点越多,越接近直接父类。
  • 功能越粗略,重合点越少,越接近Object类。(万物皆对象概念)

父类的抽象

实战:可根据程序需要使用到的多个具体类,进行共性抽取,进而定义父类。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MqAfSO12-1616919155964)(C:\Users\【徐先生】\AppData\Roaming\Typora\typora-user-images\image-20210312155444673.png)]

package com.xu.three;
/**
 * 动物类(父类)
 * @author 【徐先生】
 *
 */
public class Animal {
	//属性
		//品种
		String breed;
		//年龄
		int age;
		//性别
		String sex;
		
		//方法、行为	
				public void eat() {
					System.out.println("吃......");
				}
				
				public void sleep() {
					System.out.println("睡......");
				}
}

package com.xu.three;
/**
 * 狗狗类
 * @author 【徐先生】
 *
 */
public class Dog extends Animal {
/*//属性
	//品种
	String breed;
	//年龄
	int age;
	//性别
	String sex;
	*/
	//毛色
	String furColor;
	
/*//方法、行为	
	public void eat() {
		System.out.println("吃......");
	}
	
	public void sleep() {
		System.out.println("睡......");
	}
	*/
	public void run() {
		System.out.println("跑......");
	}
}
package com.xu.three;
/**
 * 鸟类
 * @author 【徐先生】
 *
 */
public class Bird extends Animal {
/*//属性
		//品种
		String breed;
		//年龄
		int age;
		//性别
		String sex;
		*/
		//毛色
		String furColor;
		
		/*//方法、行为	
		public void eat() {
			System.out.println("吃......");
		}
		
		public void sleep() {
			System.out.println("睡......");
		}
		*/
		public void fly() {
			System.out.println("飞");
		}
}
//等等......以此类推,减少代码的冗余,
  • 语法:class 子类 extends 父类{} //定义子类时,显示定义父类
  • 应用:产生继承关系之后,子类可以使用父类中的属性和方法,也可以定义子类独有的属性和方法。
  • 好处:既提高代码的复用性,又提高代码的可扩展性。

继承的特点![[外链图片转存失败,源站可能有防盗链

不可被继承

  • 构造方法:

    • 类中的构造方法,只负责创建本类对象,不可继承。

  • private 修饰的属性和方法:

    ❂访问修饰符的一种,仅本类可见。

  • 父子类不在同一个package中时,default修饰的属性和方法:

    ❂访问修饰符的一种,仅同包可见。

访问修饰符

本类同包非同包子类其他
private
default
protected
public

※default,不能写,它是默认的。

方法的覆盖

  • 思考:子类是否可以定义和父类相同的方法?

  • 思考:为社么需要在子类中定义和父类相同的方法?

  • 分析:当父类提供的方法无法满足子类需求时,可在子类中定义和父类相同的方法进行覆盖(Override)。

  • 方法覆盖原则:

    ✧方法名称、参数列表、返回值类型必须与父类相同。

    ✦访问修饰符不能比父类更严格。

  • 方法覆盖的执行:

    ✦子类覆盖父类方法后,调用时优先执行子类覆盖后的方法。

super关键字

  • 在子类中,可直接访问从父类继承到的属性和方法,但如果父子类的属性或方法存在重名(属性遮蔽、方法覆盖)时,需要加以区分,才可以专项访问。

  • 使用“super. "的形式访问父类的方法,进而完成在子类中的复用;再叠加额外的功能代码,组成新的功能。

继承中的对象创建

  • 在具有继承关系的对象创建中,构建子类对象会先构建父类对象。
  • 由父类的共性内容,叠加子类的独有内容,组合成完整的子类对象。

继承后的对象构建过程

  • 构建子类对象时,先构建父类对象。

(img-DR62DFFW-1616919155971)(C:\Users\【徐先生】\AppData\Roaming\Typora\typora-user-images\image-20210312190108177.png)]

super

  • super()默认调用父类的无参构造

super调用父类的有参构造

super(父类参数)


this与super

  • this表示当前对象引用,调用本类(包括继承)的属性、方法、本类构造方法
  • super表示父类对象引用,调用父类的属性、方法、构造方法

this 或super 使用在构造方法中时,都要求在首行。

​ 当子类构造中使用了this()或this(实参),

​ 即不可再同时书写super()或super(实参),

会由this()指向的构造方法完成super()的调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值