重写父类方法
子类扩展了父类,子类是一个特殊的父类。有些时候我们在扩展一个类的子类时,子类的方法与父类不尽相同,比如鸟类中不是所有的鸟都能飞翔,比如鸵鸟,这种情况下,鸵鸟子类继承父类鸟时,需要重写父类中飞翔的方法。比如下面的例子。
public class Bird
{
private String Birdname;
public void setBirdname( String name)
{
this.Birdname = name;
}
public String getBirdname()
{
return this.Birdname;
}
public String fly()
{
return "i can fly.";
}
}
public class Ostrich extends Bird
{
public String fly()
{
return "i can`t fly,but i an run.";
}
public static void main(String[] args)
{
Ostrich one = new Ostrich();
one.setBirdname("Ostrich");
System.out.println("i am a " + one.getBirdname() + " " + one.fly());
}
}
运行以上程序会显示
i am a Ostrich i can`t fly,but i an run.
在例子中,子类Ostrich重写了父类的fly方法。在类方法的复写中,需要遵循“两同两小一大”原则:
两同
- 方法名相同,形参列表相同。
两小
- 子类返回值类型小于等于父类返回值,父类中被重写的方法的返回值类型为void,则子类重写方法中的返回值类型只能为void。父类中被重写的返回值类型为A类,则子类重写方法的返回值类型可以是A类或者A类的子类。父类被重写的方法的返回值类型是基本数据类型,则子类重写方法的返回值类型必须是相同的基本数据类型。
- 子类方法中声明抛出的异常比父类方法声明抛出的异常更小或者相等。
一大
- 子类方法的访问权限应该比父类中的方法的访问权限更大或者相等,子类中不能重写父类中声明为private权限的方法。定义了private以后只能在本类中使用,子类不能重写。
super限定
将上面第二个程序修改为:
public class Ostrich extends Bird
{
public String fly()
{
return "i can`t fly,but i an run.";
}
public String basefly()
{
return super.fly();
}
public static void main(String[] args)
{
Ostrich one = new Ostrich();
one.setBirdname("Ostrich");
System.out.println("i am a " + one.getBirdname() + " " + one.basefly());
}
}
或者为:
public class Ostrich extends Bird
{
public String fly()
{
return "i can`t fly,but i an run.";
}
public static void main(String[] args)
{
Ostrich one = new Ostrich();
one.setBirdname("Ostrich");
System.out.println("i am a " + one.getBirdname() + " " + new Bird().fly());
}
}
都将输出:i am a Ostrich i can fly.
- 子类调用父类方法时可用
super.方法名
来应用被重写的父类方法。