详解JavaSE中抽象类与接口的定义及使用

目录
  • 一、抽象类
    • 1、抽象类定义
    • 2、抽象方法
  • 二、接口
    • 1、接口定义
    • 2、类实现接口
    • 3、接口与多态联合
    • 4、extends和implements
    • 5、接口在开发当中的作用
    • 6、is has like
    • 7、抽象类与接口

一、抽象类

1、抽象类定义

1、什么是抽象类?

类和类之间具有共同特征,将这些共同特征提取出来,形成的就是抽象类。

类到对象是实例化,对象到类是抽象。

抽象类无法实例化,无法创建对象。抽象类是类和类之间有共同特征,将这些具有共同特征的类再进一步抽象,就形成了抽象类。由于类本身是不存在的,所以抽象类无法创建对象,即无法实例化。

2、抽象类属于什么类型?

抽象类也属于引用数据类型。

3、抽象类的语法:

[修饰符列表] abstract class 类名{
        类体;
}

4、抽象类是无法实例化的,无法创建对象,因此抽象类是用来被子类继承的。

抽象类的子类还可以是抽象类

//银行账户类
abstract class Account{
}

//信用卡类,子类继承抽象类,子类可以实例化对象
class CreditAccount extends Account{
}

//抽象类的子类还可以是抽象类
abstract class Credit extends Account{
}

5、抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是为子类提供的

2、抽象方法

抽象方法表示没有实现的方法,没有方法体的方法。

抽象方法的特点:

1、没有方法体,以分好结尾

2、前面修饰符列表当中有abstract关键字

例如:

public abstract void doSome;
  • 抽象类当中不一定有抽象方法,但是有抽象方法的类一定是抽象类。
  • 抽象类当中可以有抽象方法也可以有非抽象方法。
  • 抽象方法必须出现在抽象类当中,一个非抽象类继承抽象类,必须将抽象类当中的抽象方法进行实现。
abstract class Animal{
    public abstract void move();
}

class Bird extends Animal{
    //将抽象类当中的抽象方法进行重写
    public void move(){};
}

上面当中,如果Bird类是抽象的话,则抽象方法也可以不重写。

public class Test01 {
    public static void main(String[] args) {
        //使用多态,父类型引用指向子类型对象
        //Bird不是抽象类,可以创建对象,向上转型
        Animal a=new Bird();//面向抽象编程
        a.move();
        //在编译的时候,a会检查Animal当中的move方法
        //在执行的时候,a会使用Bird当中的move方法
    }
}

判断题:java语言当中凡是没有方法体的方法都是抽象方法(错)

Object类当中有很多方法都没有方法体,都是以分好结尾的,但是他们都不是抽象方法,例如:

public native int hashCode();

这个方法底层调用了C++写的动态链接库程序。前面修饰符列表中没有abstract。有一个native,表示调用JVM本地的程序。

二、接口

1、接口定义

1、接口也是一种引用数据类型,编译之后也是一个class字节码文件。

2、接口是完全抽象的。(抽象类是半抽象的)或者说接口是特殊的抽象类。

3、接口的定义:

[修饰符列表]  interface 接口名{
}

4、接口支持多继承,一个接口可以继承多个接口。

//定义接口
interface A{
}

interface B{
}
//支持多继承
interface C extends A,B{
}

5、接口当中只包含两部分内容,一部分是:常量,一部分是:抽象方法。

//我的数学接口
interface MyMath{
    public abstract int sum(int a,int b);
}

6、接口当中所有的元素都是public修饰的。

7、接口当中的抽象方法定义时:public abstract修饰符可以省略。

8、接口当中的方法都是抽象方法,所有接口当中的方法不能有方法体。

9、接口当中的方法不能有大括号,因为大括号就是方法体,而抽象方法不能有方法体。

10、接口当中常量的修饰符:public static final可以省略。

11、常量不能重新赋值。

interface MyMath{
    double PI=3.1415926;
    //PI是常量
    int sub(int a,int b);//相减的抽象方法
    int sum(int a,int b);//相加的抽象方法
}

2、类实现接口

接口的基础语法:

1、类和类之间叫做继承,类和接口之间叫做实现。(其实仍然可以将实现看成是继承)

  • 继承使用extends关键字完成
  • 实现使用implements完成
  • 当一个非抽象类实现接口的话,必须将接口当中所有的抽象方法全部实现。
interface MyMath{
    double PI=3.1415926;
    //PI是常量
    int sub(int a,int b);//相减的抽象方法
    int sum(int a,int b);//相加的抽象方法
}

class My implements MyMath{
    public int sub(int x,int y){
        return x-y;
    }
    public int sum(int x,int y){
        return x+y;
    }
}

接口和接口之间支持多继承,一个类也可以同时实现多个接口。

