认识抽象类:
当我们在做子类共性功能抽取的时候,有些方法在父类中并没有具体的体现,这个时候就需要抽象类了。在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类就定义为抽象类。
在Java中有一个abstract,它是抽象的意思,可以用它修饰类、成员方法。
package cn.ensource.d4_abstract;
// 抽象类
public abstract class A {
// 抽象方法,必须用abstract修饰,并且只有方法签名,不能有方法体
public abstract void run();
}
我们要注意的是:
抽象类不能创建对象。
A 是一个抽象类,不能被实例化。
抽象类仅作为一种特殊的父类,让子类继承并实现。
A 类:
package cn.ensource.d4_abstract;
// 抽象类
public abstract class A {
private String name;
public static String schoolName;
public A() {
}
public A(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static String getSchoolName() {
return schoolName;
}
public static void setSchoolName(String schoolName) {
A.schoolName = schoolName;
}
// 抽象方法,必须用abstract修饰,并且只有方法签名,不能有方法体
public abstract void run();
}
B类:
package cn.ensource.d4_abstract;
// 抽象类:一个类继承了抽象类,必须重写完抽象类的全部抽象方法
public class B extends A{
@Override
public void run() {
System.out.println("B run");
}
}
测试类:
package cn.ensource.d4_abstract;
public class Test {
public static void main(String[] args) {
// 目标:认识抽象类和其特点
// 注意:抽象类不能创建对象
// A a = new A();
B b = new B();
b.run();
}
}
抽象类的场景和好处:
也就是说:所有子类都要完成这个方法。那我们在父类中抽象出这个抽象方法。
实现行为多态。
抽象类不是不能调用方法,是不能创建对象。
使用了抽象类,更专业,多态会更好!
强制子类重写方法。
abstract类:
package cn.ensource.d4_abstract2;
public abstract class Animal {
private String name;
public abstract void cry(); // 让子类都进行重写方法,由子类实现,对多态支持更好
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Cat类:
package cn.ensource.d4_abstract2;
public class Cat extends Animal{
@Override
public void cry() {
System.out.println("喵喵~");
}
}
Dog类:
package cn.ensource.d4_abstract2;
public class Dog extends Animal{
@Override
public void cry() {
System.out.println("旺旺~");
}
}
测试类:
package cn.ensource.d4_abstract2;
public class Test {
public static void main(String[] args) {
// 掌握抽象类的好处
Animal a = new Cat();
a.setName("叮当猫");
a.cry(); // 更好地支持了多态
System.out.println(a.getName());
}
}
抽象类的应用场景和超出是什么?
父类知道每个子类都要做某个行为,但每个子类要做的情况不太一样,父类就定义成抽象方法,交给子类去重写实现。我们抽象出来的抽象类,就是为了更好地支持多态。
抽象类我们不是非要用的。强制子类重写。
用抽象类是最佳实践,不用也是可以的。但是使用是最佳实践。
抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。
抽象类是不能实例化的:
抽象类如何实例化呢?参照多态的方式,通过子类对象实例化,这叫抽象类多态。
抽象类的子类:
要么重写抽象类中的所有抽象方法。
要么是抽象类。