本文峨日朵雪峰之侧简单介绍抽象类,接口以及它们的异同点,另附简单的代码举例。
在 java 语言中使用 abstract class 来定义抽象类。抽象类是不能被实例化的,即不能用new关键字来实例化对象。包含抽象方法的一定是抽象类,但抽象类不一定包含抽象方法。如果一个子类实现了父类(抽象类)的所有抽象方法,那么该子类可以不必是抽象类,否则就是抽象类。抽象类中的抽象方法的修饰符只能为public或者protected。
为什么要在抽象类中定义抽象方法呢?下面我们来看一个代码实例:
package example; import java.util.date; public abstract class geometricobject {private string color="white";private boolean filled;private java.util.date datecreated;protected geometricobject() {datecreated=new java.util.date();}//构建默认的几何对象protected geometricobject(string color,boolean filled) {datecreated=new java.util.date();this.color=color;this.filled=filled;}public string getcolor() {return color;}//返回颜色public void tcolor(string color) {this.color=color;}//设置新的颜色public boolean getfilled() {return filled;}public void tfilled(boolean filled) {this.filled=filled;}public java.util.date getdatecreated(){return datecreated;}public abstract doub安全知识手抄报le getarea();//抽象方法定义得到面积public abstract double getperimeter();//抽象方法得到周长}
我们假设自定义的circle类和rectangle类均为geometricobject的子类,且均有求各自面积的getarea()方法和各自周长的getperimeter()方法,但这些方法并不能在父类中定义,因为具体的计算方法要取决于几何对象的具体类型。所以采取抽象方法进行定义,这样可以保证父类中的抽象方法可以在子类中被重写。
抽象类只有定义没有实现。
下面是抽象类值得注意的几点:
1.抽象方法不能包含在非抽象类中。如果抽象父类的子类不能实现所有的抽象方法,那么子类也必须定义为抽象的。也就是说,在继承自抽象类的非抽象子类中,必须实现所有的抽象方法。还要注意到,抽象方法是静态的。
2.抽象类不能使用new操作符来初始化。但仍然可以定义它的构造方法,这个构造方法在它的子类的构造方法中进行调用。
3.包含抽象方法的类必须是抽象的。但是是可以定义一个不包含抽象方法的抽象类,这个抽象类用于作为定义新子类的基类。
4.即使子类的父类是具体的,这个子类也可以是抽象的。
5.不能使用new操作符从一个抽象类创建一个实例,但是抽象类可以用做一种数据类型。
例如:geometricobject[] objects=new geometricobject[10];是正确的,。
6.子类可以重写父类的方法并将它定义为抽象的,这虽然不常见,但很适用于当父类的方法实现在子类中变得无效时的情况。
接口是一种与类很相似的结构,用于为对象定义共同操作,但它的目的是指明相关或者不相关类的对象的共同行为。
java中接口使用interface关键字修饰。接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法市场调查计划书。
类和接口之间的关系称为接口继承。
下面是简单的代码举例:
package example; public class testedible { public static void main(string[] args) {// todo auto-generated method stubobject[] objects= {new tiger(),new chicken(),new apple()};//创建由tiger,chicken和apple类型的三个对象构成的数组for(int i=0;i<objects.length;i++) {if(objects[i] instanceof edible)system.out.println(((edible)objects[i]).howtoeat());if(objects[i] instanceof animal) {system.out.println(((animal)objects[i]).sound());}}//如果可食用,则调用howtoeat方法,如果是动物,则调用sound方法} }abstract class animal{private double weight;public double getweight() {return weight;}public void tweight(double weight) {this.weight=weight;}public abstract string sound();//返回动物的声音,是抽象方法,被具体的animal类实现}class chicken extends animal implements edible{@overridepublic string howtoeat() {return "chicken: fry it";}//实现了edible接口。当一个类实现接口时,该类实现定义在接口中的所有方法。@overridepublic string sound() {return "chicken: cock-a-doodle-doo";}}class tiger extends animal{@overridepublic string sound() {return "tiger:rrooaarr";}}abstract class fruit implements edible{}//fruit类实现了edible,但没有实现howtoeat方法,所以它必须定义为abstract。class apple extends fruit{@overridepublic string howtoeat() {return "apple:make apple cider";}}//fruit的具体子类必须实现howtoeat方法,所以apple类实现了howtoeat方法。
需要注意的是,接口中所有的数据域都是public static final,而且所有方法都是public abstract,但java允许忽略这些修饰符。
即下面的两个代码是等价的:
public interface t {public static final int k=1;public abstract void p();}
public interface t {int k=1社区低保工作总结;void p();}
尽管public修饰符对于定义在接口中的方法可以省略,但是在子类实现中方法必须定义为public。
一个类可以实现多个接口,但是只能继承一个父类。
首先我们先来列举个表格简单讲述一下抽象类和接口之间的异同点:
比较点抽象类接口关键字abstract classinterface字段无限制变量必须是public static final方法既可以含普通方法,又可以含抽象方法,无限制只能含抽象方法,且必须是public的继承/实现只能被类或抽象类继承既可以被接口继承,也能被类或抽象类实现多重继承不支持可以继承多个父接口java只允许为类的继承做单一继承,但是允许使用接口做多重继承。例如:
public class newclass extends baclass implements interface1,...,interfacen{}
利用extends,接口可以继承其他接口,这样的接口被称为子接口。例如:下面的代码中,newinterface是interface1,…,interfacen的子接口。
public interface newinterface extends interface1,...,interfacen{}
一个实现newinterface的类必须实现在newinterface,interface1,…,interfacen中定义的抽象方法。接口可以继承其他接口但不能继承类。一个类可以继承它的父类同时实现多个接口。
所有的类都有一个共同的根类object,但是接口并没有共同的根。与类相似,接口同样也可以定义一种类型。一个接口类型的变量可以引用任何实现该接口的类的实例。如果一个类实现了一个接口,那么这个接口就类似于该类的一个父类。可以将接口当作一种数据类型使用,将接口类型的变量转换为它的子类,反过来同样可以。
通常情况下,使用接口的频率更高,因为接口比类更加灵活,不用使所有东西都属于同一个类型的类。
下面进行一个简单的代码举例:
abstract class animal{ public abstract string howtoeat();}//在animal中定义howtoeat方法//animal的两个子类定义如下class c公共英语考试hicken extends animal{@overridepublic string howtoeat() {return "chicken: fry it"; }}class duck extends animal{@overridepublic string howtoeat() {return "roast it"; }}public static void main(string[] args) { animal animal = new chicken(); eat(animal); animal animal = new duck(); eat(animal);}public static void eat(animal animal){ system.out.println(animal.howtoeat());}
假设给定这个继承结构,java在调用方法时可以根据对象动态地决定调用具体的howtoeat方法。但有一个限制条件,即该子类必须是另一种动物才可以。如果一种动物不可食用,那么此刻再继承animal类就并不合适了。
限制条件这个问题在接口中可以被解决,例如:
public class demo{public static void main(string[] args) { edible stuff = new chicken(); eat(stuff); edible stuff = new broccoli(); eat(stuff); }public static void eat(edible stuff){ system.out.println(stuff.howtoeat()); }}interface edible{ public string howtoeat();}class chicken implements edible{@overridepublic string howtoeat() {return "chicken: fry it";}}class broccoli implements edible{@overridepublic string howtoeat() {return "broccoli: stir-fty it";}}
定义表示可食用对象的一个类,只须让该类实现edible接口即可。任何edible对象都可以被传递以调用howtoeat方法。
到此这篇关于java中抽象类和接口的相同和不同点介绍的文章就介绍到这了,更多相关java中抽象类和接口内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 04:01:36,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/abce30c1a718f43f6379f0996739f38d.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:java中抽象类和接口的相同和不同点介绍.doc
本文 PDF 下载地址:java中抽象类和接口的相同和不同点介绍.pdf
留言与评论(共有 0 条评论) |