这种机制弥补了java当中类与类之间只支持单继承的缺陷。

经过测试,接口和接口之间在进行强制类型转换的时候,没有继承关系,也可以强转。但是注意:在运行时可能会出现ClassCastException异常。

public class Test04 {
    public static void main(String[] args) {
        M m=new E();
        K k=(K)m;
    }
}
interface K{
}
interface M{
}
class E implements M{
}

最终实际上和之前一样,需要加instanceof运算符进行判断。

这句话不适合在接口当中:无论向上转型还是向下转型,两种类型之间必须要有继承关系,没有继承关系,则编译器会报错。

上面的代码更改如下:

        if(m instanceof K){
            K k=(K)m;  //判断,否则会出现异常
        }

3、接口与多态联合

public class Test02 {
    public static void main(String[] args) {
        MyMath m=new My();
        //面向接口编程(调用接口里面的方法
        int result=m.sub(10,20);
        System.out.println(result);
        int result2=m.sum(1,3);
        System.out.println(result2);
    }
}

//我的数学接口
interface MyMath{
    double PI=3.1415926;
    //PI是常量
    int sub(int a,int b);//相减的抽象方法
    int sum(int a,int b);//相加的抽象方法
}

class My implements MyMath{
    public int sub(int x,int y){
        return x-y;
    }
    public int sum(int x,int y){
        return x+y;
    }
}

4、extends和implements

问题:继承和实现都存在的话,代码应该怎么写?

如果同时出现继承和实现的话,继承的关键字在前面,实现的关键字在后面。

接口通常提取的是行为动作。

class Cat extends Animal1 implements Flyable{
}
public class Test04 {
    public static void main(String[] args) {
        Flyable f=new Cat();//多态
        f.fly();
        Flyable f1=new Pig();
        f1.fly();
    }
}

//动物类:父类
class Animal1{
}
//可飞翔的接口
interface Flyable{
    void fly();
}

//动物类子类:猫类
//flybale是一个接口,即一对翅膀,通过接口插到猫身上,让猫可以飞翔
class Cat extends Animal1 implements Flyable{
    public void fly(){
        System.out.println("猫猫起飞!");
    }
}

//动物类子类:蛇类
//如果不想让蛇飞,就不实现flyable接口
//没有实现这个接口就表示没有翅膀,那肯定不能飞翔
class Snack extends Animal1{
}

//动物类子类:猪类,想让猪飞,插接口
class Pig extends Animal1 implements Flyable{
    public void fly(){
        System.out.println("猪猪起飞!");
    }
}

5、接口在开发当中的作用

接口在开发当中的作用,类似于多态在开发当中的作用。

多态:面向抽象编程,不面向具体编程,降低程序的耦合度,提高程序的扩展力。

面向抽象编程可以修改为:面向接口编程。因为有了接口就有了可插拔。可插拔表示扩展能力强,不是焊接死的。例如:主板和内存条之间有插槽,这个插槽就是接口,内存条坏了,可以重新买一个换,这就是高扩展性和低耦合度。

实现一个菜单接口:

  1. 中午去饭馆吃饭,这个过程当中有接口,接口是抽象的。
  2. 菜单是一个接口。(菜单上面有一个抽象的照片:西红柿炒鸡蛋)
  3. 顾客面向菜单点菜,调用接口。
  4. 后台的初始负责把西红柿鸡蛋做好,是接口的实现者。
  5. 这个菜单接口的作用:让顾客和厨师解耦合,顾客不用找后厨,后厨不用找顾客,他们之间完全依靠这个抽象的菜单进行沟通。符合OCP开发原则。

顾客有一个菜单 Customer has a FoodMenu,凡是能够使用has a 来描述的,统一以属性的方式存在

Cat is a Animal 凡是满足 is a 的表示都可以设置为继承。

西餐厨师类:

//西餐厨师实现菜单上面的菜
public class AmericanCooker implements FoodMenu{
    public void xiHongShiJidan(){
        System.out.println("西餐中的西红柿炒鸡蛋");
    }
    public void yuXiangRouSi(){
        System.out.println("西餐中的鱼香肉丝");
    }
}

中餐厨师类:

//中餐厨师实现菜单上面的菜。厨师是接口的实现者。
public class ChinaCooker implements FoodMenu{
    public void xiHongShiJidan(){
        System.out.println("中餐中的西红柿炒鸡蛋");
    }
    public void yuXiangRouSi(){
        System.out.println("中餐中的鱼香肉丝");
    }
}

顾客类:

public class Customer{
    //面向接口编程
    private FoodMenu foodmenu;//私有化体现封装性,则要提供set和get方法
    public Customer() {
    }
    public Customer(FoodMenu foodmenu) {
        this.foodmenu = foodmenu;
    }
    public FoodMenu getFoodmenu() {
        return foodmenu;
    }
    public void setFoodmenu(FoodMenu foodmenu) {
        this.foodmenu = foodmenu;
    }
    public void order(){
        //方法一:使用get方法拿到菜单
        FoodMenu f=this.getFoodmenu();
        //方法二:直接使用foodmenu,因为私有的属性可以在本类当中使用
        foodmenu.xiHongShiJidan();
        foodmenu.yuXiangRouSi();
    }
}

菜单类:

public interface FoodMenu {
    void xiHongShiJidan();
    void yuXiangRouSi();
}

测试类:

public class Test {
    public static void main(String[] args) {
        //创建厨师对象(多态)
        FoodMenu menu1=new ChinaCooker();
        FoodMenu menu2=new AmericanCooker();
        //创建顾客对象
        Customer m1=new Customer(menu1);
        Customer m2=new Customer(menu2);
        //顾客点菜
        m1.order();
        m2.order();

​​​​​​​    }
}

任何一个接口都有调用者和实现者,接口可以将调用者和实现者解耦合。以后的大项目开发,一般都是将项目分离成一个一个的模块,模块之间采用接口衔接,降低耦合度。

6、is has like

1.is a :Cat is an Animal.(猫是一个动物)

凡是满足is a的就表示继承关系。

2.has a:He has a pen.(他有一只笔)

  • 凡是能够满足has a 关系的表示关联关系。
  • 关联关系通常以“属性”的形式存在。

3.like a :Cooker like a menu.(厨师就像一个菜单)

  • 凡是满足like a 关系的表示实现关系。
  • 实现关系通常是类实现接口。

7、抽象类与接口

抽象类与接口的区别:

  • 抽象类是半抽象的,接口是完全抽象的。
  • 抽象类中有构造方法,接口当中没有构造方法。
  • 接口和接口之间支持多继承,类和类之间只支持单继承。
  • 一个类可以同时实现多个接口,一个抽象类只能继承一个类(单继承)。
  • 接口都在只允许出现常量和抽象方法。

