CoreJava——继承

概念

继承(英语:inheritance)是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

子类的创建可以增加新数据、新功能,可以继承父类全部的功能,但是不能选择性的继承父类的部分功能。继承是类与类之间的关系,不是对象与对象之间的关系。
如果某类B“继承”另某类A,就把这个B称为“A的子类或派生类(subclass)”,而把类A称为“B的父类”也可以称为“A是B的超类或基类(superclass)”。

在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。

继承的语句格式:
class 子类名 extends 父类名{}
class 父类 { } class 子类 extends 父类 { }

extends关键字
在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。

implements关键字
implements 关键字可以变相的使Java具有多继承的特性,使用范围为类实现接口的情况,可以同时实现多个接口(接口之间采用逗号分隔)。

final关键字
final可以修饰类、变量、方法。
final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:
声明类:final class类名 {//类体}
声明方法:修饰符(public/private/default/protected) final返回值类型 方法名(){//方法体}
static关键字
static修饰成员变量(属性)和方法、代码块(不能出现在方法内部),static修饰变量(属性)和方法,得到的是类变量和类方法,类变量和类方法用所在类的类名直接调用。static和abstract不能一起使用。
由static修饰的变量和方法,不能用this调用。静态方法可以调用静态的方法,普通方法也可以调用静态方法,静态方法不能调用普通方法。

this关键字
this 关键字在Java方法中只能用在实例变量和实例方法上,不能用在由static、final修饰的类变量和类方法上
如果在Java方法中,实例化的成员变量和某方法的参数变量同名时,实例化的成员变量在这个方法内暂时失效(内部屏蔽外部),这时如果想在该方法中使用这被屏蔽的成员变量,用“this.成员变量名”的方式调用该成员变量,并且将参数变量赋值给this调用的成员变量,
格式如下:this.本类成员变量=局部参数变量;

super关键字
super是在子类中调用被屏蔽的成员变量和方法

方法重写(override)(方法覆盖)

发生在子类和父类当中
子类中的方法名、参数和返回值和父类相同
意义:子类跟父类拥有同样的功能,但是子类有自己的特定内容和特定实现方式。可以 定义一个不同的名字方法,但是为了见名知意,保持父类名字,自己重新实现方法体。
注意
不能重写private方法
重写的时候,访问权限不能降低(最好保持权限一致)

方法重载(overload)

发生在同一个类中
方法名一样,参数 不一样 ,返回值不要求

继承中的构造

通过子类的构造方法构造子类对象的时候,都会调用父类里面的构造方法
如果对父类里面的属性初始化,不指定就调用默认的无参构造方法
如果父类没有无参构造方法,要通过调用指定的有参构造方法
怎么指定调用父类里面的那个构造方法?
super(xx,xx,xx,xx);//父类里面的属性
怎么在构造方法中调用其他构造方法?
this(xx,xx,xx);

注意:

1、父类中一般只定义一般属性和方法(这个一般可以理解为是子类共有的,这就是父类更通用,而子类拥有其他的,所以子类更具体)
2、子类中通过super关键字来调用父构造方法,并且需要放在构造方法的第一行
3、父类中public、protected修饰的属性和方法可以继承,private修饰的属性和方法不能被继承
4、规则:创建子类对象的时候,首先调用的是父类的无参构造方法创建一个父类对象
5、可以在子类中显示调用父类的有参构造方法
6、如果父类的属性均为private修饰,则可以通过共有的getter、setter方法来调用
7、通过this或者super调用构造方法的时候必须在第一条语句

继承案例:teacher类继承person类

person类:

class Person {
	public String name;
	public int age;
	public char gender;

	public Person(String name, int age, char gender) {
		this.name = name;
		this.age = age;
		this.gender = gender;

	}

	/*
	 * get方法区
	 */
	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}

	public char getGender() {
		return gender;
	}

	/*
	 * 人具有的行为
	 */
	public void eat() {
		System.out.println(name + "在吃饭");
	}

	public void sleep() {
		System.out.println(name + "在睡觉");
	}
}

teacher类:

// 老师具有人的属性和自己个人的一些职业等属性
class Teacher extends Person {

	private String title;
	private String course;
	private String className;

	public Teacher(String name, int age, char gender, String title, String course, String className) {

		super(name, age, gender);// 必须放在第一行
		this.title = title;
		this.course = course;
		this.className = className;
	}

	/*
	 * get方法区
	 */
	public String getTitle() {
		return title;
	}

	public String getCourse() {
		return course;
	}

	public String getClassName() {
		return className;
	}

	/*
	 * 老师具有的行为
	 */
	public void teach() {
		System.out.println(getName() + "在教课");
	}

	// 这个方法重写了父类里面的eat方法,子类中重写的方法将覆盖父类里的原方法
	public void eat() {
		System.out.println("先出示自己的教师证");
		System.out.println(getName() + "在吃饭");
	}
}

class ExtendsDemo {
	public static void main(String[] args) {
		Teacher t = new Teacher("苍井空", 20, '女', "高级老师", "生物", "二班");
		/*
		 * 如果采用下面的方式构造和初始化,person类和teacher类中必须包含空参构造方法和set方法
		 Teacher t = new Teacher();
		  t.setName("苍井空");
		  t.setAge(20);
		  t.setGender('女');
		  t.setTitle("高级老师");
		  t.setClassName("二班");
		  t.setCourse("生物");
		 */
		t.eat();
		t.sleep();
		t.teach();
	}
}
  • 控制台的输出:
    先出示自己的教师证
    苍井空在吃饭
    苍井空在睡觉
    苍井空在教课
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱茂强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值