JAVA四大基本特性(封装、继承、抽象、多态)之继承

                                        **继承*

继承的定义
继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。

继承的实现
继承的实现需要用到extends关键字。当子类继承了父类时,子类就可以使用父类的属性和方法(私有属性、私有方法、构造方法除外)其中java.lang.Object(基类、超类)是所有类的父类。

继承的优点

  1. 易于扩展和修改
  2. 提高了代码的复用性
  3. 提高了代码的可维护性

继承的代码
创建一个Animal类,这个Animal类有体重和年龄两个属性以及一个eat()方法

class Animal{
		public double weight;//体重
		public double age;//年龄
		
		public void eat() {
			System.out.println("动物会吃东西");
		}
	}

创建一个Bird类继承于Animal类,因为小鸟也是动物的一种所以小鸟也同样拥有体重和年龄两个属性,当Bird类继承于Animal时它同样也拥有这两个属性。体现了继承可提高代码复用性的优点。新添加一个飞行距离为小鸟的特有属性,而小鸟的eat()方法则对应小鸟的特点进行修改。体现了继承易于扩展和修改的优点


	class Bird extends Animal {
		public double flight;//飞行距离,小鸟特有的属性
		
       /*根据小鸟的特点修改eat方法*/
		public void eat() {
			System.out.println("小鸟是会吃虫子的");
		}
	}

继承关系中类的初始化顺序

package com.chenjun;

public class Main {

	public static void main(String[] args) {

		Son son = new Son();
	}
}

class Father {
	public String str1 = init("父类普通成员变量strl初始化");
	public static String str2 = init("父类静态成员变量str2初始化");

	protected static String init(String str) {
		System.out.println(str);
		return str;
	}

	static {
		System.out.println("父类静态代码块初始化");
	}

	{
		System.out.println("父类普通代码块初始化");
	}

	public Father() {
		System.out.println("父类的构造函数初始化");
	}

}

class Son extends Father {
	public String str1 = init("子类普通成员变量strl初始化");
	public static String str2 = init("子类静态成员变量str2初始化");

	protected static String init(String str) {
		System.out.println(str);
		return str;
	}

	static {
		System.out.println("子类静态代码块初始化");
	}

	{
		System.out.println("子类普通代码块初始化");
	}

	public Son() {
		System.out.println("子类的构造函数初始化");
	}

}

运行程序输出结果为
JAVA四大基本特性(封装、继承、抽象、多态)之继承_第1张图片
根据输出结果我们可以知道在继承关系中类的初始化顺序为:

  1. 首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化
  2. 然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化
  3. 其次,初始化父类的普通成员变量和代码块,再执行父类的构造方法
  4. 最后,初始化子类的普通成员变量和代码块,再执行子类的构造方法

继承(extends)和实现(implements)的区别

  1. 继承指的是子类与父类的关系,实现指的是类与接口的关系
  2. 类是单继承的即一个类只能extends一个类(但是类的继承具有传递关系),实现是可以多实现的即一个类可以implenmets多个接口
  3. 当一个类同时有继承和实现关系时,必须先继承再实现即以Class A extends Class B implements Interface C的写法来写

继承中的this和super关键字
this代表是对象的引用,在构造方法中可以以*this(参数列表)*的方式来调用本类的其他构造函数

public class Main {
	public static void main(String[] args) {
		Father father = new Father("Father");
	}
}
class Father {
	public Father() {
		System.out.println("Father类的无参构造函数被调用了");
	}
	public Father(String str) {
		this();
		System.out.println("Father类的有参构造函数被调用了");
	}
}

运行结果为

Father类的无参构造函数被调用了
Father类的有参构造函数被调用了

super表示的父类的对象,子类的构造方法默认会调用父类的无参构造方法。当父类没有无参构造方法时必须用super关键字显示的调用父类的构造方法

public class Main {
	public static void main(String[] args) {
		Son son = new Son();
		Son son1 = new Son("Son");
	}
}
class Son extends Father {
	public Son() {
		System.out.println("Son类的无参构造函数被调用了");
	}
	public Son(String str) {
		super(str);
		System.out.println("Son类的有参构造函数被调用了");
	}
}

运行结果为

Father类的无参构造函数被调用了
Son类的无参构造函数被调用了
Father类的无参构造函数被调用了
Father类的有参构造函数被调用了
Son类的有参构造函数被调用了

其中特别值得注意的是在构造方法中,this和super关键字不能同时出现,而且必须在构造方法的首行。

你可能感兴趣的:(Java基础)