09 继承

Posted meizhoulqp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了09 继承相关的知识,希望对你有一定的参考价值。

  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 

 

以上是关于09 继承的主要内容,如果未能解决你的问题,请参考以下文章

c++:继承

c++:继承

09 继承

继承(C++)

继承(C++)

Python学习09:继承与多重继承