1 java中的重写
1.1 概述
当子类需要父类的功能,而子类有新的内容,就可以重写父类中的方法。
实际开发中,代码量的逐渐增加,维护成了很大的问题,如果需要对某个方法进行修改,其代码本身、父类、子类的功能都会受到影响。重写则很好的解决了这个问题。
【重写的特点】
- 在子类和父类中,出现了方法声明相同的情况
- 子类要重写的函数,权限修饰符不能比父类的低(punlic < protected < default < private)
- 父类的私有的方法,子类不能进行重写
【重写和重载的区别】
- 重写:子类和父类中的方法相同,其函数名、参数列表、返回值类型 都相同。
- 重载:指在同一个类中,多个函数名相同,但他们的参数列表(个数、数据类型)不同。
1.2 代码实例
先创建
Person.java
package Rewrite;publicclassPerson{publicvoidwalk(){ System.out.println("走路!");}publicvoidrun(){ System.out.println("跑步!");}publicvoidwork(){ System.out.println("工作!");}}
再创建Son.java
子类。Son子类继承Person父类,并对父类的work()方法进行重写package Rewrite;publicclassStudentextendsPerson{publicvoidwork(){super.work();//使用super关键字调用父类方法 System.out.println("学习!"); System.out.println("娱乐!");}}
在Main.java
中调用package Rewrite;publicclassMain{publicstaticvoidmain(String[] args){ Person per=newPerson();//创建父类对象 per.eat(); per.work(); per.sleep(); Son stu=newSon();//创建子类对象 stu.work();}}
2 java中的@Override的含义
@Override是伪代码,表示重写(可写可不写)
【好处】
- 可以当注释使用,方便阅读;
- 编译器可以进行验证@Override下面的方法名是否是父类中所存在的函数,如果没有则会报错。
例如,父类里面的函数为run()
,在子类里面没有写@Override,然后又把函数写成了run1()
,这时编译器是可以编译通过的,因为编译器会认为这个方法是自己的子类中增加的方法,这样就没有达到重写的意义【举例】
在重写父类的onCreate
时,在方法前面加上@Override,系统可以帮助检测方法的正确性。@OverridepublicvoidonCreate(Bundle savedInstanceState){ ……}
这种方式是正确的。当写成如下的话,编译器就会报错
The method oncreate(Bundle) of type HelloWorld must override or implement a supertype method
,来保证正确重写onCreate
方法。@Overridepublicvoidoncreate(Bundle savedInstanceState){ ……}
而如果你不加@Override,则编译器将不会检测出错误,而是会认为你为子类定义了一个新方法
oncreate
。