public abstract class Animal {
Animal() {
System.out.println("Animal1111");
}
public void Animalb()
{
System.out.println("Animalbbbbbb");
}
public abstract void Animalc();
}
public class Bird extends Animal {
@Override
public void Animalc() {
// TODO Auto-generated method stub
System.out.println("Animalccccccc");
}
Bird()
{
super();
}
public static void main(String[] args)
{
Bird bird =new Bird();
bird.Animalb();
bird.Animalc();
}
}
System.out.println("Animal1111");
public abstract class Animal {
Animal() {
System.out.println("Animal1111");
}
public void Animalb()
{
System.out.println("Animalbbbbbb");
}
public abstract void Animalc();
}
public class Bird extends Animal {
@Override
public void Animalc() {
// TODO Auto-generated method stub
System.out.println("Animalccccccc");
}
Bird()
{
}
public static void main(String[] args)
{
Bird bird =new Bird();
bird.Animalb();
bird.Animalc();
}
}
上面 Bird()是空函数,但Bird bird =new Bird() 实例化的第一时间,Bird就自动去继承Animal类的Animal方法了。
也就相当于写了super()
当父类的同名方法中,包含参数时,此时子类就需要手动添加带参数的super了。
public abstract class Animal {
Animal(int a) {
System.out.println("Animal1111");
}
public void Animalb()
{
System.out.println("Animalbbbbbb");
}
public abstract void Animalc();
}
public class Bird extends Animal {
@Override
public void Animalc() {
// TODO Auto-generated method stub
System.out.println("Animalccccccc");
}
Bird()
{
super(5);
}
public static void main(String[] args)
{
Bird bird =new Bird();
bird.Animalb();
bird.Animalc();
}
}
由于Animal类中的Animal方法包含了参数,此时如果在Bird类的Bird方法中不写super,也就等着系统默认添加:
super()
此时必然报错。因为系统添加的super()是一个无参的,与实际父类定义不同。所以需手动更改成带参数的:
super(5)
public class Bird extends Animal {
@Override
public void Animalc() {
// TODO Auto-generated method stub
System.out.println("Animalccccccc");
}
Bird()
{
super(5);
}
public static void main(String[] args)
{
Bird bird =new Bird();
bird.Animalb();
bird.Animalc();
bird.Animal(); //这句报错。父类中的Animal方法不能被调用。
}
}
public class Bird extends Animal {
@Override
public void Animalc() {
// TODO Auto-generated method stub
System.out.println("Animalccccccc");
}
Bird()
{
super(5);
}
public void Bird1()
{
super(5); //这句报错。
System.out.println("bird11111");
}
public static void main(String[] args)
{
Bird bird =new Bird();
bird.Animalb();
bird.Animalc();
}
}
参考
抽象方法表示没有实现的方法,没有方法体的方法。例如:
public abstract void doSome(); //注意:没有“{ }”。
抽象方法特点是:前面使用abstract修饰,没有方法体,以分号结尾。
public abstract class Animal {
Animal(int a) {
System.out.println("Animal1111");
}
public void Animalb()
{
System.out.println("Animalbbbbbb");
}
public abstract void Animalc();
}
public class Bird extends Animal {
1 @Override
2 public void Animalc() {
3 // TODO Auto-generated method stub
4 System.out.println("Animalccccccc");
5 }
Bird()
{
super(5);
}
public static void main(String[] args)
{
Bird bird =new Bird();
bird.Animalb();
bird.Animalc();
}
}
1~5行,是系统默认添加的,是父类中抽象方法。
编译器可以给你验证@Override下面的方法名称是否是你父类中所有的,如果没有就会报错。
比如当你想要在子类中重写父类的一个方法,但是你把名字打错了,当你写了@Override编译器会提示你,你写的这个方法父类中没有;但是如果你没有写@Override编译器就会觉得这个是你子类中写的新的方法,并不会报错,到时候你debug还是很麻烦的一件事。