前言
对于java中的抽象类,抽象方法,接口,实现接口等具体的概念就不在这里详细的说明了,网上书本都有很多解释,主要是我懒,下面通过一个例子来说明其中的精髓要点,能不能练成绝世武功,踏上封王之路,就看自己的的啦(不要误会,我指的只是我自己啦啦)
用接口实现一个简单的计算器
1、利用接口做参数,写个计算器,能完成+-*/运算
(1)定义一个接口Compute含有一个方法int computer(int n,int m);
(2)设计四个类分别实现此接口,完成+-*/运算
(3)设计一个类UseCompute,含有方法: public void useCom(Compute com, int one, int two)
此方法要求能够:
* 1.用传递过来的对象调用computer方法完成运算
* 2.输出运算的结果
(4)设计一个测试类,调用UseCompute中的方法useCom来完成+-*/运算
//父类.并且使用用接口 package cn.yjlblog.wwww; public interface Compute { int computer(int n,int m);//抽象方法,胜率abstract ,public }
//子类add 实现加法运算 package cn.yjlblog.wwww; public class add implements Compute{ @Override //接口的实现类和抽象类的子类是一样的,要想可以使用new 一个对象,就必须对“抽象类”里的方法 //进行重写 public int computer(int n, int m) { // TODO Auto-generated method stub return n+m; } }
package cn.yjlblog.wwww; //子类subtract 实现减法运算 public class subtract implements Compute{ @Override public int computer(int n, int m) { // TODO Auto-generated method stub return n-m; } }
子类multiplied 实现乘法运算 package cn.yjlblog.wwww; public class multiplied implements Compute{ @Override public int computer(int n, int m) { // TODO Auto-generated method stub return n*m; } }
package cn.yjlblog.wwww; //子类divided 实现整除运算 public class divided implements Compute{ @Override public int computer(int n, int m) { // TODO Auto-generated method stub return n/m; } }
//应用类UseComepute 用来 package cn.yjlblog.wwww; public class UseComepute { public void useCom(Compute com,int one,int two){ int x = com.computer(one, two); System.out.println("运算结果为:"+x); } }
//测试类Test package cn.yjlblog.wwww; public class Test { public static void main(String[] args) { UseComepute uc = new UseComepute();//应用类生成对象,使用useCome 方法 int one = 10; int two = 20; Compute ad = new add();//接口的多态 Compute sub = new subtract(); Compute mul= new multiplied(); Compute div = new divided(); uc.useCom(ad, one, two); uc.useCom(sub, one, two); uc.useCom(mul, one, two); uc.useCom(div, one, two); //哈哈,类的名字忘记大写了 } }
为什么需要用到抽象类?
在下面这个例子中,把打印机类封装成抽象类,把print定义成抽象类,当HPPrinter和CannonPrinter要继承printer类的时候,必须重写print函数。这样写的好处是,每个打印机都有自己打印方式,此举可以防止子类没有写明打印方式。
public abstract void Printer() { public void open() { system.out.print("打印机开启"); } public void close() { system.out.print("打印机关闭"); } abstract void print(); //把print方法定义为抽象方法 } public HPPrinter extends Printer { void print(){ //必须重写抽象方法print() system.out.print("惠普打印机开始打印"); }; } public CanonPrinter extends Printer { void print(){ //必须重写抽象方法print() system.out.print("佳能打印机开始打印"); }; }
抽象类和接口区别
(一)语法层次
public abstract class People { //关键词abstract,声明该类为抽象类 void Num(); abstract void Name(); //声明该方法为抽象方法 } Interface Person { void Num(); void Name(); }
抽象类方式中,抽象类可以拥有任意范围的成员数据,同时也可以拥有自己的非抽象方法,
但是接口方式中,它仅能够有静态、不能修改的成员数据(但是我们一般是不会在接口中使用成员数据),同时它所有的方法都必须是抽象的。
在某种程度上来说,接口是抽象类的特殊化。
对子类而言,它只能继承一个抽象类(这是java为了数据安全而考虑的),但是却可以实现多个接口。
(二)设计层次
1、 抽象层次不同
抽象类是对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。
2、 跨域不同
抽象类所跨域的是具有相似特点的类,而接口却可以跨域不同的类。我们知道抽象类是从子类中发现公共部分,然后泛化成抽象类,子类继承该父类即可,但是接口不同。实现它的子类可以不存在任何关系,共同之处。例如猫、狗可以抽象成一个动物类抽象类,具备叫的方法。鸟、飞机可以实现飞Fly接口,具备飞的行为,这里我们总不能将鸟、飞机共用一个父类吧!所以说抽象类所体现的是一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is-a" 关系,即父类和派生类在概念本质上应该是相同的。对于接口则不然,并不要求接口的实现者和接口定义在概念本质上是一致的, 仅仅是实现了接口定义的契约而已。
3、 设计层次不同
对于抽象类而言,它是自下而上来设计的,我们要先知道子类才能抽象出父类,而接口则不同,它根本就不需要知道子类的存在,只需要定义一个规则即可,至于什么子类、什么时候怎么实现它一概不知。比如我们只有一个猫类在这里,如果你这是就抽象成一个动物类,是不是设计有点儿过度?我们起码要有两个动物类,猫、狗在这里,我们在抽象他们的共同点形成动物抽象类吧!所以说抽象类往往都是通过重构而来的!但是接口就不同,比如说飞,我们根本就不知道会有什么东西来实现这个飞接口,怎么实现也不得而知,我们要做的就是事前定义好飞的行为接口。所以说抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整