Java查漏补缺系列——abstract class和interface区别
来源:互联网 发布:mac外接显示器不清楚 编辑:程序博客网 时间:2024/05/21 09:18
abstract class
声明方法的存在而不去实现它的类被叫做抽象类,使用abstract 声明类,它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。
不能创建抽象类的实例(不能使用new创建对象)。然而抽象类可以定义变量,引用具体子类的实例(对象)。
不能有抽象构造函数或抽象静态方法。
抽象类只能被继承,在具体子类中必须实现全部抽象方法。
案例:
package day03;public class abstracClassDemo { public static void main(String[] args){ //Shape s = new Shape();//抽象类不能直接实例化(不能使用new创建对象) Shape s = new Circle(3,4,5); s.down(); System.out.println(s.contains(3, 4)); }}abstract class Shape{//抽象的图形,使用abstract 声明类 int x; int y; public abstract boolean contains(int x,int y);//抽象类可以保护抽象方法,使用abstract声明的方法,抽象方法不能有方法体 public void down(){//可以包含非抽象类方法 y++; }}abstract class square{ public square(){//抽象类中可以有构造函数 } public abstract boolean around();}//实现抽象类用extends,抽象类只能被继承,在具体子类中必须实现全部抽象方法class Circle extends Shape /*extends square*/{//一个类只能继承一个抽象类。 int r; public Circle(int x,int y,int r){ this.x = x; this.y = y; this.r = r; } public boolean contains(int x, int y) { int a = this.x - x; int b = this.y - y; return Math.sqrt(a*a+b*b)<=r; }}
interface
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
案例一:
package day03;public class interfaceDemo01 { public static void main(String[] args){ Runner tt=new TT();//接口的引用指向实现的对象 System.out.println(tt.i); System.out.println(Runner.i); tt.start(); Eater ee=new TT(); System.out.println(ee.j); System.out.println(Eater.j); ee.start(); Drinker dd=new TT(); dd.getWater(); dd.drinkWater(); }}//定义接口interface Runner{ //int i;//必须初始化 int i=3; //i = i+1;//接口中定义的变量只能是public static final类型,并且默认即为public static final类型,不可以再改变。 public void start(); void run(); void stop(); /*接口中不能含有非抽象类 public void down(){//可以包含非抽象类方法 y++; } */ /*接口中不能有构造函数 public Runner(){ } */}//接口间可以继承interface Eater extends Runner{ public static int j=4; //private int i= 1;//接口中不能含有私有变量 void openMouth(); void upAndDown(); void goIn();}interface Drinker{ void getWater(); void drinkWater();}//引用接口用implementsclass TT implements Eater,Drinker{//一个类可以实现多个接口 public void start(){ System.out.println("---------start()-------"); } public void run(){ System.out.println("---------run()-------"); } public void stop(){ System.out.println("---------stop()-------"); } public void openMouth(){ System.out.println("---------openMouth()-------"); } public void upAndDown(){ System.out.println("---------upAndDown()-------"); } public void goIn(){ System.out.println("---------goIn()-------"); } public void getWater() { System.out.println("---------getWater()-------"); } public void drinkWater() { System.out.println("---------drinkWater()-------"); }}
案例二:
package day03;public class interfaceDemo02 { public static void main(String[] args){ CareAnimalable c = new Worker(); //Worker w = (Worker)c; interfaceDemo02 t = new interfaceDemo02(); t.t(c); //多态 c = new Farmer(); t.t(c); } public void t(CareAnimalable c){//尽量定义为接口或父类的引用 c.feed(); c.play(); }}//定义一个接口interface CareAnimalable{ public void feed(); public void play();}class Worker implements CareAnimalable{ public void feed(){ System.out.println("-----feed()----"); } public void play(){ System.out.println("-----play()----"); }}class Farmer implements CareAnimalable{ public void feed(){ System.out.println("-----Farmer feed()----"); } public void play(){ System.out.println("-----Farmer play()----"); }}
区别
下面比较一下两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
3.抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
4.抽象类中可以包含静态方法,接口中不能包含静态方法
5.抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
6.一个类可以实现多个接口,但只能继承一个抽象类。
7.尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的 (declaration, 没有方法体),实现类必须要实现。而abstract class的子类可以有选择地实现。
这个选择有两点含义:
一,是abastract class中并非所有的方法都是抽象的,只有那些冠有abstract的方法才是抽象的,子类必须实现。那些没有abstract的方法,在Abstrct class中必须定义方法体。
二,是abstract class的子类在继承它时,对非抽象方法既可以直接继承,也可以覆盖;而对抽象方法,可以选择实现,也可以通过再次声明其方法为抽象的方式,无需实现,留给其子类来实现,但此类必须也声明为抽象类。既是抽象类,当然也不能实例化。
8.abstract class是interface与Class的中介。
interface是完全抽象的,只能声明方法,而且只能声明pulic的方法,不能声明private及protected的方法,不能定义方法体,也 不能声明实例变量。然而,interface却可以声明常量变量,并且在JDK中不难找出这种例子。但将常量变量放在interface中违背了其作为接 口的作用而存在的宗旨,也混淆了interface与类的不同价值。如果的确需要,可以将其放在相应的abstract class或Class中。
abstract class在interface及Class中起到了承上启下的作用。一方面,abstract class是抽象的,可以声明抽象方法,以规范子类必须实现的功能;另一方面,它又可以定义缺省的方法体,供子类直接使用或覆盖。另外,它还可以定义自己 的实例变量,以供子类通过继承来使用。
- Java查漏补缺系列——abstract class和interface区别
- Java abstract class和interface区别
- Java Abstract class 和 interface的区别
- Java - interface和abstract class区别
- Java abstract class 和 interface 区别
- JAVA abstract class和interface 区别
- [java] abstract class 和interface 的区别
- Java - Abstract class 和 Interface区别
- 面试系列之——abstract class和interface的区别
- 面试系列之——abstract class和interface的区别
- 面试系列之——abstract class和interface的区别
- 面试系列之——abstract class和interface的区别
- 面试系列之——abstract class和interface的区别
- Interface 和 abstract class 区别
- Abstract class 和 Interface 区别
- abstract class和interface区别
- abstract class 和interface区别
- abstract class 和 interface 区别
- Html5游戏的市场年谁能留住用户的心
- 3-ways-to-define-a-javascript-class/
- poj 1251 Jungle Roads(最小生成树)
- IO流之字节流
- C++中的基类与派生类
- Java查漏补缺系列——abstract class和interface区别
- Power Designer 连接SqlServer 数据库 导出表结构
- IO之File类
- Java 基础之线程池的必要性
- springmvc如何访问到静态的文件,如jpg,js,css
- bloom filter原理
- 安装java memcached client到maven repository
- 不用临时变量,交换两个数。
- 课程实验1 基于java Socket的C/S小程序