abstract修饰符可以修饰类和方法。

(1)abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型(见后面实例),也就是编译时类型。抽象类就相当于一类的半成品,需要子类继承并覆盖其中的抽象方法。

(2)abstract修饰方法,会使这个方法变成抽象方法,也就是只有声明而没有实现,需要子类继承实现。

(3)注意的地方:

A:有抽象方法的类一定是抽象类。但是抽象类中不一定都是抽象方法,也可以全是具体方法。abstract修饰符在修饰类时必须放在类名前。abstract修饰方法就是要求其子类(实现)这个方法,调用时就可以以多态方式调用子类覆盖(实现)后的方法,除非子类本身也是抽象类。

B:父类是抽象类,其中有抽象方法,那么子类继承父类,并把父类中的所有抽象方法都实现(覆盖)了,子类才有创建对象的实例的能力,否则子类也必须是抽象类。简单的例子下面有一个抽象类

  1. abstract class E{
  2. public abstract void show();
  3. }
  4.  
  5. class F extends E{
  6. public void show(){
  7. System.out.print("test all FFFF \n");
  8. }
  9. }
  10.  
  11. class G extends E{
  12. public void show(){
  13. System.out.print("test all GGGG \n");
  14. }
  15. }
  16. public class main
  17. {
  18. public static void main(String[] args)throws InterruptedException {
  19. E p = new F();
  20. p.show();
  21. E q = new G();
  22. q.show();
  23. }
  24. }

就会发生多态现象。执行结果就是在console输出

test all FFFF 
test all GGGG

=============================================================================================================================

extends是继承父类,只要那个类不是声明为final就能继承。JAVA中不支持多重继承,但是可以用接口来实现,这样就要用到implements。继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了,比如 class A extends B implements C,D,E。
       与extends的差别:extends 是继承某个类,继承之后可以使用父类的方法也可以重写父类的方法;implements 是实现多个接口,接口的方法必须重写才能使用。要注意以下几点:

A,接口中一般定义的是常量和抽象方法。抽象类中可以包含抽象方法,也可以有非抽象方法,但是有抽象方法的类一定是抽象类。抽象方法不能有方法体。

B,接口(interface)中,方法只能定义抽象方法而且默认是Public,常量则是public static final 修饰的(不管有没有这些修饰符,方法和常量默认具这种属性)。

C,一个类可以实现多个无关的接口(这点和继承要有所区别)。

D,接口可以继承其他的接口,并添加新的属性和抽象方法。

E,在类中实现接口的方法时必须加上public修饰符。

示例:

  1. interface W1{ //定义接口
  2. public final static int i = 3;
  3. void start();
  4. void run();
  5. void stop();
  6. }
  7.  
  8. interface W2 extends W1{ //接口间可以继承,并添加新的属性方法
  9. public final static int j = 4; //常量的修饰
  10. void openMonth();
  11. void upAndDown();
  12. void goIn();
  13. }
  14.  
  15. class TT implements W2{
  16. public void start(){ //实现接口的同时会继承接口的变量,实现接口的方法加上public
  17. System.out.println("----start()----");
  18. }
  19. public void run(){
  20. System.out.println("----run()----");
  21. }
  22. public void stop(){
  23. System.out.println("----stop()----");
  24. }
  25. public void openMonth(){
  26. System.out.println("----openMonth()----");
  27. }
  28. public void upAndDown(){
  29. System.out.println("----upAndDown()----");
  30. }
  31. public void goIn(){
  32. System.out.println("----goIn()----");
  33. }
  34. }
  35.  
  36. public class main {
  37. public static void main(String[] args) {
  38. // TODO Auto-generated method stub
  39. W1 tt = new TT(); //实现对象指向接口引用的父类
  40. System.out.println(TT.i); //类名.静态变量
  41. System.out.println(tt.i); //实例.静态变量
  42. System.out.println(W1.i); //接口名.静态变量
  43. tt.start();
  44.  
  45. W2 ee = new TT();
  46. System.out.println(TT.j); //类名.静态变量
  47. System.out.println(ee.j); //实例.静态变量
  48. System.out.println(W2.j); //接口名.静态变量
  49. ee.start();
  50. }
  51. }

执行结果:

3
3
3
----start()----
4
4
4
----start()----

得到这个结果,需要注意的几点:(1)静态变量(相当于常量)可以用类名.静态变量名直接使用,接口又是类的一种,所以接口名.静态变量名可用;(2)接口引用.静态变量是多态的体现。

==========================================================================================================================

这里需要谈到抽象类和Interface的差别,abstract class和interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力,两者的区别如下:

(1)相同点
A,两者都是抽象类,都不能实例化。
B,interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法。

(2)不同点
A,interface实现,要用implements,而abstract class的实现,要用extends。
B,一个类可以实现多个interface,但一个类只能继承一个abstract class。
C,interface强调特定功能的实现,而abstract class强调所属关系。
D,尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的(declaration, 没有方法体),必须要实现。而abstract class的子类可以有选择地实现。
       抽象类的这个选择有两点含义:一是Abastract class中并非所有的方法都是抽象的,只有那些冠有abstract的方法才是抽象的,子类必须实现。那些没有abstract的方法,在Abstrct class中必须定义方法体。二是abstract class的子类在继承它时,对非抽象方法既可以直接继承,也可以覆盖;而对抽象方法,可以选择实现,也可以通过再次声明其方法为抽象的方式,无需实现,留给其子类来实现,但此类必须也声明为抽象类。既是抽象类,当然也不能实例化。

