1. #抽象类
  2. 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
  3. 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
  4. 由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。
  5. 父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
  6. Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
  7.  
  8. /* 文件名 : Employee.java */
  9. public abstract class Employee
  10. {
  11. private String name;
  12. private String address;
  13. private int number;
  14. public Employee(String name, String address, int number)
  15. {
  16. System.out.println("Constructing an Employee");
  17. this.name = name;
  18. this.address = address;
  19. this.number = number;
  20. }
  21. public double computePay()
  22. {
  23. System.out.println("Inside Employee computePay");
  24. return 0.0;
  25. }
  26. public void mailCheck()
  27. {
  28. System.out.println("Mailing a check to " + this.name
  29. + " " + this.address);
  30. }
  31. public String toString()
  32. {
  33. return name + " " + address + " " + number;
  34. }
  35. public String getName()
  36. {
  37. return name;
  38. }
  39. public String getAddress()
  40. {
  41. return address;
  42. }
  43. public void setAddress(String newAddress)
  44. {
  45. address = newAddress;
  46. }
  47. public int getNumber()
  48. {
  49. return number;
  50. }
  51. }
  52.  
  53. /* 文件名 : Salary.java */
  54. public class Salary extends Employee
  55. {
  56. private double salary; //Annual salary
  57. public Salary(String name, String address, int number, double
  58. salary)
  59. {
  60. super(name, address, number);
  61. setSalary(salary);
  62. }
  63. public void mailCheck()
  64. {
  65. System.out.println("Within mailCheck of Salary class ");
  66. System.out.println("Mailing check to " + getName()
  67. + " with salary " + salary);
  68. }
  69. public double getSalary()
  70. {
  71. return salary;
  72. }
  73. public void setSalary(double newSalary)
  74. {
  75. if(newSalary >= 0.0)
  76. {
  77. salary = newSalary;
  78. }
  79. }
  80. public double computePay()
  81. {
  82. System.out.println("Computing salary pay for " + getName());
  83. return salary/;
  84. }
  85. }
  86.  
  87. /* 文件名 : AbstractDemo.java */
  88. public class AbstractDemo
  89. {
  90. public static void main(String [] args)
  91. {
  92. Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", , 3600.00);
  93. Employee e = new Salary("John Adams", "Boston, MA", , 2400.00);
  94.  
  95. System.out.println("Call mailCheck using Salary reference --");
  96. s.mailCheck();
  97.  
  98. System.out.println("\n Call mailCheck using Employee reference--");
  99. e.mailCheck();
  100. }
  101. }
  102.  
  103. 输出
  104. Constructing an Employee
  105. Constructing an Employee
  106. Call mailCheck using Salary reference --
  107. Within mailCheck of Salary class
  108. Mailing check to Mohd Mohtashim with salary 3600.0
  109.  
  110. Call mailCheck using Employee reference--
  111. Within mailCheck of Salary class
  112. Mailing check to John Adams with salary .
  113.  
  114. #抽象方法
  115. 如果你想设计这样一个类,该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。
  116. Abstract 关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。
  117. 抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。
  118.  
  119. public abstract class Employee
  120. {
  121. private String name;
  122. private String address;
  123. private int number;
  124.  
  125. public abstract double computePay();
  126.  
  127. //其余代码
  128. }
  129.  
  130. 抽象类才有抽象方法。
  131. 继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。
  132. 最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。
  133.  
  134. . 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
  135. . 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
  136. . 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
  137. . 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
  138. . 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
  139.  
  140. /* 文件名 : Employee.java */
  141. public abstract class Employee
  142. {
  143. private String name;
  144. private String address;
  145. private int number;
  146.  
  147. public abstract double computePay();
  148. //其余代码
  149. }
  150.  
  151. /* 文件名 : Salary.java */
  152. public class Salary extends Employee
  153. {
  154. private double salary; // Annual salary
  155.  
  156. public double computePay()
  157. {
  158. System.out.println("Computing salary pay for " + getName());
  159. return salary/;
  160. }
  161.  
  162. //其余代码
  163. }
  164.  
  165. #接口
  166. 本例定义接口AreaInterface,其中有静态常量pai和求面积的抽象方法area()。类Circle和类Rectangle实现了AreaInterface接口,即为接口中的抽象方法area()编写了满足各自要求的方法体,分别求圆形和长方形的面积。
  167.  
  168. /* 文件名 : AreaInterface.java */
  169. package jiekou;
  170. public interface AreaInterface{
  171. double pai=Math.PI;
  172. double area();
  173. }
  174.  
  175. /* 文件名 : Circle.java */
  176. package jiekou;
  177. public class Circle implements AreaInterface{
  178. double r;
  179. public Circle(double x){
  180. r=x;
  181. }
  182. //实现接口中的抽象方法,求圆面积
  183. public double area(){
  184. return pai * r * r;
  185. }
  186. public String toString(){
  187. return "圆:r="+r+"\tarea="+area();
  188. }
  189. }
  190.  
  191. /* 文件名 : Rectangle.java */
  192. package jiekou;
  193. public class Rectangle implements AreaInterface{
  194. double x,y;
  195. public Rectangle(double a,double b){
  196. x=a;
  197. y=b;
  198. }
  199. public double area()//实现接口中的抽象方法,求长方形面积
  200. {
  201. return x * y;
  202. }
  203. public String toString()
  204. {
  205. return "长方形:x="+x+";y="+y+"\t"
  206. area=+area();
  207. }
  208. }
  209.  
  210. Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以,这大概就是Java抽象类唯一的优点吧,但这个优点非常有用。如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而Java接口做不到这一点,如果向一个Java接口里加入一个新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行,这显然是Java接口的缺点。
  211. 一个抽象类的实现只能由这个抽象类的子类给出,也就是说,这个实现处在抽象类所定义出的继承的等级结构中,而由于Java语言的单继承性,所以抽象类作为类型定义工具的效能大打折扣。在这一点上,Java接口的优势就出来了,任何一个实现了一个Java接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个Java接口,从而这个类就有了多种类型。
  212. 不难看出,Java接口是定义混合类型的理想工具,混合类表明一个类不仅仅具有某个主类型的行为,而且具有其他的次要行为。
  213. 在语法上,抽象类和接口有着以下不同:
  214. .abstract classJava语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface 继承抽象类使用的是extends关键字,实现接口使用的是implements关键字,继承写在前面,实现接口写在后面。如果实现多个接口,中间用逗号分隔。例:
  215. public class Main extends JApplet
  216. public class Main implements Runnable
  217. public class Main extends JApplet implements ActionListener
  218. public class Main extends JApplet implements ActionListener, Runnable
  219. .在abstract class中可以有自己的数据成员,也可以有非abstract的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
  220. .abstract classinterface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。
  221. .实现接口的类必须实现其中的所有方法,继承自抽象类的子类实现所有的抽象方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
  222. .接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
  223. .抽象类中的变量默认具有 friendly权限,其值可以在子类中重新定义,也可以重新赋值。
  224. .接口中的方法默认都是 public abstract 类型的。
  225.  
  226. 参考:
  227. https://baike.baidu.com/item/java%E6%8E%A5%E5%8F%A3/4939170?noadapt=1
  228. https://www.runoob.com/java/java-abstraction.html

