zoukankan      html  css  js  c++  java
  • 抽象类与接口区别与使用

    • 抽象类、抽象方法简介
    • 抽象类与接口
    • 接口回调技术
    • 理解接口:(为什么要用接口)
    • 什么时候要用接口,什么时候使用抽象类?

    用abstract修饰的类,即抽象类;用abstract修饰的方法,即抽象方法。

    抽象方法在面向对象编程语言中抽象方法指一些只有方法声明,而没有具体方法体的方法抽象方法一般存在于抽象类或接口中。

    抽象类由一个或多个抽象方法的类叫做抽象类,抽象类暂时不能实例化(特殊手段除外!:匿名类)

     

    例子:

    package com.my.animal;
    
    //动物类
    public class Animal {
        String name;//名字
        String color;//颜色
    
        public Animal(String name,String color){
            this.name = name;
            this.color = color;
        }
        public void run(){
            System.out.println(name+"四条腿跑的很快!!!");
        }
    }
    //狗类继承动物类
    class Dog extends Animal{
        public Dog(String name,String color){
            super(name,color);
        }
    }
    //鱼类继承动物类
    class Fish extends Animal{
    
        public Fish(String name, String color) {
            super(name, color);
        }
    }
    
    class Test{
        public static void main(String[] args) {
            Dog dog = new Dog("哈巴狗","白色");
            dog.run();
    
            Fish fish = new Fish("锦鲤","红色");
            fish.run();
        }
    }

    实现结果:

    运行结果:
     
    哈巴狗四条腿跑的很快!!!
    锦鲤四条腿跑的很快!!!
    

    现在发现了问题,锦鲤怎么可以跑呢?因为他放在了父类的方法中。现在由俩种解决方案:1.父类不用写run方法,子类自己写 2.父类中定义抽象方法,强制子类重写run方法

     

    现在改写抽象代码:

    package com.my.animal;
    //动物类(抽象类)
    public abstract class Animal {
        String name;//名字
        String color;//颜色
           //构造方法
        public Animal(String name,String color){
            this.name = name;
            this.color = color;
        }
            //非抽象方法
        public void eat(){
             System.out.println(name+"吃东西!!!");
    }
        //抽象方法
        public abstract void run();
    }
    
    class Dog extends Animal{
        public Dog(String name,String color){
            super(name,color);
        }
    
        @Override
        public void run() {
            System.out.println(name+"四条腿跑得快!!");
        }
    }
    
    class Fish extends Animal{
    
        public Fish(String name, String color) {
            super(name, color);
        }
    
        @Override
        public void run() {
            System.out.println(name+"摇摇尾巴游啊游!!");
        }
    }
    
    class Test{
        public static void main(String[] args) {
            Dog dog = new Dog("哈巴狗","白色");
            dog.run();
    
            Fish fish = new Fish("锦鲤","红色");
            fish.run();
        }
    }

    执行结果:

    运行结果:
     
    哈巴狗四条腿跑得快!!
    锦鲤摇摇尾巴游啊游!!
    

    抽象类与接口:

    1.抽象类是在接口和实体类之间的一个桥梁
    例如: 
    做一个接口叫做飞行FlyAnimalAction,里面定义一个方法叫做flying,再定义一个方法叫做eat
    做一个类叫做蚊子实现接口,蚊子要实现flying方法,实现自己的eat方法
    做一个类叫做苍蝇实现接口,苍蝇也要实现flying方法,实现自己的eat方法
    你发现所有会飞的动物都要实现这个接口,很麻烦,不如
    做一个抽象类FlyAnimal,然后实现上面的接口
    在里面实现flying这个方法,因为大部分的飞行动作是一样的,而eat方法则继续写成抽象方法,因为大部分的动物吃东西是不一样的
    下面你再写蚊子类就简单了,可以直接继承这个抽象类,然后实现自己的吃方法就行了
    而且苍蝇类的制作也是一样,这个时候抽象类的功能就显示出来了,当然抽象类的功能远远不是这些,只是初期理解到这里就够了。

    2.接口是用来建立类与类之间的协议,它所提供的只是一种形式,而没有具体的实现。同时实现该接口的实现类必须要实现该接口的所有方法,通过使用implements关键字。

    接口是抽象类的延伸,java为了保证数据安全是不能多重继承的,也就是说继承只能存在一个父类,但是接口不同,一个类可以同时实现多个接口,不管这些接口之间有没有关系,所以接口弥补了抽象类不能多重继承的缺陷。

     

    接口体只存在抽象的方法。只存在常量,不存在变量,由于接口是抽象方法,所以实现接口要重写接口的方法。

    接口回调技术:和类一样,接口也是java中的重要数据类型,用接口申明的变量属于接口变量,接口属于引用形变量,接口变量中可以存放实现改接口类的引用,即存放对象的引用。

    1 //假如Com是一个接口,就可以用Com声明一个变量
    2 Com com;
    3 //加入ImpleCom是实现Com接口的类
    4 ImpleCom object=new ImplecCom();
    5 //回调就是把实现某一接口的类创建的引用赋值给改接口声明的变量,那么该接口就可以实现被类实现的接口方法
    6 com=object;

    举一个栗子:

     1 interface ShowMessage{
     2     void 显示商标(String s);
     3 }
     4 class TV implements ShowMessage{
     5     public void 显示商标(String s){
     6         System.out.println(s);
     7     }
     8 }
     9 class PC implements ShowMessage{
    10     public void 显示商标(String s){
    11         System.out.println(s);
    12     }
    13 }
    14 
    15 public class Example {
    16     public static void main(String[] args){
    17         ShowMessage sm;//声明接口变量
    18         sm=new TV();//接口变量中存放对象的引用
    19         sm.显示商标("长城牌电视机");
    20         sm=new PC();
    21         sm.显示商标("联想奔月5008pc机");//接口回调
    22     }
    23 }

    理解接口:(为什么要用接口)

    1.接口可以抽象出重要的行为标准,该行为标准用抽象方法来表示。

    2.可以把实现接口的类的对象的引用赋值给接口变量,该接口变量可以调用被该类实现的接口方法,即体现该类根据接口里的行为标准给出具体的行为。

    假如轿车、卡车、拖拉机、摩托车都是机动车的子类,其中机动车是一个抽象类,机动车中由“刹车”,“转向”等方法合理,即要求及电动车必须实现刹车、转向的方法。但是如果机动车包含俩个抽象类方法“收取费用”、“调节温度”,那么所有子类都要重写这俩个方法,即给出方法体,产生各自的收费标准。这显然不符合人们的认知标准。所以使用接口,需要收取费用、调节温度的车辆自己继承接口。

    什么时候要用接口,什么时候使用抽象类?

      在程序设计的时候,应当根据具体的分析来确定使用抽象类还是接口,abstract类除了提供重要的需要子类重写的abstract方法外,也提供了子类可以继承的变量和非abstract方法。如果某个问题需要继承才能更好地解决问题,例如子类除了需要重写父类的abstract方法外,还要从父类继承一些变量或一些非abstract方法,就可以考虑abstract类。如果某个问题不需要继承,只是需要若干个类给出某些重要的abstract方法实现细节,就可以考虑接口。

  • 相关阅读:
    代码控制数据流量开关
    用wifi来调试应用程序
    详细解读LruCache类
    修改博客园默认的代码字体大小
    通过Gson解析Json数据
    Docker、Kubernetes的 CICD实现思路
    React中路由传参及接收参数的方式
    微信小程序开发工具调试没问题,真机调试Provisional headers are shown
    物联网卡三码
    【微信开发】-- 企业转账到用户
  • 原文地址:https://www.cnblogs.com/handsometaoa/p/11755602.html
Copyright © 2011-2022 走看看