E,interface是完全抽象的,只能声明方法,而且只能声明pulic的方法,不能声明private及protected的方法,不能定义方法体,也不能声明实例变量。

JAVA的abstract修饰符 && 接口interface用法 && 抽象类和interface的差别的更多相关文章

  1. java 非访问修饰符 final 的用法

    final 修饰符,用来修饰类.方法和变量 final修饰的类不能被继承 举例,String类是final类,不可以被继承: final修饰的方法不能被重写 只是不能重写,也就是不能被子类修改,但是可 ...

  2. Java基础语法:abstract修饰符

    一.简介 描述: 'abstract'修饰符可以用来修饰方法,也可以修饰类. 如果修饰方法,那么该方法就是抽象方法:如果修饰类,那么该类就是抽象类. 抽象类和抽象方法起到一个框架作用,方便后期扩展的重 ...

  3. Java中的 修饰符

    java中的修饰符分为类修饰符,字段修饰符,方法修饰符. 根据功能的不同,主要分为以下几种. 1.权限访问修饰符  访问权限的控制常被称为具体实现的隐藏 把数据和方法包进类中,以及具体实现的隐藏,常共 ...

  4. java标识符、修饰符和关键字

    一.标识符 1.概念:标识符好比人和物的姓名,java中标识符就是类.对象.方法.变量.接口和自定义数据类型等等的名字. 2.规则: (1)首位不能是数字. (2)标识符对大小写敏感. (3)不可以是 ...

  5. Java中各种修饰符与访问修饰符

    Java中各种修饰符与访问修饰符 类: 访问修饰符 修饰符 class 类名称 extends 父类名称 implement 接口名称 (访问修饰符与修饰符的位置可以互换) 访问修饰符 名称 说明 备 ...

  6. java 、abstract修饰的【抽象类】【比如几何图形类】

    现实中问题引入 现实中一类具有共同特征的类,但是无法具体实现.,比如我们定义了一个几何类,叫做Shape,我们有一个方法要计算周长,直接在每个子类实现虽然可以,但是无法通过Shape定义的实例来访问到 ...

  7. abstract修饰符

    abstract(C# 参考) abstract 修饰符指示所修饰的内容缺少实现或未完全实现. abstract 修饰符可用于类.方法.属性.索引器和事件. 在类声明中使用 abstract 修饰符以 ...

  8. Java基础-访问修饰符

    访问修饰符 default (即缺省,什么也不写): 在同一包内可见,不使用任何修饰符.使用对象:类.接口.变量.方法. private : 在同一类内可见.使用对象:变量.方法. 注意:不能修饰类( ...

  9. JAVA基础_修饰符

    引言:Java的修饰符根据修饰的对象不同,分为类修饰符.方法修饰符.变量修饰符,其中每种修饰符又分为访问控制修饰符和非访问控制修饰符.访问控制存在的原因:a.让客户端程序员无法触及他们不应该触及的部分 ...

随机推荐

  1. jq toggle1.9版本后不支持解决方案

    <script type="text/javascript"> $(document).ready(function(){ $("button"). ...

  2. 快速构建Windows 8风格应用10-设备方向

    原文:快速构建Windows 8风格应用10-设备方向 本篇博文主要介绍常用支持Windows 8操作系统设备的方向.如何获取当前设备方向.DisplayProperties类. 常用支持Window ...

  3. Android高效的应用程序开发工具集1---ant构建一个简单的Android工程

    在java编译那些事通过提到ant编译Java工程,如今扩大到用它来构建Android目,事实上道理是相通的.变化的仅仅是使用的形式.ant构建相比IDE的优点是多个子项目使用自己定义jar包时,an ...

  4. 转载:每个C++开发者都应该使用的十个C++11特性

    这篇文章讨论了一系列所有开发者都应该学习和使用的C++11特性,在新的C++标准中,语言和标准库都加入了很多新属性,这篇文章只会介绍一些皮毛,然而,我相信有一些特征用法应该会成为C++开发者的日常用法 ...

  5. Python 3语法小记(九) 异常 Exception

    常见异常: Exception                        所有异常的基类 AttributeError                 特性应用或赋值失败时引发 IOError  ...

  6. HDU 4945 2048(DP)

    HDU 4945 2048 题目链接 题意:给定一个序列,求有多少个子序列能合成2048 思路:把2,4,8..2048这些数字拿出来考虑就能够了,其它数字不管怎样都不能參与组成.那么在这些数字基础上 ...

  7. android gps开发必备资料(含测试demo下载)

    入门资料参考: How accurate is Android GPS? Part 1: Understanding Location Data How accurate is Android GPS ...

  8. mysql 备份数据

    想在mysql库中某些数据备份下来. 1,创建一个新表,我们应需要保持表的原有属性 CREATE TABLE A LIKE B 这种方式可以把主键和索引一起copy过来. 2,把需要数据copy到新表 ...

  9. mvc项目如何在IIS7.5

    mvc项目如何在IIS7.5上发布的 1.在vs中打开你要发布的项目,右键属性找到发布 2.弹出发布web对话框,选择<新建配置文件...> 在弹出的对话框中输入一个配置文件名称,后确定 ...

  10. STL非变易算法 - STL算法

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/1394600460.html 原创:ST ...