抽象类:声明一个抽象类,就是在类的声明开头、在Class关键字的前面使用关键字abstract

下面定义一个抽象类,代码如下:

abstract class  A{
abstract void callme();
void callmetoo(){
System.out.println("This is a concrete method.");
}
}
class B extends A{
void callme(){
System.out.println("B‘s implementation of callme.");
}
}
class AbstractDemo{
public static void main(String args[]){
B b = new B();
b.callme();
b.callmetoo();
}
}

分析抽象类的代码,得出抽象类的一些特性:

1、  定义一个抽象类,必须使用关键字abstract;

2、  抽象类不存在对象,也就是说,不能使用new运算符直接实例化抽象类;

3、  抽象类不能声明抽象的构造方法,也不能声明抽象的静态(static)方法;

4、  抽象类的所有子类,要么实现父类中的所有抽象方法,要么自己也声明为抽象类;

5、  抽象类中的方法,可以定义为抽象方法(用abstract关键字),也可以为普通方法;[注意以上第3点中的区别];

6、  抽象类只能继承(extends)使用,也就是说父类为抽象类时,它的直接子类只有一个,这也是继承的特性;

接口:声明一个接口,使用interface关键字,可以指定类必须执行哪些工作,但是只定义工作的模版(方法),不具体实现工作的内容。

下面定义一个接口,代码如下:

interface Callback{
public void callback(String param);
}
class InterfaceDemo implements Callback{ public void callback(String who){
System.out.println("callback called with "+who);
}
public static void main(String[] args)
{
InterfaceDemo ifd = new InterfaceDemo();
ifd.callback("me");
}
}

分析接口的代码,得出接口的一些特性:

1、  定义一个接口,必须使用关键字interface;

2、  接口不能直接实例化,并且它里面的方法是没有方法体的;[注意:实际上,它们是抽象方法,在接口中指定的所有方法都可以没有默认实现]

3、  实现接口的每个类,都必须实现接口中定义的所有方法;

4、  一旦定义了接口,任意数量的类都可以实现(implements)该接口,此外,一个类也可以实现任意数量的接口,使用逗号隔开;[注意:如果在类实现的两个接口中都声明了同一个方法,那么这两个方法的客户都将可以使用该方法]

5、  接口可以声明变量,它们被隐式地标识为final和static,这意味着实现接口的类不能修改它们,同时在接口必须初始化它们;

6、  在接口的实现类中,实现接口方法时,必须将方法声明为public;

7、  虽然接口不能直接实例化,但可以将变量声明为使用接口而不是类的对象引用;[代码如下:]

Callback c = new InterfaceDemo();
c.callback(“me”);
//注意:变量c被声明为接口类型Callback,此时,可以使用c访问callback()方法,但是c不能访问InterfaceDemo类中的其他任何成员,接口的引用变量只知道由接口声明的方法。

8、  如果一个类实现了一个接口,但没有实现该接口定义的全部方法,那么必须将该类声明为抽象类(abstrace);

9、  在声明嵌套接口的类或接口之外,嵌套接口的名称必须是完全限定的;[代码如下:]

class A{
//定义嵌套接口
public interface NestedIF{
boolean isNotNegative(int x);
}
}
class B implements A.NestedIF{
public boolean isNotNegative(int x){
return x<0?false:true;
}
}
class NestedIFDemo{
public static void main(String[] args)
{
A.NestedIF nif = new B();
if(nif.isNotNegative(10)){
System.out.println("10 is not nogative");
}
if(nif.isNotNegative(-10)){
System.out.println("this won't be displayed");
}
}
}
//注意:类A定义了成员接口NestedIF,并且声明为public,B类通过指定接口名称完全限定来实现嵌套接口:implements A.NestedIF

10、  接口可以通过关键字extends继承另一个接口,语法和继承类相同;

