黑马程序员技术交流社区

标题: 看完这个,个人最为详细的总结,继承你就懂了 [打印本页]

作者: n361204357    时间: 2015-7-18 09:55
标题: 看完这个,个人最为详细的总结,继承你就懂了
本帖最后由 n361204357 于 2015-7-23 22:56 编辑
  1. /*
  2. 继承:<FONT color=red size=3>多个类有相同属性,行为,可以用现有类去构建一个新类。
  3. </FONT>原因:发现了一个问题,假如将来有很多这样的类似的类,那么,代码的重复度是很高的。
  4. <FONT color=black>final
  5. 很多时候,有些内容,是不能被子类重写的。而我们又知道,只要方法声明(public void show())相同。
  6. 子类就可以重写父类方法。这样就让父类的方法不安全了。
  7. 这样,有效代码其实并不多
  8. </FONT><FONT color=red size=5>作用:
  9. 1,提高代码复用。
  10. 2,让类与类之间产生了一个关系,是多态的前提
  11. </FONT>格式:
  12. class 类A extends 类B
  13. {

  14. }
  15. <FONT color=red size=4>注意事项:
  16. final关键字:最终的意思。它可以修饰类,修饰成员变量,修饰成员方法。
  17. 它修饰的成员方法,是不可以被子类重写的。
  18. 它修饰的成员变量,其实是一个常量。
  19. 常量:
  20. 字面值常量 'a',"hello",123
  21. 定义常量
  22. 和定义变量的格式一致,不过,加了final修饰。
  23. 它修饰的类,不能被继承。

  24. 1,子类可以直接访问父类中的非私有的属性和行为。
  25. 2,Java只支持单继承,不支持多继承。
  26. 3,Java支持多层(重)继承(继承体系)
  27. 4,父类方法重写的注意问题:
  28. A:父类中的私有方法不可以被重写。
  29. B:子类方法访问权限一定要大于等于父类方法访问权限
  30. C:静态的方法只能被静态方法重写。这个其实不能算对象的关系。
  31. D:覆盖的应用:
  32. 当子类需要父类的功能,而功能主体子类有自己特有内容时,
  33. 可以复写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。
  34. 执行顺序:
  35. 静态代码块 -- > 构造代码块 -- > 构造方法。
  36. </FONT>注意:

  37. 不要为了获取部分功能,而去使用继承

  38. 静态代码块只执行一次。

  39. 继承中的构造关系:
  40. 子类的构造方法默认都去访问了父类的无参构造方法:
  41. 在子类中的构造方法中都有一行默认语句:super()

  42. 为什么要这样呢?
  43. 因为子类会自动具备父类中非私有数据,那么,这个数据的初始化
  44. 靠父类完成。所以,会去先调用父类的构造方法对数据进行初始化。

  45. 我现在要在子类中,输出局部范围的值,输出成员范围的值,输出父亲成员变量的值,该怎么办?
  46. A:局部范围的值 直接输出变量名即可。
  47. B:成员范围 输出this.变量名即可。
  48. C:父的成员变量 输出super.变量名即可。

  49. this和super的使用: this作用于本类,super作用于父类
  50. 成员变量:
  51. this.变量 -- 当前类的变量
  52. super.变量 -- 父类的变量

  53. 构造方法:用在构造方法中的。
  54. this(参数) -- 本类的构造方法
  55. super(参数) -- 父类的构造方法

  56. 成员方法:
  57. this.方法名() -- 本类的方法
  58. super.方法名() -- 父类的方法
  59. 注意:
  60. 如果父类中没有无参构造方法,那么,该怎么办呢?
  61. A:可以通过super(参数)去访问父类中的带参构造方法。
  62. B:可以通过this(参数...)去访问本类中的其他构造方法。不推荐使用。
  63. 如何成员变量被私有了,那么,在子类中怎么使用呢?
  64. A:儿子通过父亲的set方法可以给父亲的成员变量赋值。
  65. B:通过子类调用父类的带参构造方法。
  66. */

  67. class Person
  68. {
  69. String name;
  70. private int age;
  71. final int a=10;
  72. static
  73. {
  74. System.out.println("父类代码静态代码块优先加载");
  75. }
  76. public Person()
  77. {
  78. System.out.println("父类无参的构造函数永远手动写上,父类方法区在子类静态加载后加载");
  79. }
  80. public Person(int age)
  81. {
  82. this.age=age;
  83. System.out.println("父类有参的构造函数:"+age);
  84. }
  85. public void setName(String name)
  86. {
  87. this.name=name;
  88. System.out.println("设置父类属性:"+name);
  89. }
  90. public String getName()
  91. {
  92. return name;
  93. }
  94. public void setAge(int age)
  95. {
  96. this.age=age;
  97. System.out.println("设置父类属性1:"+age);
  98. }
  99. public int getAge()
  100. {
  101. return age;
  102. }
  103. public void show()
  104. {
  105. System.out.println("调用了父类方法:"+name+"..."+age);
  106. }
  107. final public void speak() //被final的方法是不能被子类重写的
  108. {
  109. System.out.println("被final的方法是不能被子类重写的");
  110. }
  111. }
  112. class Student extends Person //不要忘记了继承
  113. {
  114. int age=10;

  115. static
  116. {
  117. System.out.println("子类的静态代码块加载了");
  118. }
  119. public Student()
  120. {

  121. System.out.println("子类无参的构造函数加载了");
  122. //super(); 必须是第一句,每一个子类都默认调用了父类的无参构造方法。

  123. }
  124. //重写 静态的方法只能被静态重写
  125. public void show() //父类有什么子类就要有什么修饰 ,父类权限一定大于子类权限
  126. {
  127. //int age=30; 现在局部范围找,再找成员范围,再从父类找,找不到报错。
  128. System.out.println("就近原则:"+age);
  129. super.setName("子类赋名");
  130. super.setAge(20);//父类age私有化了,可以通过调用父类赋值,间接访问
  131. System.out.println("子类重写了父类属性:"+super.name+"..."+age);
  132. super.show();
  133. System.out.println("就近原则:"+this.age);//虽然age被赋值了,但是this调用的是成员变量
  134. System.out.println(a);//被final修饰的变量会变成常量
  135. //a=20;//错误: 无法为最终变量a分配值 ,因为a被修饰了,变量成常量
  136. System.out.println(a);
  137. }
  138. /*
  139. 这种写法,不是重写。 重写必须返回值类型,列表参数,返回值类型都要一样。
  140. 重载方法名和类名相同,参数列表相同,与返回值无关。
  141. public int show()
  142. {
  143. System.out.println("zi show");
  144. return 10;
  145. }
  146. */


  147. }
  148. class Teacher extends Person//,student 这是错误的,不支持多继承//自动调用父类的无参构造
  149. {
  150. /*
  151. public void speak()//被final的方法是不能被子类重写的
  152. {

  153. }
  154. */
  155. }
  156. /*
  157. final class mother //已结扎
  158. {
  159. }
  160. class son extends mother //加了final的类不能重写
  161. {
  162. }
  163. */
  164. class PersonText
  165. {
  166. public static void main(String[] args)
  167. {
  168. Student s=new Student();
  169. s.show();
  170. //Teacher.show();只有静态的才可以这样调用;
  171. Teacher t=new Teacher();
  172. t.show();//继承了父类
  173. Person p =new Person();
  174. p.show();//重写不是子类重新修改父类,而是重写子类继承父类的属性。

  175. }
  176. }
复制代码






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2