1、为什么重写?
为了更准确的描述子类的行为特征
比如:当子类的行为与父类的某个行为不同时
父类
package javalearn;
public class Hello {
String name;
void speak(){
System.out.println(name+"正在说中文......");
}
public static void main(String[] args) {
Hello student = new Hello();
student.name="shiiqing";
student.speak();
}
}
子类
package javalearn;
public class World extends Hello {
@Override
void speak(){
System.out.println(name+"正在说英语......");//与父类的不同
}
public static void main(String[] args) {
World world=new World();
world.name="shiqing";
world.speak();
}
}
2、什么是重写?
重新改写父类的某个方法
3、怎么重写?
(1)在方法前加上注解,@Override,表示重写覆盖,如果不是重写,加上注解会出现错误
@Override
void speak(){
System.out.println(name+"正在说英语......");//与父类的不同
}
(2)如果父类中的方法加了final或static,则不能被重写,但是可以被继承
(3)重写后的方法的访问权限不能小于父类的
访问权限从大到小:public、protected、默认、private
例如:
父类
package javalearn;
public class Hello {
String name;
void speak(){
System.out.println(name+"正在说中文......");
}
public static void main(String[] args) {
Hello student = new Hello();
student.name="shiiqing";
student.speak();
}
}
子类
package javalearn;
public class World extends Hello {
@Override
protected void speak(){ //访问权限大于父类的
System.out.println(name+"正在说英语......");//与父类的不同
}
public static void main(String[] args) {
World world=new World();
world.name="shiqing";
world.speak();
}
}
(4)重写后的方法的方法名和参数列表(参数个数和参数类型)要与父类中的相同
(5)如果父类的返回值类型是void或基本数据类型,那么子类的要与其一致
注:必须一模一样,不存在之前定义数据类型那样的存储范围要大于或等于
例如:
父类
package javalearn;
public class Hello {
String name;
void speak(){ //void类型
System.out.println(name+"正在说中文......");
}
public static void main(String[] args) {
Hello student = new Hello();
student.name="shiiqing";
student.speak();
}
}
子类
package javalearn;
public class World extends Hello {
@Override
void speak(){ //void类型
System.out.println(name+"正在说英语......");//与父类的不同
}
public static void main(String[] args) {
World world=new World();
world.name="shiqing";
world.speak();
}
}
(6)如果父类返回的是引用类型,那么子类的返回类型要么和父类一致,要么是父类返回值类型的子类
例如:
父类
package javalearn;
public class Hello {
String name;
Object speak(){//Object类
System.out.println(name+"正在说中文......");
}
public static void main(String[] args) {
Hello student = new Hello();
student.name="shiiqing";
student.speak();
}
}
子类
package javalearn;
public class World extends Hello {
@Override
Object speak(){ //还可以是String等等,Object是所有类的父类
System.out.println(name+"正在说英语......");//与父类的不同
}
public static void main(String[] args) {
World world=new World();
world.name="shiqing";
world.speak();
}
}
(7)父类为静态方法是,不可重写。那么当父类为非静态方法时,重写后的子类中的方法不可以有static修饰
扫描二维码关注公众号,回复:
11120426 查看本文章