- 在java里含有抽象方法的类一定要声明为抽象类
- 抽象类的抽象方法只能声明,不需要实现也不能实现
- 继承抽象类的子类,如果子类也是抽象类,则可以不实现抽象方法,子类不是抽象类的话则必须实现抽象方法
新建一个抽象类Person
package review;
public abstract class Person
{
public void show()
{
System.out.println("调用抽象类Person的非抽象方法\n");
}
public abstract void whyIsAbstract() ;
}
创建一个实现了抽象类的ImplementationAbstractClass类,可以
看到ImplementationAbstractClass类不是抽象类,所以必须实现抽象方法whyIsAbstract()。如果不实现则会出错
public class ImplementationAbstractClass extends Person
{
public void whyIsAbstract()
{
System.out.println("调用ImplementationAbstractClass类实现的抽象方法whyIsAbstract()\n");
}
public void show()
{
System.out.println("调用ImplementationAbstractClass类show()的方法\n");
}
}
ImplementationAbstractClass类还重写了show()方法,
创建ImplementationAbstractClass类对象调用show()方法时,将会调用重写后的show()方法
下面创建一个继承了抽象类的NotImplemention类来验证如果不重写show()方法调用时将会调用Person类的show()方法
public class NotImplemention extends Person
{
public void whyIsAbstract() {}
}
下文创建一个抽象类Student,继承父类Person,由于子类是抽象类,所以不实现父类的抽象方法whyIsAbstract()是允许的
package review;
public abstract class Student extends Person
{
public void introduce()
{
System.out.println("我是学生类");
}
}
CollegeStudent类继承了抽象类Student,抽象类Student里有未实现的抽象方法whyIsAbstract(),
所以CollegeStudent类就必须实现whyIsAbstract()方法
public class CollegeStudent extends Student
{
@Override
public void whyIsAbstract()
{
System.out.println("CollegeStudent类实现了抽象类的whyIsAbstract()方法 ");
}
}
主函数验证如下:
package review;
public class Main
{
public static void main(String[] args)
{
ImplementationAbstractClass test=new ImplementationAbstractClass();
System.out.println(test.toString());
test.whyIsAbstract();
Person one=test;
System.out.println(one.toString());
one.show();
Person two=new ImplementationAbstractClass();
System.out.println(two.toString());
two.show();
Person three=new NotImplemention();
System.out.println(three.toString());
three.show();
Student student=new CollegeStudent();
student.whyIsAbstract();
student.introduce();
}
}
总结:在java里含有抽象方法的类一定要用abstract关键字声明,继承了抽象类的子类如果不是抽象类,
则必须重写父类的抽象方法;子类如果重写了父类的非抽象方法,子类对象调用该方法时将调用最新的方法,即重写后的方法;
抽象类不能实例化,只能通过其子类实例化。
使用子类实例化抽象类时实质是把子类对象的指针赋给父类,即父类对象名和子类对象名指向同一个地址,上图可以证明抽象类Person对象与其子类
ImplementationAbstractClass对象test指向同一个对象id号,并且类型均为子类类型,
即通过子类实例化的父类对象所属类型依旧为子类类型。