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