在继承关系中,子类会自动继承父类中定义的方法,但有时需要对继承的方法进行修改,即对父类的方法进行重写。
需要注意的是,在子类中重写的方法需要和父类被重写方法的具有相同的方法名、参数列表以及返回值类型。
父类
public class SuperTest {
String name = "动物";
public void shout() {
System.out.println("动物发出叫声");
}
}
子类
public class Dog extends SuperTest {
String name = "犬类";
public void shout() {
System.out.println("旺旺");
}
}
测试类
public class Example03 {
public static void main(String[] args) {
Dog dog =new Dog();
dog.shout();
}
}
需要注意的使,重写方法不会调用父类的方法,只会调用子类重写方法。
super关键字
使用super关键字访问父类的成员变量和成员方法。
父类
public class Animal{
String name = "动物";
public void shout(){
System.out.println("动物发出叫声");
}
}
子类
public class Dog{
String name = "我是狗";
void shout(){ //重写父类的shout方法
System.out.println("旺旺");
super.shout();//访问父类的成员方法
}
public void PrintName(){
System.out.println("Name="+super.name);
}
}
测试类
public class Test(){
public staitc void main(String [] args){
Dog dog = new Dog();
dog.shout();
dog.PrintName();
}
}// Output:
动物发出叫声
旺旺
2.使用super访问父类的构造方法
父类
public class Animal{
String name = "动物";
public Animal(String name){
System.out.println("我是一只"+name)
}
}
子类
public class Dog {
public Dog() {
super("沙皮狗");
// TODO Auto-generated constructor stub
}
}
测试类
public void Test{
public static void main(String [] args){
Dog dog = new Dog();
}
}
- 测试类在实例化Dog对象时,一定会调用Dog类的构造方法。
- 通过super调用父类的构造方法的代码,必须位于子类构造方法的第一行,并且只能出现一次。
如果将子类的super(“沙皮狗”)注释掉,那么编译器会报错。
在子类的构造方法中一定会调用某个父类的构造方法。这是可以在子类的构造方法中通过super指定调用哪个构造方法,如果没有指定,在实例化子类对象时会自动调用父类的无参构造方法。
子类在实例化时默认调用了无参的构造方法,在定义一个类时,如果没有特殊需求,尽量定义一个无参的构造方法,避免被继承时出错。