Java中的继承

什么是继承

Java中提供了一个关键字extends,用这个关键字,可以让一个类和另一个类建立起父子关系。

//父类
public class A {
	//公开成员
	public int i;
	public void print1() {
		System.out.print("print1")
	}
	//私有成员
	private int j;
	private void print2() {
		System.out.println("print2")
	}
}
//子类
public class B extends A {
	// 子类可以继承父类的非私有成员
	public void print3() {
		System.out.println(i);
		print1();
	}
}

A类称为父类(基类或超类);
B类称为子类(派生类)

继承的特点

  • 子类能继承父类的非私有成员(成员变量、成员方法)

Java里的继承指的是能用的意思,子类继承父类非私有的成员意思是可以直接用父类非私有的成员。如:
A中的int iprint1()成员变量和方法都用public修饰(非私有),可以被子类B直接使用;
A中的int jprint2()成员变量和方法都用private修饰(私有的),不可以被子类B继承使用;

继承后对象的创建

  • 子类的对象是由子类、父类共同完成的。
    对象能访问什么变量是由子父类共同决定的在这里插入图片描述

继承的好处与应用场景

  • 减少重复代码的编写
    在这里插入图片描述
    如何优化?
    将这两个类的共同代码放到一个类里,让Teacher和Consultant都去继承。
    在这里插入图片描述

继承相关注意事项

权限修饰符

用来限制类中的成员(成员变量、成员方法、构造器、代码块…)能够被访问的范围。

  1. public
  2. private
  3. protected
  4. 缺省

在这里插入图片描述

单继承、Object类

Java是单继承,只能继承一个父类,不支持多继承,但可以多层继承。
Object类是Java中所有类的祖宗,任何一个类其实都是Object的子类或子孙类。

方法重写

什么是方法重写

当子类觉得父类中的某个方法不好用,或者无法满足自己的需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法。

重写后,方法的访问,Java会遵循就近原则。
对象在调用方法时,就会调用B中的print函数,而不是A的
在这里插入图片描述
注意事项:

  • 重写小技巧:使用Override注解,他可以指定Java编译器,检查方法重写格式是否正确,代码可读性增强;
  • 子类重写父类方法时,访问权限必须大于或者等于父类该方法的权限(public>protected>缺省)
  • 重写的方法返回值类型,必须与被重写的方法的返回值类型一样,或者范围更小;
  • 私有方法、静态方法不能被重写,如果重写会报错的。

子类中访问其他成员的特点

1、在子类方法中访问其他成员(成员变量、成员方法),是依照就近原则的。
在这里插入图片描述
2、如果一定需要访问父类的成员,使用super关键字调用

子类构造器的特点

  • 子类的全部构造器,都会先调用父类的构造器,再执行自己
class F {
	public F() {
		System.out.println("父类F 无参构造器");
	}
}

class Z extends F {
	public Z() {
		//在构造器一进来默认调用super()
		System.out.println("子类Z 无参构造器");
	}
	public Z(String nae) {
		//在构造器一进来默认调用super()
		System.out.println("子类Z 有参构造器");
	}

假如父类没有无参构造器(只有有参数构造器),子类的全部构造器都会报错
解决方案:手动在子类构造器中调用父类的有参数构造器

子类构造器是如何实现调用父类构造器的:

  1. 默认情况下,子类全部构造器的第一行代码都是super()(写不写都有),它会调用父类的无参数构造器。
  2. 如果父类没有无参数构造器,则我们必须在子类构造器的第一行手写super(…),指定去调用父类的有参数构造器。

应用场景

子类构造器可以通过调用父类构造器,把对象中包含父类这部分的数据先初始化赋值,再回来把对象包含子类这部分的数据也进行初始化赋值。
在这里插入图片描述

this(…)调用兄弟构造器

任意类的构造器中,是可以通过this(…)去调用该类的其他构造器的。
在这里插入图片描述
可以复用兄弟构造器的代码。
super和this不能同时出现,且如果使用都需要放在构造器的第一行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值