抽象类: 使用abstract修饰的类。
接口与抽象类的使用动机:使用抽象类是为了代码的复用,而使用接口的动机是为了实现多态性。
特点:
1.只能被当作父类继承使用,无法对其直接进行实例化。
2.有抽象方法的类一定是抽象类。子类需要重写父类所有的抽象方法,若不想重写则子类也必须被定义为抽象方法。
3.抽象类中可以有自己的成员方法和成员变量。
4.抽象类可以有自己的构造方法。
5.每个类只能继承一个抽象父类。
6.抽象类中允许有静态方法。
优点:
1.作为父类使用,定义一个高层模版,规范子类代码结构。
2.提高代码的重用性。
3.可以使用抽象父类的引用统一调用不同子类的相同行为的不同实现。实现多态性。
例
抽象类
public abstract class ParentTest {
private final String TAG="ParentTest";
//抽象父类的静态变量
public static int A=1;
//抽象方法交给子类去重写
public abstract void setType();
//使用父类的高层方法去调用子类的实现
public void getType(){
Log.d(TAG, String.valueOf(A));
setType();
}
}
子类A
public class TestA extends ParentTest {
private final String TAG="testA";
public static int A=2;
//重写抽象方法
@Override
public void setType() {
Log.d(TAG, "调用了testA");
//调用了自己的静态变量
Log.d(TAG, String.valueOf(A));
}
}
子类B
public class TestB extends ParentTest {
private final String TAG="testB";
//重写抽象方法
@Override
public void setType() {
Log.d(TAG, "调用了testB");
//调用了父类抽象类的静态变量
Log.d(TAG, String.valueOf(A));
}
}
调用
public class MainActivity extends AppCompatActivity {
private final String TAG="MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ParentTest test=new TestA();
//调用高层ParentTest的getType方法
test.getType();
test=new TestB();
test.getType();
}
}
通过实例可以看出子类继承父类时必须重写抽象方法,并使用父类的引用可以调用子类重写的抽象方法。子类可以直接使用父类的静态变量,子类不能重写父类的静态变量,当父类与子类有相同的静态变量时,父类的静态变量将会被隐藏。程序将抽象类的具体实现交于子类去完成。