
##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. 总结