抽象类
##1.抽象类的基本概念
普通类是一个完善的功能类,可以直接实例化对象,并且普通类中可以包含构造方法、普通方法、static方法、常量、变量等内容,而抽象类就是在普通类的结构里面增加抽象方法的组成部分。抽象类是对根源的抽象,而接口是一个特殊的抽象类,是对动作的抽象。
拥有抽象方法的类必须为抽象类!
2.定义一个抽象类:
abstract class Demo1 {
public static void test1() {
System.out.println("抽象类中的普通方法");
}
public abstract void test2(); //抽象方法
}
3. 抽象类的使用
1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public;
2)抽象类不能直接实例化,需要依靠子类采用向上转型的方式处理;
3)抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类;
4)子类(如果不是抽象类)则必须覆写抽象类之中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。)
4. 抽象类的注意事项
1)抽象类中有构造方法吗?
由于抽象类中会存在一些属性,那么抽象类中一定拥有构造方法,其存在的目的就是为了属性的初始化,并且子类对象实例化的时候,依然会优先满足父类构造,然后再执行子类构造。(向上转型)
public class Demo {
public static void main(String[] args) {
A b = new B();
}
}
abstract class A {//定义一个抽象类
public A() {
System.out.println("**抽象类***A类构造方法*****");
}
public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
}
//单继承
class B extends A {//B类是抽象类的子类,是一个普通类
public B() {
System.out.println("***实现类**B类构造方法*****");
}
@Override
public void print() {//强制要求覆写
System.out.println("Hello World !");
}
}
**抽象类***A类构造方法*****
***实现类**B类构造方法*****
2)抽象类可以用final声明么?
不能,因为抽象类必须有子类,而final定义的类不能有子类;
3)抽象类能否使用static声明?
外部抽象类不允许使用static声明,而内部的抽象类运行使用static声明。使用static声明的内部抽象类相当于一个外部抽象类,继承的时候使用“外部类.内部类”的形式表示类名称。
非静态内部类不一定非要依靠外部类对象而存在,也可能依靠外部类的子类对象而存在。
abstract class A1{//定义一个抽象类
static abstract class B1{//static定义的内部类属于外部类
public abstract void print();
}
}
class C extends A1.B1{
public void print(){
System.out.println("**********");
}
}
public class Demo {
public static void main(String[] args) {
A1.B1 ab = new C();//向上转型
ab.print();
}
}
5)有时候由于抽象类中只需要一个特定的系统子类操作,所以可以忽略掉外部子类。这样的设计在系统类库中会比较常见,目的是对用户隐藏不需要知道的子类。
abstract class A{//定义一个抽象类
public abstract void print();
private static class B extends A{//内部抽象类子类
public void print(){//覆写抽象类的方法
System.out.println("Hello World !");
}
}
//这个方法不受实例化对象的控制
public static A getInstance(){
return new B();
}
}
public class TestDemo {
public static void main(String[] args) {
//此时取得抽象类对象的时候完全不需要知道B类这个子类的存在
A a = A.getInstance();
a.print();
}
}
Hello World !
5. 总结
- 抽象类是比普通类多了抽象方法
- 抽象外部类不能使用static修饰,内部类可以
- 抽象类默认就是public方法修饰,不能用fianl修饰,因为需要子类去继承
- 抽象类不能被实例化,必须依靠子类采用向上转型的方式处理
- 子类继承了抽象类就必须实现抽象类中的所有抽象方法,除非该子类就是抽象类
- 如果抽象类中有构造方法,子类也有构造方法,那么实例化子类的时候依然后有点调用父类的构造方法然后再调用子类的构造方法,这也就是一个向上转型。
- 向上转型:如果子类向上转型为父类,则子类会遗失掉父类中没有定义的方法,而除了private的属性外,其他的属性都会被父类的属性覆盖。