课时62:方法覆写
摘要:子类与父类一旦产生了继承关系之后,实际上子类会继承父类中全部定义。但是这里面也有可能出现不合适的场景。
1. 定义
2. 释义
做一个最简单的举例,比如现在为止,一家工厂可能是生产手机的,但到今天为止还只是生产功能机,只能打个电话和发短信,这手机便没人买。同一个时代对手机的定义是不一样的,但是不管怎么样,都是手机。如果发现父类中设计不足并且需要保留有父类中的方法或者属性名称的情况下就会发生覆写。
现在手机都说在造手机,但是90年代的造手机就是打电话、发短信。当年的口号是:“呼机、手机、商务通一个不能少”,但是现在手机是一个集功能性、娱乐性与网络能以一身的。手机一直在变化,概念已经被不断的推翻,并且不断的重写。但其基本的样貌仍在被保留着,这种情况叫做覆写操作。
01. 定义
当子类定义了与父类方法名称相同,参数类型及个数完全相同的(跟父类方法一模一样)时候,就称为方法的覆写。
02. 释义
观察方法覆写。先给它去掉,跟上一个“class”,找到“channel”。代码如下:
class Channel {
跟上一个“vord”,跟上一个“connect”。代码如下:
class Channel { public void connect () {}
明确做一个描述“channel”的一个复位,明确表示资源的连接。代码如下:
class Channel { public void connect () {} System.out.println (
跟上一个“channel“,等于”new channel“。代码如下:
class Channel { public void connect () {} System.out.println (“Channel父类】进行资源的连接。”) ; } } public class JavaDemo { public static void main(String args [] ) { Channel channel = new Channel () ;
完成之后,这个代码如果要去调用的时候,这个方法应该是执行(【(Channel】父类)输出。
在编译中,代码执行--父类调用。代码如下:
D:\mldnjava>javac JavaDemo. java D:\mldnjava>java JavaDemo 林中强 D:\mldnjava>javac JavaDemo. java D:\mldnjava>java JavaDemo 【Channel父类】进行资源的连接。 D: \mldnjava>_
现在以(020404_【
★★★★★
】覆写.txt)
程序为例。
在这个程序中,跟上一个“class“,叫做”database channel
”,表示连数据库。代码如下:
class Channel { public void connect () {} System.out.println (“【Channel父类】进行资源的连接。”) ; } } class DatabaseChannel extends channel { // 要进行数据库连接
真正去连接,在没有做任何定义的情况下,用的是父类的方法,编译执行。但是父类的连接资源面太广,需要摘写,连接数据库。虽然泛指方法不好用,但是方法名称很标准,这个方法应该被继续保留下来。
当它不好用时,加覆写,保留已有的方法名称,而后进行覆写。代码如下:
class Channel { public void connect () {} System.out.println (“【Channel父类】进行资源的连接。”) ; } } class DatabaseChannel extends channel { // 要进行数据库连接 public void connect () { // 保留已有的方法名称,而后进行覆写 跟上一句话”out.print”,找到一个格式 “子类”。代码如下: class Channel { public void connect () {} System.out.println (“【Channel父类】进行资源的连接。”) ; } } class DatabaseChannel extends channel { // 要进行数据库连接 public void connect () { // 保留已有的方法名称,而后进行覆写 System.out.println ("【子类】进行数据库资源的连接。“);
【子类】进行数据库资源的连接。整个程序代码跟之前最大的不同是方法名称被保留了。因为方法好用是个标准,所有人都用这个方法。但是这个方法实现不好,按现在的方式实现更加好一些。
现在保留这个方法,而当保留之后,再一次调用这个方法的时候,实例化的是子类。按照就近查找,子类有 connect 。
代码一编译,程序一执行,就是子类资源。代码如下:
} public class JavaDemo { public static void main(String args[]) { DatabaseChannel channel = new DatabaseChannel(); channel.connect() ; } }
在这个时候就发生了方法的覆写。由于现在实例化的是子类(Database Channel)对象,所以此时调用的方法一定是被子类所覆写过的方法,如果该方法没有被覆写过,那么将调用父类中提供的方法,覆写的意义是在于:优化父类的功能。
举例:假如谈论一个人,一个人可能是覆写意义。现在做一个很简单的设计,准备一个人,一般情况下,当人岁数大一点的时候,有人会问:“人生成就是什么?”于是侃侃而谈:“一天内吃了80个棒棒糖,结果牙全掉了”,这是成就。
往下走,不同的人会有不同成就,作为一个学生而言,去谈人生成就,那么人生成就可能是:“从斯坦福博士后毕业回归,报效国家”。
如果是职员,职员的人生成就是什么?以高登为例,年薪300万期权,股票3000万,迎娶黑穷丑,孩子十个。
人是有功利的,如人生成就:“我是个人,一个可以正常生活的人到80岁不用尿不湿”。
讨论覆写的意义,通过这样一个设计能看出来。所有人都可能去谈人生成就,于是这个时候大家发现,作为一个人应该高兴。因为我们是属于生物链的顶端,不会是生物链的底端。人是生物链的顶端,而且在这个顶端之中,有自己的思想,有自己的知识,有自己追求幸福和人的行为,还可以追求黑穷丑。
所以覆写的意义在于要保留操作,根据不同的阶段来定义不同的状态。从这个代码的本质来讲,保留了已有的方法的名称,这就好比个人的成就。
在子类进行方法覆写之后,如果现在要想继续调用父类中的方法,那么就必须使用“super.方法()”。成就必须保证你是人才有这些成就。进行数据库连接之前,应该获得一些其他连接。
直接写上“connect”,要调用复位中的方法。但实际上编译执行就死。 代码如下:
class Channel { public void connect () {} System.out.println (“【Channel父类】进行资源的连接。”) ; } } class DatabaseChannel extends channel { // 要进行数据库连接 public void connect () { // 保留已有的方法名称,而后进行覆写 connect() ;
在“connect()“这个地方什么都不加,描述的是“this.”。从本位先找,不能找到“connect”,应明确表示不从本位找,直接找复位。加“super”表示直接调用父类复位中的方法。
在进行代码编写的过程之中,一定要记住一个关键性的问题。只要是在子类中调用父类方法的时候,一定要在方法前追加“super.”。这个操作至关重要,实现了方法的覆写,容易实现。