Java SE:面向对象(下):继承

继承是面向对象(下)的第一节内容,也是后面整个面向对象(下)的学习基础,务必掌握扎实,对后面的学习会很有帮助。大二初学,欢迎各位大佬批评指正、不胜感激!

继承:对共性进行抽取,达到代码的复用。父类→共性,子类→个性。 

句式:public(修饰符) class 子类 extends 父类 

先上一张面向对象(下)的思维导图,把各个知识点都罗列出来,这样看得更清楚。

1c3232c54fe74240b702f1f1bb673335.jpeg

 一、熟悉继承的基本用法

(1)先定义了一个父类Animal类,定义了三个成员变量:姓名、年龄、颜色。之后分别是eat和sleep方法,无参数,返回值类型为void,分别打印语句:在吃饭和在睡觉。

0133386f86b14f6ba5b11abf139dad0e.png

(2)之后定义了一个子类Dog类,并继承父类Animal,继承语法格式:修饰符 class                    子类 extends 父类;在子类中定义了一个子类独有的bark方法,用于打印汪汪叫,这是狗才有的属性,其他动物都没有。吃饭和睡觉是所有动物都有的属性,直接从父类继承,不用再在子类中重新写一遍。

bd6f914fbaf14afda77a8959e33a6582.png

(3)最后是Test1测试类,在main方法中实现前面所有的方法。

通过new关键字实例化创建了一个Dog类对象dog,并通过“对象.属性”给dog方便赋值为“小王”和“3”,并分别打印狗的名字和年龄。之后分别调用eat、sleep、bark方法。eat和sleep方法是父类所有的,所有子类都可以调用,bark方法是Dog子类独有的,只有Dog类对象才能调用。

15f2756b10974576bdec3d37e98a3079.png

(4)输出结果:bark是子类独有的方法,打印狗汪汪汪。

62c190587e3a437fab65b38d3379ac56.png

二、访问父类成员(遵循就近原则)

(1)先定义了一个父类Animal,然后定义了两个整形变量a和b,然后定义了一个methodA方法和一个methodB方法,分别打印语句“Animal中的methodA()方法”和“Animal中的methodB()方法”。

bc5386ed1d2f4717b84c2da6919eb68a.png

(2)然后定义了一个子类Dog,继承父类Animal。定义了一个整形变量c,然后定义了一个method方法,无参数,返回值类型,并分别给a、b、c赋值,访问的a和b都是从父类中继承下来的,c是访问子类自己的c,然后定义了一个methodA方法和methodB方法,返回值类型为void,methodA方法的参数为int a,methodB方法无参数,并分别打印各自语句。

e5dc8a5bd0de4e56b25e42d0ae665253.png

然后在Dog子类中定义了一个在methodC方法 ,返回值类型为void,无参数。先调用无参数methodA方法,访问的是父类中的methodA方法;然后调用有参数的methodA方法,访问的是子类的methodA(int)方法。最后调用无参数methodB方法,访问的是子类的methodB方法。

通过这个例子可以看出:访问父类的成员变量和方法遵循就近原则。子类有就优先访问子类自己的,子类没有则向父类中找,子类父类都没有则编译器报错。

8e44908704044f1ca278967923392099.png

(3)在测试类Test1中,定义了main方法,通过new关键字实例化创建了一个Dog类对象dog1,然后调用methodC方法 。

addecf792bf841578a759a9f64acb046.png

(4)输出结果:

9b1a42b375d54e25a3dbd0d5d8cfa792.png

三、super关键字

(1):先定义了一个父类Animal, 分别定义了两个整型变量a和b,然后定义了两个方法methodA方法和methodB,返回值类型为void,无参数。分别打印methodA()和methodB()语句。

ca09f7c781154030b13ee1e9ae31423b.png

(2):定义了一个Dog子类,继承父类Animal,然后定义了两个返回值类型为void的methodA方法和methodB方法,methodA方法参数为int a,methodB方法无参数,并分别打印methodA方法和methodB方法的语句。

之后定义了一个methodC方法,将子类的a和b分别赋值为100和200。

super关键字:在子类中调用父类方法和属性,因为就近原则,都是优先访问子类方法和变量,如果专门要访问父类方法和变量,要用super关键字。

