下面是详细讲解"JavaSE-面向对象(方法重写)"的完整攻略:
什么是方法重写?
Java中,当子类继承父类时,如果子类需要对父类中的某个方法进行重新实现,那么就可以使用方法重写。方法重写的核心是子类中的方法与父类中的方法拥有相同的名称和参数列表,但是子类中的方法具备不同的实现。
方法重写的语法
子类中的方法必须与父类中的方法具备相同的名称和参数列表,并且具备相同的返回类型或其子类类型。此外,子类中的方法的访问修饰符不能低于父类中的方法(可以等于或高于),而且子类中的方法不能抛出父类方法的“检查型异常”的更多异常类型。
方法重写的语法示例:
public class Parent {
public void printMessage() {
System.out.println("Hello, world!");
}
}
public class Child extends Parent {
@Override
public void printMessage() {
System.out.println("Hello, Java!");
}
}
方法重写的示例解释
上面的示例代码定义了一个名为Parent的类,其中包含一个名为printMessage的方法。该方法只是简单地打印一条“Hello, world!”的消息。当子类Child继承了Parent类时,它重新实现了printMessage方法。子类中的方法与父类中的方法拥有相同的名称和参数列表,但是子类中的方法具备不同的实现,它打印出了一条不同的消息“Hello, Java!”
下面对这个示例进行进一步解释:
Parent parent = new Parent();
Child child = new Child();
parent.printMessage(); // 输出 "Hello, world!"
child.printMessage(); // 输出 "Hello, Java!"
在这段代码中,首先创建了一个名为parent的Parent类对象,然后调用了该对象的printMessage方法。结果是输出一条“Hello, world!”的消息。接下来,创建了一个名为child的Child类对象,并调用了该对象的printMessage方法。结果是输出一条“Hello, Java!”的消息。这是因为重写方法时,子类中的方法具有优先权,即在子类中调用重写后的方法时,将运用子类中的定义和实现。
方法重写的注意事项
1.访问修饰符:子类中的方法的访问修饰符不能低于父类中的方法(可以等于或高于)。
2.返回类型:子类中的方法的返回类型必须是相同的或是其子类。
3.参数列表:子类中的方法参数列表必须与父类中的方法完全相同。
4.异常类型:子类中的方法不能抛出父类方法的“检查型异常”的更多异常类型。
5.注解“@Override”:如果子类覆盖重写了父类中的方法,为了避免在不知情的情况下重写了父类中本不存在的方法,可以在子类重写该方法上面加上“@Override”注解。
实例说明
下面再给出一个实例说明,通过比较不同的方法重写方式,来理解方法重写的细节。
public class Shape {
public void draw() {
System.out.println("draw a shape");
}
}
public class Circle extends Shape {
@Override
public void draw() {
System.out.println("draw a circle");
}
public void printMessage() {
System.out.println("this is a circle");
}
}
public class Main {
public static void main(String[] args) {
Shape s = new Shape();
Circle c = new Circle();
Shape sc = new Circle();
s.draw(); // 输出“draw a shape”
c.draw(); // 输出“draw a circle”
sc.draw(); // 输出“draw a circle”
// sc.printMessage(); // 编译错误,因为Shape类型的引用无法访问子类Circle中新增的方法
}
}
在这个示例程序中,定义了一个名为Shape的类,其中包含一个名为draw的方法。同时,还定义了一个名为Circle的类,它继承了Shape,并重新实现了draw方法。此外,在Circle类中新增了一个名为printMessage的方法。
在main方法中,创建了三个对象s、c、sc。s是Shape类型的对象,c是Circle类型的对象,sc是Shape类型的对象,但是将Circle的对象赋值给它。在调用这三个对象的draw方法时,输出的分别是“draw a shape”,“draw a circle”和“draw a circle”。这表明在sc对象中,虽然它是Shape类型的引用,但是调用draw方法时,运用的是Circle类中重写的draw方法。因为方法的运行结果取决于对象实际的类型(即对象引用的类型),而不是对象在定义时声称的类型(即对象类型声明时的类型)。此外,在调用sc的printMessage方法时,编译器会报错,因为Shape类型的引用无法访问子类Circle中新增的方法。
这个示例旨在强调方法重写的一个细节:子类中的方法不但可以重写父类中的方法,还可以添加新的方法。但是在使用时,应该注意对象的实际类型。如果使用了父类类型的引用,那么该引用是不可能调用子类新增的方法的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaSE-面向对象(方法重写) - Python技术站