一 继承的好处:
1.提高代码复用性
2.类与类之间产生了关系,为第三个特性多态产生提供了前提。

二 什么时候继承?
类与类之间有所属关系时。

三 ①当本类的成员和局部变量同名 用this区分
②当子父类的成员变量同名 用super区分
this:代表本类对象的引用
super:代表一个父类空间
当子父类出现成员函数一模一样 会运行子类函数称为覆盖

四:覆盖注意事项
子类重写(覆盖)父类的方法必须满足的条件:
1.父类中的方法在子类中必须可见,即子类继承了父类中的该方法(可以显式的使用super关键字来访问父类中的被重写的方法), 如果父类中的方法为private类型的,那么子类则无法继承,也无法覆盖。
2.子类和父类的方法必须是实例方法,如果父类是static方法而子类是实例方法,或者相反都会报错。 如果父类和子类都是static方法,那么子类隐藏父类的方法,而不是重写父类方法。
3.子类和父类的方法必须要具有相同的函数名称、参数列表,并且子类的返回值与父类相同或者是父类返回类型的子类型(jdk1.5之后)。 如果方法名称相同而参数列表不同(返回类型可以相同也可以不同),那么只是方法的重载,而非重写。 如果方法名称和参数列表相同,返回值类型不同,子类返回值类型也不是父类返回值类型的子类,编译器就会报错。

4.子类方法的访问权限不能小于父类方法的访问权限(可以具有相同的访问权限或者子类的访问权限大于父类)。 访问权限由高到低:public、protected、包访问权限、private。如果子类方法的访问权限低于父类,则编译器会给出错误信息
5.子类方法不能比父类方法抛出更多的编译时异常(不是运行时异常),即子类方法抛出的编译时异常或者和父类相同或者是父类异常的子类。

1.子类方法覆盖父类方法时,子类权限必须要大于等于父类的权限
2.静态只能覆盖静态,或被静态覆盖

五 什么时候使用覆盖操作?
当对一个类进行子类的拓展时,子类需保留父类的功能声明。但是要定义子类中该功能特有内容时,就使用覆盖操作完成。

六 构造方法
(1)在子类构造对象时,发现访问子类构造函数父类也运行了,为什么?
原因是:在子类的构造函数中第一行有一个默认的隐式语句 super().
子类的实例化过程:在构造子类对象时,隐式调用父类的构造方法。
(2)为什么子类(无参)实例化时,要访问父类中构造函数?
因为子类继承了父类,获取到了父类中内容(属性),所以在使用父类内容之前,要先看父类如何对自己内容初始化。所以子类在构造对象时,必须访问父类构造函数

如果父类中没有定义空参数构造函数,那么子类的构造函数必须用super明确要调用父类哪一个构造函数,同时子类构造函数如果使用this调用本类构造函数,隐式的super()就不存在了,因为super(),this(),只能定义在第一行,所以只能有一个,但是可以保证的,子类构造函数一定会调用父类构造函数。

注意
①super语句必须要定义在子类的第一行,因为父类的初始化动作要先完成。
②object类是所有类的父亲。

一个对象实例化过程:
person p=new person();
1,JVM会读取指定路径下的person.class文件并加载进内存,并会加载person的父类(如果有直接父类的情况下)
2,在堆内存中开辟空间,分配地址
3,并在对象过程中,对对象的属性进行默认初始化。
4,调用对应的构造函数,进行初始化
5,在构造函数中,第一行会先调用父类中构造函数进行初始化
6,父类初始化完毕后,会对子类属性进行显示初始化
7,在进行子类构造函数的特定初始化
8,初始化完毕后,将地址值赋值给引用变量。

继承关系代码块例

class Father
{  
	 int num=9;
	Father()
	{
	System.out.println("Father cons run "+num);
	show();
	}
	void show()
	{
		System.out.println("Father show run"+num);
	}
}
class Son extends Father
{
	int num=10;
	Son()
	{
		System.out.println("Son cons run"+num);
		show();
		
	}
	void show()
	{
		System.out.println("son show run"+num);
	}
}


public class Init {

	public static void main(String []args)
	{
		Son s=new Son();
	}
}

运行结果
Father cons run 9 ①
son show run0 ②
Son cons run10③
son show run10④

分析 (1)运行子类构造函数,第一行调用super(),运行父类构造函数。
父类的父类为Object类,在JVM启动时就已经加载。接着调用构造函数输出 ①
(2)调用父类构造函数的show()方法,而在子类中show()方法已经被覆盖,故调用的是子类的show()方法 输出② 此时子类的num只进行了默认初始化,为进行显示初始化
(3)接着在子类构造函数中 输出③ num已进行显示初始化
(4)调用show方法 输出④ num已进行显示初始化