深入浅出:重温JAVA中接口与抽象的区别的更多相关文章

  1. java中接口和继承的区别

    实际概念区别:区别1:不同的修饰符修饰(interface),(extends)区别2:在面向对象编程中可以有多继承!但是只支持接口的多继承,不支持'继承'的多继承哦而继承在java中具有单根性,子类 ...

  2. Java中接口和抽象类的区别?

    抽象类 抽象类必须用 abstract 修饰,子类必须实现抽象类中的抽象方法,如果有未实现的,那么子类也必须用 abstract 修饰.抽象类默认的权限修饰符为 public,可以定义为 public ...

  3. java中接口与抽象类的区别

    接口和抽象类的共同特征如下: 接口和抽象类都不能被实例化,位于继承树的顶端,用于被其他类实现和继承. 接口和抽象类都可以包含抽象的方法,实现接口的类或者继承抽象类的类都必须实现这些抽象的方法. 区别: ...

  4. Java中接口和抽象类的区别

    经常看到这样的问题,就是问这两个的区别,我这也总结一下: 1,宏观上说,一个是类,一个是接口,类只支持单一继承,接口支持多个继承 2,微观上说,就是从内部来说 a,成员变量方面 接口可以包含方法,属性 ...

  5. 转载 - java中接口的向上转型。和多态性

    发现一篇对接口总结很精简的文章 1.在java中接口就是一个完全抽象的类,跟抽象类一样不能产生对象,但是可以作为对象的引用,可以由其实现类向上转型,它就跟超类一样, 向上转型了,可以很好的利用接口,可 ...

  6. Java中接口和抽象类的比較

    Java中接口和抽象类的比較-2013年5月写的读书笔记摘要 1. 概述 接口(Interface)和抽象类(abstract class)是 Java 语言中支持抽象类的两种机制,是Java程序设计 ...

  7. java 中接口的概念

    接口接口在java中是一个抽象的类型,是抽象方法的集合,接口通常使用interface来声明,一个类通过继承接口的方式从而继承接口的抽象方法.接口并不是类,编写接口的方式和类的很相似,但是他们属于不同 ...

  8. 浅谈Java中接口与抽象类的异同

    浅谈Java中接口与抽象类的异同 抽象类和接口这两个概念困扰了我许久,在我看来,接口与抽象类真的十分相似.期间也曾找过许许多多的资料,参考了各路大神的见解,也只能是简简单单地在语法上懂得两者的区别.硬 ...

  9. java中extends与implements的区别

    学了java很久了,久不用之后给同学解决一个java问题的时候,就卡在这个标题上了. 下面是java中extends与implements的区别: 1. 在类的声明中,通过关键字extends来创建一 ...

随机推荐

  1. POJ训练计划2777_Count Color(线段树/成段更新/区间染色)

    解题报告 题意: 对线段染色.询问线段区间的颜色种数. 思路: 本来直接在线段树上染色,lz标记颜色.每次查询的话訪问线段树,求出颜色种数.结果超时了,最坏的情况下,染色能够染到叶子节点. 换成存下区 ...

  2. Rhythmbox中文乱码解决的方法

    转自:http://hi.baidu.com/morgensonne/item/3470aef58747abde6325d2d9 今天在网络上找到了一个比較好的解决Rhythmbox中文乱码的问题的方 ...

  3. QOdbc 读写 excel

    ).toString(); ).toInt(); qDebug()<< name << age <<endl; } // 关闭数据库 db.close(); } i ...

  4. [LeetCode] 034. Search for a Range (Medium) (C++/Java)

    索引:[LeetCode] Leetcode 题解索引 (C++/Java/Python/Sql) Github: https://github.com/illuz/leetcode 035. Sea ...

  5. jquery使用load开展局部刷新没有效果

    jquery使用load开展局部刷新没有效果   jquery使用load进行局部刷新没有效果我的代码 <html><head><meta charset="u ...

  6. java学习——abstract 和 final

    当多个类中出现相同功能,但是功能主题不同,这时可以进行向上抽取.这时只抽取功能定义,而不抽取功能主体. 抽象:看不懂.1, 抽象方法一定定义在抽象类中.2, 抽象方法和抽象类都必须被abstract关 ...

  7. MongoDb笔记(一)

    1.Mongodb 数据库是动态生成的可以使用use 数据库名 来指定要使用的数据库,如果数据库不存在就自动生成一个 2.插入一个文档:db.foo.insert({"name": ...

  8. struts2 实现过程和xml配置

    实现过程: 当Web容器收到 请求(HttpServletRequest)它将请求传递给一个标准的的过滤链包括 (ActionContextCleanUp)过滤器,然后经过Other filters( ...

  9. UVA 221 - Urban Elevations(离散化)!!!!!!

    题意:给出一张俯视图.给出N个建筑物的左下标,长度,宽度,高度.现在求,从南面看,能看到那些建筑? Sample Input 14 160 0 30 60 30 125 0 32 28 60 95 0 ...

  10. 轻量jquery框架之--组件交互基础设计

    概要 组件交互基础,即考虑在JQUERY对象下($)下扩展所有组件都需要用到的通用api,如ajax入口.对表单的操作.html片段加载.通用的配合datagrid通用的curd客户端对象等. 扩展a ...