Java 抽象类 抽象方法 接口的更多相关文章

  1. Java 抽象类与接口总结

    一.为什么要使用抽象类?有什么好处? 抽象类是通用接口.不同的子类可以用不同的方法表示此接口.通用接口建立起一种基本形式,以此表示所有子类的共同部分. 必须覆写父类abstract抽象的方法  含有抽 ...

  2. JAVA抽象类和接口的深入探讨

    Java 语言中,抽象类(abstract class) 和接口(interface) 是抽象思想的两种体现形式.初学者很容易把这两者搞混,所以Java面试中考抽象类和接口的区别的面试题也常有出现的. ...

  3. 第十八节:详解Java抽象类和接口的区别

    前言 对于面向对象编程来说,抽象是它的特征之一. 在Java中,实现抽象的机制分两种,一为抽象类,二为接口. 抽象类为abstract class,接口为Interface. 今天来学习一下Java中 ...

  4. Java抽象类和接口的比较

    一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法和一些具体 ...

  5. java抽象类与接口区别

    java抽象类与接口区别: abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstr ...

  6. Java 抽象类和接口的理解

    Java 抽象类和接口的理解 一.抽象类 为什么使用抽象类(个人理解): 面向对象的概念是,我们知道的所有的对象都是通过类来描绘的,如果类包含的信息不能描绘一个具体的对象,就需要抽象来解决了,意思是一 ...

  7. 记录:JAVA抽象类、接口、多态

    JAVA抽象类.接口.多态 1. 多态 定义 多态是同一个行为具有多个不同表现形式或形态的能力.(多态就是同一个接口,使用不同的实例而执行不同操作) 如何实现多态 继承和接口 父类和接口类型的变量赋值 ...

  8. Java——抽象类与接口的前世今生

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 1.抽象类: 当编写 ...

  9. java抽象类与接口的区别及用法

    java抽象类与接口的区别及用法 一.抽象类里面的方法可以有实现,但是接口里面的方法确是只能声明. 二.接口是设计的结果 :抽象类是重构的结果 . 三.java不支持多重继承,所以继承抽象类只能继承一 ...

随机推荐

  1. 常见框架和WSGI协议

    三大框架对比 Django 大而全 自带的功能特别特别多 类似于航空母舰 有时候过于笨重 Flask 小而精,只保留了核心功能,其他可以自由选择 第三方的模块特别特别多,如果将flask第三方模块全部 ...

  2. gitbub高效查找优秀项目

    in:name example   名字中带有example的项目 in:readme example 在readme文件带有example的项目 in:description example 描述里 ...

  3. LinkedHashMap 的核心就 2 点,搞清楚,也就掌握了

    HashMap 有一个不足之处就是在迭代元素时与插入顺序不一致.而大多数人都喜欢按顺序做某些事情,所以,LinkedHashMap 就是针对这一点对 HashMap 进行扩展,主要新增了「两种迭代方式 ...

  4. 在普通网页显示正常,加Https报This request has been blocked; the content must be served over HTTPS.,https网站加载http资源时,http资源被block

    解决办法 :在html头加<meta http-equiv="Content-Security-Policy" content="upgrade-insecure- ...

  5. [個人紀錄] regular 搜集

    判斷有理數 ^(0|[1-9]([0-9]{1,5})?)((\.(([0-9]{1,5})?[1-9])))?$

  6. mvc视图双下拉框联动

    html部分的代码 <tr class="trs"> <td class="item1"><div class="ite ...

  7. 3-awk

    1.输出双引号:awk '{print "\""}'        #放大:awk '{print "  \"  "}'使用“”双引号把一个 ...

  8. redis的两种持久化方案

    前言 人生在于折腾系列,网络,多线程等系列博客楼主还在继续折腾也不会放弃.缓存的知识其实并不仅仅在于简单的增删改查,我觉得有必要全面深入的学习一波.记录学习的过程与体悟. RDB 什么是RDB 对re ...

  9. SVG跟随父级DIV自适应

    后台返回过来的是这样的SVG标签 <svg width="100%" height="100%" version="1.1" xmln ...

  10. testNG结果入库

    一.使用IReporter接口 https://blog.csdn.net/oqqJohn1234567890/article/details/80900511  此文章中将结果数据打印成文本.