继承、多态

举报
brucexiaogui 发表于 2021/12/30 00:12:47 2021/12/30
【摘要】 继承、多态 继承: 面向对象的三大特征之一: 是类和类之间的一种拓展关系,是一种从一般到特殊的关系; 格式: sub extends Super, 我们把sub称为子类或者拓展类, 把super称为父类或者基类(超类) 泛化: 把子类中的共性抽取到父类的过程; 特化: 子类在父类的基础之上,拓展自己特有的状...

继承、多态


  
  1. 继承:
  2. 面向对象的三大特征之一:
  3. 是类和类之间的一种拓展关系,是一种从一般到特殊的关系;
  4. 格式: sub extends Super, 我们把sub称为子类或者拓展类, 把super称为父类或者基类(超类)
  5. 泛化: 把子类中的共性抽取到父类的过程;
  6. 特化: 子类在父类的基础之上,拓展自己特有的状态和特征;
  7. Object: 是所有类的直接父类后间接父类;
  8. class Student{} 等价于 class Student extends Object{}
  9. 直接父类: 直接继承的父类,有且只有一个,也就是说Java只支持单继承;
  10. 间接父类: 直接父类或间接的父类的父类;
  11. 方法和字段:
  12. private 修饰的成员不能被继承;
  13. 默认访问权限的成员能不能被继承? 要是在同一个包中就能被继承
  14. protected 修饰的成员,可以被继承;
  15. public 修饰的成员,可以被继承;
  16. 构造方法能不能被继承? 不能
  17. class Person{
  18. public Person(){}
  19. }
  20. class Student extends Person
  21. {
  22. //public Person(){}//ERROR
  23. }
  24. 若父类所有的构造方法是用 private 修饰,不能有子类;
  25. 子类实例化:
  26. 子类初始化,会先默认调用父类的一个无参的构造方法,自己再初始化;
  27. 子类的构造方法里,有一个隐式的 super();
  28. 若我们显示的让子类去调用父类有参数的构造方法,默认的隐式的构造方法就不会被调用了;
  29. 子类对象创建之前,必须有一个父类对象;
  30. 方法覆写:
  31. 当父类的某一个方法不适合子类对象的时候,就应当重新修改方法体;
  32. 遵循的原则: 一同 两小 一大:
  33. 一同: 方法签名相同
  34. 两小:
  35. 1.返回值类型可以是父类返回值类型的子类或相同;
  36. 父类的:Object show(){
  37. return null;
  38. }
  39. 子类的: String show()
  40. {
  41. return null;
  42. }
  43. 2.异常更小
  44. 一大: 子类方法的访问权限 >= 父类方法的访问权限
  45. 父类的: private Object show(){
  46. return null;
  47. }
  48. 子类的: String show()
  49. {
  50. return null;
  51. }
  52. 上面这个不是覆写:因为私有成员不能被继承
  53. 必杀技: 若子类方法是覆写方法的话, 那么在方法上加上 @Override 是可以编译通过的;
  54. 静态方法能不能被覆写: 不能!
  55. 方法的覆写:属于多态,而多态是基于对象的(父类的一个变量指向子类的一个对象);
  56. 而静态方法不属于对象,属于类;
  57. super:
  58. 用在子类.,
  59. super:表示父类对象
  60. 用于调用父类的方法或字段,用法和this一模一样
  61. 调用父类的构造方法:
  62. super(参数);和this(参数);
  63. 都表示在构造方法里调用构造方法;都必须写在构造方法的第一行
  64. 不同: this(参数),调用的当前类里面的构造方法,super(参数),调用的是直接父类里构造方法
  65. 多态:
  66. 面向对象的三大特征之一:
  67. Person p = new Student();
  68. p的真正类型是学生;当是我们只把他当一般人看待;
  69. 编译类型: 申明变量的类型 Person , 是我们把它当做什么
  70. 运行类型: 创建对象的类型 Student , 是对象真正的类型
  71. 多态的产生前提:继承
  72. 当编译类型和运行类型不一致的时候,就会产生多态;
  73. 多态定义: 同一个实体有多种形态;
  74. 多态的作用: 可以屏蔽不同子类对象之间的差异,从而能写出更加通用的代码,能提高效率,维护性;
  75. 引用类型转换:
  76. 向上转型: 小->大, 自动转换, 这里说的小和大,说的是 继承关系中的子类和父类.
  77. 可以把子类对象赋给父类变量;
  78. Person p = new Student();
  79. Object类是所有类的父类.那么Object类型的变量能不能接受一切值? 可以!
  80. 向下转型: 大 -> 小
  81. 父类对象强制转换成子类对象;
  82. Student s = (Student)p;
  83. 一般的,再强转之前,要先判断该对象时候属于这个类类型;
  84. boolean b = 对象 instanceof
  85. 对象的类型和类必须有继承关系;
  86. 先判断 p是否是学生类型:
  87. if(p instanceof Student)
  88. {
  89. Student s = (Student)p;
  90. }
  91. 多态方法调用:
  92. class Car{
  93. public void run(){}
  94. }
  95. class Binli extends Car
  96. {
  97. public void paoMM(){
  98. }
  99. public void run(){}
  100. }
  101. Car c = new Binli();
  102. 1.调用的方法不是覆写方法,子类有,父类没有;
  103. c.paoMM();//找不到方法,编译的时候,去Car类里去找;
  104. if(c instanceof Binli)
  105. {
  106. Binli b =(Binli)c;
  107. b.paoMM();
  108. }
  109. 2.调用的方法是覆写的方法,父类有,子类也有;
  110. c.run();//调用的是子类的方法,,在编译的时候去Car里找run方法,但运行期间找的Binli类里的run方法;
  111. 组合:
  112. extends 继承是一种从一般到特殊的关系, 也就是说 子类是父类的一种特殊情况;
  113. 子类 is 父类的一种 is A 关系
  114. 组合,包含: 比如手机和手机卡, 手机里有手机卡 ,has A关系
  115. 圆心和圆的关系:
  116. 练习:判断一个点和圆的关系(外,内,上);
  117. // 描述一个点,只需要坐标就OK了
  118. class Dot
  119. {
  120. private double x;//横坐标
  121. private double y;//纵坐标
  122. //根据坐标来创建点
  123. public Dot(double x, double y)
  124. {
  125. this.x =x;
  126. this.y = y;
  127. }
  128. //getter setter
  129. }
  130. /*
  131. 描述一个圆,
  132. 圆包含圆心,圆心又是一个点
  133. */
  134. class Circle{
  135. private Dot o;//圆心//等价于private Dot o = null;
  136. //private Dot p;/不能这样设计,这样就已经表示圆包含需要判断的点了
  137. private double r;//半径
  138. //根据半径和圆心来创建指定的圆
  139. public Cirlce(Dot o, double r)
  140. {
  141. //this.o.setX(o.getX());ERROR
  142. this.o = o;
  143. this.r = r;
  144. }
  145. //写一个判断点和圆的关系的方法
  146. public String judge(Dot p)
  147. {
  148. double x = o.getX() - p.getX();
  149. double y = o.getY() - p.getY();
  150. double xx = x * x;
  151. double yy = y * y;
  152. double rr = r * r;
  153. if(xx + yy - rr > 0)
  154. {
  155. //圆外
  156. }else if(xx + yy - rr == 0)
  157. {
  158. //圆上
  159. }else{
  160. //圆内
  161. }
  162. return "";
  163. }
  164. /*
  165. getter/setter
  166. */
  167. }
  168. ....main...
  169. {
  170. //创建圆心点
  171. Dot o = new Dot(0.0,0.0);
  172. //创建指定大小的圆
  173. Circle c = new Circle(o, 5);
  174. //还需要一个判断的点
  175. Dot p = new Dot(3,4);
  176. //判断
  177. String ret =c.judge(p);
  178. System.out.println(ret);
  179. }

 

文章来源: brucelong.blog.csdn.net,作者:Bruce小鬼,版权归原作者所有,如需转载,请联系作者。

原文链接:brucelong.blog.csdn.net/article/details/81567099

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。