到此这篇关于详解JavaSE中抽象类与接口的定义及使用的文章就介绍到这了,更多相关JavaSE抽象类 接口内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java由浅入深通关抽象类与接口下

    目录 1.对象的比较 1.1 Comparable<T> 1.2 Comparator<T> 2.克隆对象 2.1 Cloneable 2.2 深拷贝和浅拷贝 3.Object类 3.1 equals 3.2 toString 本篇介绍在对对象进行比较和克隆操作的时候会使用的接口,然后介绍一个类:Object 在Java中Object类默认是所有类的父类,里面有一些常用的方法会介绍 1.对象的比较 两个对象要进行比较之前,我们首先需要确定依据什么来进行比较,对象中的成员变量那么多,

  • 解析JavaSe的抽象类和接口

    目录 1. 抽象类和抽象方法 2. 相关面试题 1.抽象类必须要有抽象方法吗? 2.普通类和抽象类有哪些区别? 3.抽象类能使用 final 修饰吗? 3. 接口 3.1 接口中的常量 3.2 接口中的方法 3.2.1 接口中的普通方法 3.2.2 接口中的静态方法 3.2.3 接口中的默认方法 3.3 接口中的接口和枚举类 3.4 接口和抽象类 总结 1. 抽象类和抽象方法 抽象方法和抽象类必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法.抽象方

  • Java基础巩固抽象类与接口详解

    目录 1.抽象类 1.1.什么是抽象类 1.2.抽象类的用法 1.3.抽象类特点(限制条件) 2.接口 2.1.什么是接口 2.2.接口的用法 2.3.如何使用接口 2.4.接口的特点(限制条件) 2.5.如何实现多个接口 2.6.接口于接口之间的继承关系 2.7.如何使用接口 抽象类与接口 1.抽象类 1.1.什么是抽象类 如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类 1.2.抽象类的用法 一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract

  • JavaSE的三大接口:Comparator,Comparable和Cloneable详解

    进阶JavaSE-三大接口:Comparator.Comparable和Cloneable. Comparable和Comparator这两个接口很相似,都是用于比较大小的接口.在我们写一些数据结构的算法题时,用的比较多,具体是怎么用的,我们接着往下看. Comparator接口: public interface Comparator<T> { public int compare(T o1, T o2); //比较方法 } Comparable接口: public interface Co

  • Java由浅入深通关抽象类与接口上

    目录 1.抽象类 1.1抽象类概念 1.2抽象方法 1.3抽象类的细节 2.接口 2.1接口概念 2.2接口的细节 1.抽象类 1.1抽象类概念 我们都知道对象是通过类来进行描述的,但是不是说所有的类都是用来描述对象的 一个类的类中没有足够的信息来描述一个具体的对象,这便是抽象类 抽象类的关键字:abstract 1.2抽象方法 首先还是看看之前写过的类: class Plant { String name; String source; String genus; public void tr

  • 详解JavaSE中抽象类与接口的定义及使用

    目录 一.抽象类 1.抽象类定义 2.抽象方法 二.接口 1.接口定义 2.类实现接口 3.接口与多态联合 4.extends和implements 5.接口在开发当中的作用 6.is has like 7.抽象类与接口 一.抽象类 1.抽象类定义 1.什么是抽象类? 类和类之间具有共同特征,将这些共同特征提取出来,形成的就是抽象类. 类到对象是实例化,对象到类是抽象. 抽象类无法实例化,无法创建对象.抽象类是类和类之间有共同特征,将这些具有共同特征的类再进一步抽象,就形成了抽象类.由于类本身是

  • 详解Java 中的 AutoCloseable 接口

    一.前言 最近用到了 JDK 7 中的新特性 try-with-resources 语法,感觉到代码相对简洁了很多,于是花了点时间详细学习了下,下面分享给大家我的学习成果. 二.简单了解并使用 try-with-resources语法比较容易使用,一般随便搜索看下示例代码就能用起来了.JDK 对这个语法的支持是为了更好的管理资源,准确说是资源的释放. 当一个资源类实现了该接口close方法,在使用try-with-resources语法创建的资源抛出异常后,JVM会自动调用close 方法进行资

  • 详解JAVA中的Collection接口和其主要实现的类

    Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同的元素而另一些不行.一些能排序而另一些不行.Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的"子接口"如List和Set,详细信息可见官方文档http://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/

  • 详解spring中的Aware接口功能

    目录 一,ApplicationContextAware 二.ApplicationEventPublisherAware 在spring中有很多以XXXAware命名的接口,很多人也不清楚这些接口都是做什么用的,这篇文章将描述常用的一些接口. 一,ApplicationContextAware 获取spring容器,用来访问容器中定义的其他bean.实现接口方法public void setApplicationContext(ApplicationContext applicationCon

  • 详解Java 中的函数式接口

    目录 @FunctionalInterface注解 最简单的函数式接口 基础数据类型的函数表达式 二元输入参数的函数 Two-Arity Function Specializations Suppliers 供给型接口 & Consumers 消费型接口 Predicates 断言型接口 Operators 总结 @FunctionalInterface注解 如果你想自己定义个新的函数式接口,强烈建议你加上*@FunctionalInterface* 注解.可以更好地揭示我们定义这个接口的意思,

  • 详解C++中常量的类型与定义

    常量是固定值,在程序执行期间不会改变.这些固定的值,又叫做字面量. 常量可以是任何的基本数据类型,可分为整型数字.浮点数字.字符.字符串和布尔值. 常量就像是常规的变量,只不过常量的值在定义后不能进行修改. 整数常量 整数常量可以是十进制.八进制或十六进制的常量.前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制. 整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long).后缀可以是大写,也可以是小

  • 详解java中接口与抽象类的区别

    详解java中接口与抽象类的区别 1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系.但是,一个类却可以实现多个interface. 2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的. 3.abstract c

  • 详解Java中AbstractMap抽象类

    jdk1.8.0_144 下载地址:http://www.jb51.net/softs/551512.html AbstractMap抽象类实现了一些简单且通用的方法,本身并不难.但在这个抽象类中有两个方法非常值得关注,keySet和values方法源码的实现可以说是教科书式的典范. 抽象类通常作为一种骨架实现,为各自子类实现公共的方法.上一篇我们讲解了Map接口,此篇对AbstractMap抽象类进行剖析研究. Java中Map类型的数据结构有相当多,AbstractMap作为它们的骨架实现实

  • 详解Swift中对C语言接口缓存的使用以及数组与字符串转为指针类型的方法

    详解Swift中对C语言接口缓存的使用以及数组与字符串转为指针类型的方法 由于Swift编程语言属于上层编程语言,而Swift中由于为了低层的高性能计算接口,所以往往需要C语言中的指针类型,由此,在Swift编程语言刚诞生的时候就有了UnsafePointer与UnsafeMutablePointer类型,分别对应为const Type*类型与Type *类型. 而在Swift编程语言中,由于一般数组(Array)对象都无法直接用于C语言中含有指针类型的函数参数(比如:void*),所以往往需要

  • 详解Java中Comparable和Comparator接口的区别

    详解Java中Comparable和Comparator接口的区别 本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧. Comparable 简介 Comparable 是排序接口. 若一个类实现了Comparable接口,就意味着"该类支持排序".  即然实现Comparable接口的类支持排序,假设现在存在"实现Comparable接口的类的对象的List列表(

随机推荐