在讲抽象类之前有必要强调一下abstract修饰符:
1.abstract修饰的类为抽象类,此类不能有对象,(无法对此类进行实例化,说白了就是不能new);
2.abstract修饰的方法为抽象方法,此方法不能有方法体(就是什么内容不能有);
关于抽象类的使用特点:
1.抽象类不能有对象,(不能用new此关键字来创建抽象类的对象);
2.有抽象方法的类一定是抽象类,但是抽象类中不一定有抽象方法;
3.抽象类中的抽象方法必须在子类中被重写。
同学们可能会问到:抽象类不能被“new”,抽象方法必须重写,那么定义它们做什么嘞? 答:抽象类生来就注定它是要被继承的,如果没有任何一个类去继承它的话,那么也就失去了它的意义;抽象方法生来就是要被重写的,而且是必须重写。(只要继承了某个抽象类,就必须去重写此抽象类中含有的抽象方法)
《Java编程思想》书中定义抽象类:“包含抽象方法的类”。即如果一个类含有抽象方法,则称这个类为抽象类。抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以一般不能用抽象类创建对象。注意有些类是有abstract修饰,但是没有abstract方法,比如Android AIDL的内部静态abstract类Stub。
如何实现抽象类的实例化
上面说到一般情况下abstract类是不能够实例化,但下面两种情形下是可以的
通过abstract 父类的引用来指向子类的实例,子类A继承abstract 父类B,B aa=new A(“a”);
--------------------------------------------------------------------------------------------
接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成。接口是解决Java无法使用多继承的一种手段,但是接口在实际中更多的作用是制定标准的。或者我们可以直接把接口理解为100%的抽象类,既接口中的方法必须全部是抽象方法。
我们不能直接去实例化一个接口,因为接口中的方法都是抽象的,是没有方法体的,这样怎么可能产生具体的实例呢?但是,我们可以使用接口类型的引用指向一个实现了该接口的对象,并且可以调用这个接口中的方法。因此,上图中最后的方法调用我们还可以这样写:(实际上就是使用了Java中多态的特性)
2.一个类可以实现不止一个接口。
3.一个接口可以继承于另一个接口,或者另一些接口,接口也可以继承,并且可以多继承。
4.一个类如果要实现某个接口的话,那么它必须要实现这个接口中的所有方法。
5.接口中所有的方法都是抽象的和public的,所有的属性都是public,static,final的。
6.接口用来弥补类无法实现多继承的局限。
7.接口也可以用来实现解耦。
--------------------------------------------------------------------------------------------
下面比较一下两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然 eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。