抽象类与接口区别与使用
- 抽象类、抽象方法简介
- 抽象类与接口
- 接口回调技术
- 理解接口:(为什么要用接口)
- 什么时候要用接口,什么时候使用抽象类?
用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方法实现细节,就可以考虑接口。
本文来自博客园,作者:帅气的涛啊,转载请注明原文链接:https://www.cnblogs.com/handsometaoa/p/11755602.html