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 }
原文地址:https://www.cnblogs.com/meizhoulqp/p/11280448.html