标签:方法 查找 ash mda 出现 缺点 系统 分配 super关键字
众所周知,继承是面向对象的三大特征之一。具体将继承理解为两个类之间的关系,被继承的类称为父类,进行父类操作的类叫做子类。子类是对于父类的扩展,通过继承可以使得子类访问父类的非私有成员变量以及成员方法,还可以在子类中对父类中原有的方法进行覆盖重写。
存在必有意义。使用继承可以增强代码的复用性,提高了代码的可维护性,以及使扩展旧代码的操作风险降得更低。如果你接手了一个陈年老旧的系统,发现其中代码漏洞百出,这时又不轻举妄动,那么选择继承原有代码,对原有方法进行重写或许时一个不错的选择。
有利必有弊。继承固然方便好用,但同样也给程序带来了其他的问题。由于继承的存在,增强了两个类之间的耦合性,父类的变动可能会引起子类的意外变动。并且继承是具有入侵性的,只要继承了父类,子类就拥有了父类的所有非私有方法。所以在使用继承时还需要多多考虑。
关于继承的访问特点,关键就要记住四个字——就近原则。
当子类出现和父类同样的成员变量时,访问的是子类成员变量;
当子类中和父类出现同样的成员变量,切方法中有同名的局部变量时,访问的是局部变量。
当方法内部找不到变量时会找成员变量,如果成员变量也不存在时就会查找父类的成员变量,如果父类中也没有的话则报错。
在子类构造方法的第一行会默认隐式的调用父类的无参构造方法[ super() ],如果父类中没有无参构造方法则会报错。也可以显示的调用父类构造方法,但必须将构造方法写在子类构造方法第一行,否则同样会报错。
当对一个类进行初始化时,虚拟机会检查该类是否有父类,并检查父类是否已经初始化,如果没有初始化则先进行父类的初始化操作;如果父类已经初始化完成, 这时会在为子类分配的内存空间中,分拨一片给父类存储相关信息(如成员变量等),然后将该片内存空间初始化为零值,进行一些必要的设置,再执行父类的<init>方法。再在剩余的空间中对子类相关信息进行初始化,执行和父类相同的步骤。
在子类中调用方法,先在子类中找,子类中没有再到父类中找,父类没有再到父类的父类找,直到最顶层没有则报错。如果子类和父类中有同样方法签名的方法,则调用子类中的方法(方法重写)。
super代表着父类的引用,可以在子类中通过super关键字调用父类中的成员;this代表着子类自己的引用,可以通过this访问子类本身的成员变量。如:在方法中有一个变量,变量名和在类中的一个成员变量变量名相同,那么可以在方法内部通过this关键字调用成员变量。
标签:方法 查找 ash mda 出现 缺点 系统 分配 super关键字
原文地址:https://www.cnblogs.com/dc5e/p/11122258.html