java——抽象类与接口详解

本文详细解释了抽象类和接口的概念及其区别,包括抽象类的特点、如何实例化、构造函数的使用,以及接口的特性与实现方式等。

什么是抽象类(abstract):

       首先你要了解什么是普通类:

        普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法、普通方法、static方法、常量和变量等内容。

        抽象类是指在普通类的结构里面增加抽象方法的组成部分。那么它相当于重写了普通类,将普通类重写为一个抽象类,所以具有普通类所包含的所有方法和变量等内容。

       什么叫抽象方法:

  在所有的普通方法上面都会有一个“{}”,这个表示方法体(函数的身体),有方法体的方法一定可以被对象直接使用。而抽象方法,是指   没有方法体  的方法,同时抽象方法所在的类还必须使用关键字abstract做修饰。

         小结:拥有抽象方法的类就是抽象类,抽象类要使用abstract关键字声明!

栗子:

abstract class A{

//定义一个抽象类 

     publicvoidfun(){//普通方法  

        System.out.println("存在方法体的方法"); 

        } 

         publicabstractvoidprint();//抽象方法,没有方法体,所在的类会被abstract关键字做修饰

     }

       这个栗子中它既有普通方法,也有抽象方法,所以它是一个抽象类!

当运行一个抽象类的时候:

publicclass TestDemo {

    publicstaticvoidmain(String[] args) {

        A a = new A();

    }

}

结果:

Exception in thread "main" java.lang.Error: Unresolvedcompilation problem:

线程“main”java.lang中的异常。错误:未解决的编译问题:


     Cannot instantiate the typeA

        不能实例化类型   A


at com.wz.abstractdemo.TestDemo.main(TestDemo.java:15)

  由此可知, A是抽象的,无法直接进行实例化操作 ,为什么不能直接实例化?

      当一个类实例化之后,就意味着这个对象可以调用类中的属性或者方法,但在抽象类里存在抽象方法,而抽象方法没有方法体,没有方法体就无法调用。既然无法进行方法调用的话,就不会产生实例化对象。

栗子:

abstract class A{//定义一个抽象类

    publicvoid fun(){//普通方法

        System.out.println("存在方法体的方法");

    }

    public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰

}

//单继承
//B类是抽象类的子类,是一个普通类
class B extends A{

    //重写:抽象方法没有方法体,无法调用,所以要重写!
    @Override   
        publicvoid print() {

        System.out.println("Hello World !");

    }

}public class Test Demo {

    public static void main(String[] args) {

        A a = new B();//向上转型

        a.fun();//被子类所覆写的过的方法   

    }

}

小结:

1.抽象类实际上就比普通类多了一些抽象方法,其他组成部分和普通类完全一样; 

2.普通类对象可以直接实例化,但抽象类的对象必须经过向上转型之后才可以得到。

3.抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类(单继承) 

4.子类(如果不是抽象类,普通类)则必须重写抽象类之中的全部抽象方法。抽象方法没有方法体,没有方法体就无法调用,所以必须重写!(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。);

所有的子类如果要想正常的完成操作,必须按照指定的方法(抽象方法)进行重写才可以,

而这个时候抽象类所起的功能就是定义模板的功能

 

抽象类中的构造函数:

     抽象类中构造函数的运用:

     栗子:

abstract class A{//定义一个抽象类

    publicA(){

        System.out.println("*****A类构造方法*****");(先)

    }

    publicabstractvoidprint();//抽象方法,没有方法体,有abstract关键字做修饰

}

//单继承
class B extends A{

    public B(){       

         System.out.println("*****B类构造方法*****");

    }

    @Override

    public void print() {//强制要求重写

       System.out.println("Hello World !");(后)

    }

}public class TestDemo {

    public static void main(String[] args) {

        A a = new B();//向上转型

    }

}

        注意:虽然一个类的子类可以去继承任意的一个普通类,可是从开发的实际要求来讲,普通类尽量不要去继承另外一个普通类,而是去继承抽象类(规约作用)。

什么是接口(Interface)

         接口(Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

     两个要注意的点

       接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法接口则包含类要实现的方法。除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。

1. 接口无法被实例化,但是可以被实现:

        一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。还可以定义变量,但接口中的变量会被隐式的指定为public static final(成为了一个常量)

2. 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法(等待继承)

 

   接口小结:

   1.接口不能用于实例化对象。

   2.接口没有构造方法。

   3.接口中所有的方法必须是抽象方法。

   4.接口不能包含成员变量,(除 static 和 final 变量)。

   5.接口不是被类继承了,而是要被类实现。

   6.接口支持多继承。

 

总结:抽象类和接口对比:


1. 抽象类中的方法可以包含普通方法,在接口中,只能包含抽象方法,不能包含普通方法。
2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的(常量)。
3. 接口中不能含有静态代码块以及静态方法(使用static 修饰的方法),而抽象类是可以有静态代码块和静态方法,比如:构造方法
4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。就是说抽象类是单继承,接口是多实现!!!

由此可见:抽象类实际是普通类的一种特殊情况,而接口是抽象类的一个集合!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值