1 继承(1)
2 类是对对象的抽象,继承是对某一批类的抽象,从而实现对现实世界更好的建模。
3 提高代码的复用性!
4 extends的意思是“扩展”。子类是父类的扩展
5
6 父类:超类、基类、 子类:派生类
7 小结:
8 继承的作用:通过继承可以简化类的定义,实现代码的重用
9
10 子类继承父类的成员变量和成员方法,但不继承父类的构造方法
11
12 –java中只有单继承 ,没有像c++那样的多继承。多继承会引起混乱,使得继承链过于复杂,系统难于维护。就像我们现实中,如果你有多个父母亲,那是一个多么混乱的世界啊。多继承,就是为了实现代码的复用性,却引入了复杂性,使得系统类之间的关系混乱。
13 –java中的多继承,可以通过接口来实现
14 –
15 如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object继继承(1)
16
17
18 子类可以继承父类的所有资源吗?
19 不能,不能被继承的父类成员有 1、private成员 2、子类和父类不再同包,使用默认访问权限的成员 3、构造方法
20
21 本类 同包 子类 所有类
22 public √ √ √ √
23 Protected √ √ √ ×
24 默认 √ √ × ×
25 Private √ × × ×
26 package finaldemo;
27 /**
28 * 1,用final来修饰一个变量, 则该变量就变成了一个常量
29 * 2,用final来修饰一个类,则该类就不能被作为父类继承
30 * 3,用final来修饰一个方法,则该方法就不能被重写
31 * @author tang
32 *
33 */
34 public class Test {
35 public static void main(String[] args) {
36 final int AGE;
37 AGE = 10;
38
39 }
40 }
41
42
43 方法的重写(override)
44 在子类中可以根据需要对从基类中继承来的方法进行重写。
45 重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型。
46 重写方法不能使用比被重写方法更严格的访问权限。(由于多态)
47 package overwriter;
48
49 public class Pet {
50 private String name;
51 private int health;
52 private int love;
53
54 public Pet() {
55
56 }
57
58 public Pet(String name, int health, int love) {
59 super();
60 this.name = name;
61 this.health = health;
62 this.love = love;
63 }
64 public void print() {
65 System.out.println(name + health + love);
66 }
67
68 public String getName() {
69 return name;
70 }
71 public void setName(String name) {
72 this.name = name;
73 }
74 public int getHealth() {
75 return health;
76 }
77 public void setHealth(int health) {
78 this.health = health;
79 }
80 public int getLove() {
81 return love;
82 }
83 public void setLove(int love) {
84 this.love = love;
85 }
86 }
87
88 package overwriter;
89 public class Cat extends Pet{
90 private String color;
91 public Cat(String name, int health, int love, String color) {
92 super(name, health, love);
93 this.color = color;
94 }
95 public Cat() {
96 super();
97 // TODO Auto-generated constructor stub
98 }
99 @Override
100 public void print() {
101
102 System.out.println();
103 super.print();
104 }
105
106 public String getColor() {
107 return color;
108 }
109
110 public void setColor(String color) {
111 this.color = color;
112 }
113 }
114
115 package overwriter;
116 public class Dog extends Pet {
117 //成员变量在最上面
118 private String strain;
119 //成员变量下面写构造方法
120 public Dog() {
121
122 }
123 public Dog(String name, int health, int love, String strain) {
124 super(name, health, love);
125 this.strain = strain;
126 }
127 public String getStrain() {
128 return strain;
129 }
130 public void setStrain(String strain) {
131 this.strain = strain;
132 }
133 }
134
135 package overwriter;
136
137 public class Test {
138 public static void main(String[] args) {
139 Dog wangcai = new Dog("旺财", 100, 100, "哈士奇");
140 wangcai.print();
141
142 Cat cat = new Cat("小黑", 100, 90, "黑色");
143 cat.print();
144 }
145 }
146
147 需要改写父类中方法的代码
148 package overwriter02;
149
150 public class Pet extends Object{
151 private String name;
152 private int health;
153 private int love;
154
155 public Pet() {
156
157 }
158 public Pet(String name, int health, int love) {
159 super();
160 this.name = name;
161 this.health = health;
162 this.love = love;
163 }
164 //宠物发出叫声的方法
165 public void bark() {
166
167 }
168
169 public String getName() {
170 return name;
171 }
172 public void setName(String name) {
173 this.name = name;
174 }
175 public int getHealth() {
176 return health;
177 }
178 public void setHealth(int health) {
179 this.health = health;
180 }
181 public int getLove() {
182 return love;
183 }
184 public void setLove(int love) {
185 this.love = love;
186 }
187 }
188
189 package overwriter02;
190
191 public class Cat extends Pet{
192 private String color;
193
194 public Cat(String name, int health, int love, String color) {
195 super(name, health, love);
196 this.color = color;
197 }
198 public Cat() {
199 super();
200 // TODO Auto-generated constructor stub
201 }
202
203 @Override
204 public void bark() {
205 System.out.println("miao miao ...");
206 }
207
208 public String getColor() {
209 return color;
210 }
211
212 public void setColor(String color) {
213 this.color = color;
214 }
215
216 }
217
218
219 public class Dog extends Pet {
220
221 //成员变量在最上面
222 private String strain;
223 //成员变量下面写构造方法
224 public Dog() {
225
226 }
227 public Dog(String name, int health, int love, String strain) {
228 super(name, health, love);
229 this.strain = strain;
230 }
231
232 @Override
233 public void bark() {
234 super.bark();
235 System.out.println("won won ...");
236 }
237
238 public String getStrain() {
239 return strain;
240 }
241 public void setStrain(String strain) {
242 this.strain = strain;
243 }
244 }
245
246 package overwriter02;
247
248 public class Test {
249 public static void main(String[] args) {
250
251 }
252 }
253
254
255
256 为什么需要重写父类的方法?
257 父类实现的方法不符合子类的逻辑
258 父类已经实现了80%,但是子类又必须要使用剩下的20%,所以可以重写父类方法,在方法内用super关键字调用父类的方法,再去完成剩下的20%工作
259
260 super关键字
261 定义:super是直接父类对象的引用。
262 用法:可以通过super来访问父类中被子类覆盖的方法或属性。
263 普通方法:
264 没有顺序限制。可以随便调用。
265 构造函数中:
266 任何类的构造函数中,若是构造函数的第一行代码没有显式的调用super(...);那么Java默认都会调用super();作为父类的初始化函数。 所以你这里的super();加不加都无所谓。
267
268 final关键字
269 定义:final可以用来修饰变量,方法,类。
270 修饰变量 变量一旦被初始化便不可改变 相当于定义了一个常量
271 修饰引用数据类型 引用不能被赋值 但属性可以被赋值
272 修饰方法 final方法是在子类中不能被覆盖的方法
273 修饰类 final类是无法被任何类继承的
274 package finaldemo;
275 /**
276 * 1,用final来修饰一个变量, 则该变量就变成了一个常量
277 * 2,用final来修饰一个类,则该类就不能被作为父类继承
278 * 3,用final来修饰一个方法,则该方法就不能被重写
279 * @author tang
280 *
281 */
282 public class Test {
283 public static void main(String[] args) {
284 final int AGE;
285 AGE = 10;
286
287 }
288 }
289 package finaldemo;
290
291 public class Pet {
292 public final void test() {
293 System.out.println("test");
294 }
295 }
296 package finaldemo;
297
298 public class Dog extends Pet{
299
300 }
301
302
303 Object类
304 object类是所有java类的根基
305 如果在类的声明中未使用extends关键字指明其基类,则默认基类为object类
306 public class Person {
307 ...
308 }
309 public class Person extends Object {
310 ...
311 }
312 package objectdemo;
313
314 public class Dog {
315 private String name;
316 private int age;
317
318 public Dog(String name, int age) {
319 super();
320 this.name = name;
321 this.age = age;
322 }
323 public Dog() {
324 super();
325 // TODO Auto-generated constructor stub
326 }
327
328
329 @Override
330 public boolean equals(Object dog) {
331 //做类型转换 将Object类型的参数转换为Dog类型的参数
332 Dog dahuang = (Dog)dog;
333 //如果两个对象的名字是相同的,则认为是相同的对象
334 boolean b = this.name.equals(dahuang.name);
335 return b;
336 }
337
338 //当使用system.out.println 来打印一个对象的时候 就是在答应对象toString方法的返回值
339 @Override
340 public String toString() {
341 return "Dog [name=" + name + ", age=" + age + "]";
342 }
343 public String getName() {
344 return name;
345 }
346 public void setName(String name) {
347 this.name = name;
348 }
349 public int getAge() {
350 return age;
351 }
352 public void setAge(int age) {
353 this.age = age;
354 }
355 }
356 package objectdemo;
357 public class Test {
358 public static void main(String[] args) {
359 Dog wangcai = new Dog("旺财",11);
360 Dog dahuang = new Dog("旺财", 10);
361
362 System.out.println(wangcai.equals(dahuang));
363 System.out.println(wangcai.toString());
364 }
365 }
366
367
368 重写: toString 方法:
369 默认返回:包名+类名+@+哈希码
370 可以重写!
371
372 抽象类
373 定义:是一种模版模式。抽象类为所有子类提供了一个通用模版,子类可以在这个模版基础上进行扩展。
374 作用: 通过抽象类,可以避免子类设计的随意性。通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用。
375 package 抽象类;
376 /**
377 * class 前加abstract 该类就成为了一个抽象类
378 * 1,抽象类不能创建对象
379 * 2,抽象类一般是一个父类,该父类没有什么存在的意义,就是用来被子类继承
380 * 3,抽象类中可以有抽象方法,也可以有非抽象方法
381 * 4,一个类继承了一个抽象类,则该类必须要实现该抽象类中的所有抽象方法
382 * 5,如果子类也是抽象类,则可以不实现父类的抽象方法
383 * 6,抽象方法必须定义在抽象类中
384 *
385 *
386 * 为什么要使用抽象类
387 *
388 * @author tang
389 *
390 */
391 public abstract class Pet {
392 private String name;
393 //抽象方法
394 //如果一个方法 每个子类实现的逻辑都不一样 则把该方法定义成抽象方法,
395 //让每个子类去根据自己的逻辑实现该方法
396 public abstract void bark();
397 public abstract void eat();
398 public abstract void sleep();
399 public abstract void play();
400
401 //如果一个方法,每个子类实现的逻辑都一样 则该方法直接在父类中实现,子类直接调用
402 public String getName() {
403 return name;
404 }
405 public void setName(String name) {
406 this.name = name;
407 }
408
409 }
410
411 package 抽象类;
412
413 public class Dog extends Pet{
414
415 @Override
416 public void bark() {
417 System.out.println("won won won...");
418 }
419
420 @Override
421 public void eat() {
422 System.out.println("狗喜欢吃骨头");
423 }
424
425 @Override
426 public void sleep() {
427 System.out.println("狗在睡觉。。。");
428 }
429
430 @Override
431 public void play() {
432 System.out.println("狗在玩飞盘。。。");
433 }
434
435 }
436 package 抽象类;
437
438 public class Cat extends Pet{
439
440 @Override
441 public void bark() {
442 System.out.println("maio miao ...");
443 }
444
445 @Override
446 public void eat() {
447 System.out.println("猫在吃鱼。。。");
448
449 }
450
451 @Override
452 public void sleep() {
453 System.out.println("猫在晒太阳。。。");
454 }
455
456 @Override
457 public void play() {
458 System.out.println("猫在玩老鼠。。。");
459 }
460
461 }
462
463 总结:
464 抽象方法和抽象类均必须用abstract来修饰。
465 抽象方法没有方法体,只需要声明不需实现。
466 有抽象方法的类只能定义能抽象类
467 相反抽象类里面的方法不一定全是抽象方法,也可能没有抽象方法。
468 抽象类可以包含属性、方法、构造方法。
469 抽象类不能实例化,及不能用new来实例化抽象类,只能用来被子类调用。
470 抽象类只能用来继承。
471 抽象方法必须被子类实现。抽象类的子类必须覆盖所有的抽象方法才能被实例化,否则还是抽象类
472 构造方法调用顺序:
473 根据super的说明,构造方法第一句 总是:super(…)来调用父类对应的构造方法。
474 先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止
475
476 对象的比较—==和equals()
477 ==:
478 比较两基本类型变量的值是否相等
479 比较两个引用类型的值即内存地址是否相等,即是否指向同一对象
480 equals() :
481 两对象的内容是否一致
482
483 自定义类须重写equals(),否则其对象比较结果总是false。
484 package equalsdemo;
485 /**
486 * 判断相等的两种方式
487 *
488 *1, ==
489 * 用来判断基本数据类型的数据是否相等
490 * 也可以用来判断引用数据类型 判断两个引用是否相等 当且仅当两个引用指向的是同一个对象 == 判断才返回true
491 *
492 *
493 *2,equals
494 * 判断引用数据类型的对象是否相等
495 * 如果一个类没有重写该方法,则自动调用到Object中的equals 判断规则跟 == 一样
496 * 如果要自定义判断相等的规则,则在本类中重写equals 方法,在方法内定义比较规则
497 * @author tang
498 *
499 */
500 public class Test {
501 public static void main(String[] args) {
502 String str01 = "abc";
503 String str02 = new String("abc");
504
505 System.out.println(str01 == str02);
506 System.out.println(str01.equals(str02));
507
508 }
509 }