Java多态性抽象类与接口细致详解( 二 )


abstract class A{ private String msg = "www.baidu.com";//属性 public void print(){ //普通方法System.out.println(msg); } //{}为方法体,所有的抽象方法上是不包含有方法体的 public abstract void fun() ; //抽象方法}public class ChouXiang{ public static void main(String args[]){ /* ChouXiang.java:12: 错误: A是抽象的; 无法实例化A a =new A();^1 个错误 */A a =new A(); }}
抽象类比普通类多了抽象方法而已,没有上面特殊的 。
抽象方法为什么不能实例化对象?
抽象类中包含抽象方法,而抽象方法与普通方法最大的区别就是没有方法体,不知道具体的实现,而如果产生了实例化就意味着以可以调用类中的所有操作 。
抽象类的使用原则:

  • 所有抽象类必须要含有子类
  • 抽象类的子类必须覆写抽象中的全部抽象方法——方法覆写一定要考虑到权限问题,抽象方法可以使用任意权限,要求权限尽量public
  • 抽象对象可以通过对象多态性,利用子类为其实现实例化
abstract class A{ private String msg = "www.baidu.com";//属性 public void print(){ //普通方法System.out.println(msg); } //{}为方法体,所有的抽象方法上是不包含有方法体的 public abstract void fun() ; //抽象方法}//一个子类只能够利用extends来继续继承抽象类,所以依然存在单继承局限 class B extends A{//定义抽象类的子类 public void fun(){System.out.println("Hello"); }}public class ChouXiang{ public static void main(String args[]){A a =new B();//向上转型a.print();a.fun(); }}
通过以上的一个程序,现在就可以清楚的发现,与之前类不一样的是,抽象类定义出了子类必须要覆写的方法,而之前的类子类可以有选择性的来决定是否覆写 。而且可以发现,抽象类实际上就比普通类多了一些抽象方法而已,其他的定义和普通类完全一样 。如果把普通类比喻成一盘炒熟的菜,那么抽象类就是一盘半成品 。
关于抽象类的若干中疑问?
1、抽象类能否使用final定义?
不能,因为final定义的类不能有子类,而抽象类必须有子类 。
2、抽象类之中能否包含构造方法?
可以,因为抽象类之中除了包含抽象方法之外,还包含了普通方法和属性,而属性一定要在构造方法执行完毕之后才可以进行初始化操作;
3、抽象类之中能否不包含抽象方法?
可以,抽象类之中可以没有抽象方法,但是反过来来讲,如果有抽象,则一定是抽象类 。即使抽象类之中没有抽象方法也不能被直接实例化 。
4、抽象类能否使用static声明?
如过定义的是外部抽象类,则不能够使用static声明,可是如果定义的是内部类,那么这个内部的抽象类使用了static声明之后,就表示一个外部的抽象类 。
abstract class A{ private String str = "Hello,China"; static abstract class B{public abstract void print(); } }class C extends A.B{ public void print(){System.out.println("你好,中国"); }}public class ChouXiang{ public static void main(String args[]){A a =new B();//向上转型a.print(); }}
结论:如果构造方法没有执行,类中对象中属性一定都是其对应数据类型的默认值 。
抽象类的最大特点在于强制规定了子类的实现结构 。
3、接口抽象类和普通类最大的特点就是约定了子类的实现要求:但是抽象类有一个缺点——单继承局限,如果要想要求以及避免单继承局限,就需要使用接口 。在以后的开发中,接口优先,在一个操作中既可以使用抽象类又可以使用我们的接口,优先考虑接口 。
3.1 接口的基本概念接口就是一个抽象方法和全局常量的集合,属于一种特殊的类,如果一个类定义的时候全部由抽象方法和全局常量所组成的话,那么这种类就称为接口,但是接口是使用interface关键字定义的 。
interface A{//定义接口 public static final String INFO="Hello,World"; public abstract void print();}interface B{ public abstract void get();}
那么在接口之中,也同样存在了抽象方法,很明显,接口对象无法进行对象的实例化操作,那么接口的使用原则如下:
1、每一个接口必须定义子类,子类使用implement关键字实现接口;
2、接口的子类(如果不是抽象类)则必须覆写接口之中所定义的全部抽象方法;
3、利用接口的子类,采用对象的向上转型方式,进行接口对象的实例化操作 。
Java多态性抽象类与接口细致详解


Java多态性抽象类与接口细致详解


Java多态性抽象类与接口细致详解

推荐阅读