抽象类和父类的区别与联系
相似:
二者都需要被子类继承,
都适用于抽取重复代码被子类重写,也就是定义公共属性和方法;
都可以被子类继承和重写;
不同:
1.抽象类不能被实例化,而父类可以;
2.抽象类可以有抽象方法和非抽象方法,但抽象类一旦有了抽象方法,子类继承必须重写;
否则子类也需要变为抽象类;
3.子类继承抽象父类之后,必须实现所有的抽象方法,否则子类声明为抽象类;
特点:
父类能干的抽象类能干,而父类不能干的抽象类也能干;
应用场景:
当子类一定会重写父类的方法时会用抽象方法;
当前不确定此方法应当如何实现,可以写为抽象方法,谁继承谁实现,框架中会使用;
如果一个类需要被多个子类继承,并且有一些方法需要在子类中被实现,可以考虑使用抽象类;
如果一个类只需要被单个子类继承,并且没有需要在子类中被实现的方法,可以考虑使用父类。
public abstract class Fu {
// 书写没有方法体的签名时,必须为抽象方法
public abstract void eat();
// 可以做父类能干的所有事,实例方法,静态方法,成员变量
public void move() {
System.out.println("1");
}
//静态方法不能被子类重写,子类如有相同的方法各为独立,也可通过Fu.laugh进行调用。
public static void laugh() {
System.out.println("哈哈哈哈");
}
// 可以声明实例变量和静态变量,调用与父类无二致
int number;
static String name;
}
public class BigSon extends Fu {
// 如若此类为具体实现抽象方法类,则必须重写父类方法
// alt+insert
// 选择override method
// 抽象方法必须全部重写否则报错
@Override
public void eat() {
System.out.println("大儿子嘎嘎能吃");
}
//此方法为实例方法不是抽象方法,也可以进行重写
//为了验证抽象类可以做父类可以做的事
@Override
public void move() {
System.out.println("哈哈哈哈");
}
}
public class LittleSon extends Fu {
@Override
public void eat() {
System.out.println("小儿子不太能吃");
}
}
public class Test {
public static void main(String[] args) {
// 父类引用指向子类对象
Fu f = new BigSon();
Fu f2 = new LittleSon();
// 调用dinner方法,也可以用f.eat();
dinner(f);
dinner(f2);
Fu.laugh();
// Fu fu = new Fu(); 此语句会报错,父类为抽象类不能被实例化(创建具体的对象)
}
//将父类引用作为形参,体现行为多态,巩固一下多态
public static void dinner(Fu f) {
f.eat();
}
}