一文读懂之java三大特性之二--继承

什么是继承?
可以在子类中直接访问父类成员的过程。
这个父类成员包括了成员变量和成员方法。
那么父类的那些成员可以被子类继承?
1、构造方法不能被子类继承。
2、public:修饰的成员变量,可以被子类继承
protected:修饰的成员,可以被子类剋继承
默认的:修饰的成员,如果子类和父类在同一个包下是可以继承的,在不同包下时,是不能被继承的。
private:不能继承。
例:
一文读懂之java三大特性之二--继承一文读懂之java三大特性之二--继承
这个和上文讲的权限的大小关系是一样的。
权限具体查看这篇文章
3、静态成员和实例成员一样都可以被继承,继承范围如上
当创建子类对象的时候,仅仅使用了子类的构造方式,为什么还会直接调用父类的构造方法?
结论:这是因为父类的构造方法的作用是来给子类对象中的父类的实例成员进行初始化。
详细解释如下:
第一步:方法区中,当类加载的时候,按照创建对象的类的继承关系,从上到下,从父类到子类,一次加载,先加载父类,然后再加载子类,(因此Object类每次都会被加载)在加载每一个子类的过程中,对类中的静态成员分配内存,初始化,并执行静态代码块。(有不清楚什么是静态代码块是什么的?可以参考这篇文章
第二步:堆中,按照类的继承关系,jvm给父类的所有实例成员开辟内存,并执行默认初始化,执行构造代码块,执行构造方法,然后同样的操作在在子类中进行。因此子类对象中包含了所有的父类的实例成员,包括私有实例成员,虽然子类拥有父类的私有成员,但是不能被继承(这也是为什么要set/get的原因之一),而且父类中的私有的实例成员的初始化,都是父类的构造方法完成的。这也解释了该问题。一文读懂之java三大特性之二--继承
那么说了这么多,我们为什么要继承呢?
优点:1、代码复用2、继承是多态的基础
缺点:倘若希望某些成员被子类继承,那么可能会在一定程度上破坏封装的原则。(封装