【值得一看】抽象类与接口区别与使用

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

用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方法实现细节,就可以考虑接口。

猜你喜欢

转载自www.cnblogs.com/handsometaoa/p/11755602.html