美文网首页
Java☞抽象类和接口

Java☞抽象类和接口

作者: 小明今晚加班 | 来源:发表于2019-05-31 09:50 被阅读0次

    抽象类

    抽象类定义:包含抽象方法的类。(当然也可以不包含抽象方法,但是如果不包含抽象方法的话,这普通类有什么区别?干嘛还要定义为抽象类嘛)。
    先说一下抽象方法,抽象方法是一种特殊的方法,它只有声明,没有具体实现。如下;

    package cn.ihep.abstractAndInterface;
    
    public abstract class AbstractTest {
    
        public abstract void eat();
    
    }
    

    abstract关键字用来修饰抽象方法或者抽象类,因为抽象类中有无具体实现的方法,所以不能用抽象类创建对象。
    从上面也能看出,抽象类 就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么就等于白白创建了这个抽象类,因为单单一个抽象类不能用来做任何事情。
    包含抽象方法的类称为抽象类,但不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和成员方法。注意,抽象类和普通类主要有三点区别:

    1. 抽象方法必须为public或protected,缺省情况下为public
    2. 抽象类不能用来创建对象
    3. 如果一个类继承与一个抽象类,则子类必须实现父类的抽象方法。如果子类没哟实现父类的抽象方法,则必须将子类也定义为抽象类。
      其它方面,抽象类和普通类没有什么区别。

    接口

    接口中也可以有变量和 方法,但是,接口中的变量会被隐式的指定为public static final变量(并且只能是public static final变量,用private修饰会报错),而方法会被隐式的指定为public abstract方法且只能是public abstract方法(用其它关键字,如private、protected、static 、final等修饰会报编译错误),并且接口中所有方法不能有具体实现,也就是说,接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。

    package cn.ihep.abstractAndInterface;
    
    public interface InterfaceTest {
    
        //默认就是public static final类型的变量
        int count = 10;
        
        public static final int count2 = 10;
        
        //默认就是public abstract 的方法
        int getCount();
        
        public abstract int getCount2();
    }
    

    区别

    从语法层面上看,

    1. 抽象类可以提供成员方法的具体实现,而接口只能存放public abstract方法
    2. 抽象类中的成员可以是各种类型的,而接口中的成员变量只能是public static final类型的
    3. 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码和静态方法
    4. 一个类只能继承一个抽象类,而一个类可以实现多个接口
      从设计层面上看,
      抽象类是对一个事物的抽象,即对类抽象,而接口是对行为抽象。

    什么时候用抽象类和接口

    • 如果你拥有一些方法并且想让它们中的一些有默认实现,那么请使用抽象类
    • 如果你想多继承,那么必须使用接口。由于Java不支持多继承,子类不能继承多个类,但可以实现多个接口
    • 如果不断改变(公共的)基本功能,那么就需要用抽象类

    相关文章

      网友评论

          本文标题:Java☞抽象类和接口

          本文链接:https://www.haomeiwen.com/subject/ajiitctx.html