论Java中的抽象类与接口

抽象类和抽象方法 定义

抽象方法和抽象类都必须被abstract关键字修饰。

抽象——abstract,抽象类的方法不一定是抽象的,但抽象方法出现的类一定是抽象类。

//抽象方法,没有方法体(即没有{}),只有声明 abstract void f();

最重要的是:抽象类,抽象既不是真的,所以,抽象类不可以实例化。但可以通过子类的实例化来使用

/** * @author yhy * 用来完成9.2的练习 * 验证抽象类与抽象方法的使用 */ public class YanZheng { public static void main(String[] args) { // 不能被实例化,抽象类,会报错 // ChouXiang chouxi = new ChouXiang() ; // 可以实例child类 // 即通过继承其子类来实现不能继承抽象类 Child test = new Child(); } } abstract class AbstractChouXiang{ /** * 构造函数 */ AbstractChouXiang() { } /** * 定义一个抽象类的抽象方法 */ abstract void chouxiang(); } class Child extends AbstractChouXiang{ Child(){ System.out.println("实例时候就打印出来"); } /** * 注意这里不是abstract就不要讲方法定义为abstract */ @Override void chouxiang(){ System.out.println("继承抽象类"); } }

子类可以不是抽象类,但要实现抽象父类中的所有抽象方法,否则必须定义为abstract类型。(下面的代码中,我将其子类的重写方法注释掉之后,就会报错must be declared abstract or implentment abstract method)

论Java中的抽象类与接口

与普通类的区别以及注意点: 抽象类的作用

《thinking in java》

抽象类是普通的类与接口之间的一种中庸之道。

抽象方法、抽象类可以使类的抽象性明确起来,告诉用户和译器怎么使用它们;

同时,抽象类是很好的重构工具,在后期的工作中,可以实现重用性。

体现一种模板的效果,从一群相似的子类提炼出一个抽象类的感觉一样,提供了一种规范,子类可以在其原来的基础上进行扩展。

抽象父类可以只定义需要使用的某些方法,把不能实现的部分抽象成抽象方法,就是一中留给下一代去实现,一开始没有能力去实现,那可就给厉害的人去做,留给其子类去实现。

接口 定义

特殊的“抽象类”——接口(interface):比抽象类更加抽象的是接口,在接口中所有的方法都是抽象的。就不能像上面的抽象类一样还可以有普通方法。

//省略public就变为默认级别,只能在当前包所访问 public interface Figure { //接口中静态成员变量 String name = "几何图形";//省略public static final // 绘制几何图形方法 void onDraw(); //省略public 这里是抽象方法 }

Java中可以implements多个接口,多继承的含义便是接入多个接口(继承只能单继承)

一个类可以实现一个或多个接口,继承使用extends关键字(但接口只能继承接口),实现则使用implements关键字。

示例

JieKou.java

import java.text.SimpleDateFormat; /** * @author yhy * 这个是实现接口定义的代码,在其它地方去调用 * 这里的接口不用public的话,其它的包就访问不了 */ public interface JieKou { // 定义了两个常量 /** * 这里定义一个df变量来获取当前时间 */ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 String AUTHOR = "yhycoder"; /** * 定义一个接口的方法 * 这里的public是多余的,在接口里面是自动为public */ /*public*/ void print(); }

使用接口的Java代码

//访问了其它包的接口,就是下面这个地址 import music.daima.ebook.JieKou; import java.util.Date; public class UseInterfaces { public static void main(String[] args) { //实例化using类,实现查看代码的运行情况 Using Shuchu = new Using(); Shuchu.print(); } } /** * 这里是接口继承接口 */ interface Jiekou2 extends JieKou{ String num = "接口2"; } /** * 这里是Using类实现了JieKou和Jiekou2接口,逗号隔开 */ class Using implements JieKou,Jiekou2 { /** * 重写了方法,调用接口定义的常量 */ @Override public void print() { System.out.println(AUTHOR+"在新的包里面使用接口的时间:"+df.format(new Date())+" 同时还有"+num); } } 注意

接口与抽象类一样都不能被实例化

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/245711fe6daa10248cc2618e286420d3.html