将父类的a和b分别赋值为300和400,之后调用无参methodA方法,访问的是父类的methodA方法,然后调用有参methodA方法,访问的是子类的methodA方法。

再接着调用无参methodB方法,访问的是子类的methodB方法,子类父类也是无参,但优先访问的是子类。super.methodB()访问的是父类的methodB方法,super关键字专门在子类中访问父类变量和方法。

8ede8d95c1e24f89a7190c0981d54e56.png

(3):最后定义了一个测试类Test1,在main方法中通过new关键字实例化创建了一个Dog类对象dog,然后调用methodC方法。

6ccb4838956444989ab3b9274d3ce58a.png

(4):输出结果:

248c86e26c4c4daa884082dc88f73123.png

四、 子类构造方法:

定义:先有父后有子。子类对象构造时,需要先调用父类构造方法,然后执行子类的构造方法。

(1):定义了一个Animal父类,并定义了一个Animal构造方法,打印Animal语句。

0ff825cf46eb4fce9a49d4e4772f3124.png

(2):定义了一个子类Dog,继承子类Animal,定义了一个Dog的构造方法,并打印Dog语句。

 6a95c65bb61944ec8b139ce0bbb20296.png

(3):最后在测试类Test1和main方法中,通过new关键字实例化了一个Dog类对象dog,调用构造方法。

3d77a6a7193a4a2e80e09672bcd2529f.png

(4):输出结果:分别打印父类和子类的构造方法,先调用父类的构造方法,再调用子类的构造方法。

023e90c0edd2422fb52a2363a7f80551.png

五、再谈初始化(代码块、构造方法的执行顺序)

(1)父类Animal,定义了name和age两个成员变量,先定义了一个无参构造方法,再定义了一个有参构造方法,打印有参构造方法语句。下面分别是实例代码块和静态代码块,分别打印各自的语句。

62cd77ea66b44acdb558b725659edb0d.png

(2):子类Dog继承Animal父类,定义了一个有参构造方法,并通过super关键字调用父类的name和age,打印有参构造方法的语句。下面分别是实例代码块和静态代码块,并分别打印各自的语句。

929ea33bf4aa40f2a6d38c3955840e7b.png

(3):Test1测试类,main方法,new关键字实例化创建了两个对象dog1和dog2,并分别给姓名缓和年龄赋值。 86db28be77ef4b8b81e234228363a60e.png

(4):输出结果:

从中可以看出代码块和构造方法的执行顺序为:

父类静态代码块最先执行,子类静态代码块然后执行,且静态代码块都只执行一次,再次创建对象时父类和子类静态代码块均不会执行。

紧接着父类的实例代码块和构造方法先后执行,最后执行子类的实例代码块和构造方法。

总结一句话:先静态,只一次。再父类,终子类。先代码块,后构造方法。

a5b796d7614541308e59de394447ed7d.png

六、final关键字

(1):final关键字修饰变量后,变量的值将不能再被改变。这里定义了一个父类Animal,然后定义了一个整形变量a,用final修饰,并赋值为10,打印a,下面再将a赋值为20,此时编译器报错,因为a用final修饰,不能再被更改。

d03fdb74db414628ab18bdd08f53a1be.png

(2):final关键字修饰的类不能被继承。定义了一个子类Dog,这里继承父类Animal,此时编译器报错。因为父类Animal此前已被final修饰,故不能被子类Dog继承。 1391a252b6fe48798d9ccd9ac4d858fa.png

(3):final关键字修饰的方法不能被重写。在父类和子类都定义了一个show方法,父类的show方法用final修饰,此时编译器在子类的show方法出报错,因为被final修饰的方法不能被重写

785ce77279024ce794f162d76f5cd50e.png

七、super和this:

相同点:都是关键字,都只能在非静态方法中使用,在构造方法调用时,必须是构造方法中的第一条语句。且不能同时存在。

不同点:this是当前对象的引用,super相当于是子类对象中从父类继承下来部分成员的引用。

this()用于调用本类构造方法,super()用于在子类中调用父类构造方法。

八、java不支持多继承:不能一个类继承多个类。

评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值