继承

本文详细介绍了Java中的继承概念,包括子类与父类的关系、成员变量和方法的访问规则、方法重写(Override)以及构造方法的使用。通过实例展示了如何提高代码复用性和实现多态性。重写允许子类根据需要扩展父类功能,而构造方法确保了父类初始化在子类之前完成。
摘要由CSDN通过智能技术生成

概述

  如果多个类中存在相同的属性和行为时,将这些内容抽取到单独的一个类中,那么多个类就无需再定义这些属性和行为,只要去继承这个单独的类即可。其中,多个类称为子类、派生类,单独的那一个类称为父类、超类、基类。
  继承描述的时事物之间的所属关系,这种关系是:is–a的关系,在继承关系中,子类就是一个父类,也就是说,子类可以被当作父类看待。

定义

继承:就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为,子类可以直接访问父类中的【非私有】的属性和行为。
好处:

  1. 可以提高代码的复用性。
  2. 类与类之间可以产生一种联系,是多态的前提。

继承的格式

通过extends关键字可以声明一个子类继承另一个父类:

public class FuClass {
}
public class ZiClass extends FuClass {
}

继承后的特点–成员变量

成员变量不重名
  如果子类父类中定义的成员变量不重名,这时的访问没有任何影响。
成员变量重名
  在父子类的继承关系当中,如果成员变量重名,则创建子类对象时,访问有两种方式;

  • 直接通过子类对象访问成员变量:等号左边是谁,就优先用谁,如果没有会向上找。
  • 间接通过成员方法访问成员变量:该方法属于谁,就优先使用谁,没有就向上找

  子父类中出现了重名的成员变量时,在子类中想要访问父类中的非私有的成员变量时,需要使用super关键字,修饰父类的成员变量,类似于this操作。
使用格式:

super.父类的成员变量名

继承后的特点–成员方法

成员方法不重名

  如果子类父类中出现不重名的成员方法,这时的调用是没用【任何影响的】,对象调用方法时,会先在子类中查找有没有对应的方法,若子类中存在该方法那么就执行该方法,若子类当中不存在该方法那么会执行父类中的方法。

public class Fu {
	int num;
	public void show() {
		System.out.println("Fu类中的show方法在执行!");
		System.out.println("Fu类中的成员变量num:" + num);
	}
}
public class Zi extends Fu {
	int num;
	public void show2() {
		System.out.println("Zi类中的show方法在执行");
		System.out.println("Zi类中的成员变量num:" + num);
	}
}
public class TestExtends {
	public static void main (String[] args) {
		Zi zi = new Zi();
		zi.show();//调用父类当中的show方法 Fu类中show方法在执行! 10
		zi.show2();//调用子类当中的show2方法zi类中的show2方法在执行! 20
	}
}

成员方法重名–重写(Override)
  如果父子类中出现了重名的成员方法,这时的访问是一种特殊情况。叫做方法重写
重写
条件:子类出现与父类一摸一样的方法时(返回值类型、方法名、参数列表)
作用:便会覆盖父类的方法。
示例代码:

public class Fu {
	int num = 10;
	public void show() {
		System.out.println("Fu show() 方法在执行!");
		System.out.println("Fu 成员变量num:" + num);
	}
}
public class Zi {
	int num = 20;
	public void show() {
		System.out.println("Zi show() 方法在执行!");
		System.out.println("Zi 成员变量num:" + num);
	}
}
public class TestExtendsDemo02 {
	public static void main(String[] args) {
		Zi zi = new Zi();
		zi.show();// Zi show()方法在执行! 20
	}
}

重写的应用

子类可以根据需要,定义特定于自己的行为,既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行功能扩展‘。
public class Phone {
	public void call() {
		System.out.println("打电话!");
	}
	public void sendMessage() {
		System.out.ptintln("发短信!");
	}
	public void show() {
		System.out.println("来电显示电话号码!");
	}
}
public class IPhone12 extends Phone {
	public void show() {
		super.show();
		System.out.println("显示姓名!");
		System.out.println("显示头像!");
	}
}
public class TesExtendsDemo03 {
	public static void main(String[] args) {
		IPhone12 iphone = new IPhone12();	
		iphone.call();
		iphone.show();
	}
}

重写:方法的名称一样,参数列表[一样] ,返回值类型[也一样] ,重写前提有继承关系
重载:方法的名称一样,参数列表[不一样] ,返回值类型无要求,在本类中。

注意事项:

  • 子类方法重写父类方法,必须要保证权限要大于等于父类权限
  • 子类方法覆盖父类方法,返回值类型、方法名称和参数列表必须要一摸一样。

继承后的特点—构造方法

先回忆下构造方法的定义和作用:

  1. 构造方法的名字和类名要保持一致,所以子类是无法继承父类当中的构造方法
  2. 构造方法的作用一般是用来初始化成员变量,所以子类在初始化的过程中,必须先执行父类中的初始化动作。子类的构造方法当中默认有一个super()方法,表示调用的父类的构造方法,父类的成员变量初始化之后,才可以给子类使用。
public class Fu {
	private int n;
	public Fu() {
		System.out.println("Fu()");
	}
}
public class Zi extends Fu {
	public Zi() {
		//super();//调用父类中的构造方法,隐式调用,写不写都会调用
		System.out.println("Zi()");
	}
}
public class TestExtendsDemo04 {
	public static void main(String[] args) {
		Zi zi = new Zi();
	}
}
// 输出有误

父类空间优先于子类对象产生

在每次创建子类对象的时候,先初始化父类空间,在创建子类对象。目的在于子类对象中包含了其对应的父类空间,便可以包含父类的成员,如果父类成员非私有,则子类可以随意使用父类成员,代码体现在构造方法调用时,会先调用父类的构造方法。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值