继承是面向对象(下)的第一节内容,也是后面整个面向对象(下)的学习基础,务必掌握扎实,对后面的学习会很有帮助。大二初学,欢迎各位大佬批评指正、不胜感激!
继承:对共性进行抽取,达到代码的复用。父类→共性,子类→个性。
句式:public(修饰符) class 子类 extends 父类
先上一张面向对象(下)的思维导图,把各个知识点都罗列出来,这样看得更清楚。
一、熟悉继承的基本用法
(1)先定义了一个父类Animal类,定义了三个成员变量:姓名、年龄、颜色。之后分别是eat和sleep方法,无参数,返回值类型为void,分别打印语句:在吃饭和在睡觉。
(2)之后定义了一个子类Dog类,并继承父类Animal,继承语法格式:修饰符 class 子类 extends 父类;在子类中定义了一个子类独有的bark方法,用于打印汪汪叫,这是狗才有的属性,其他动物都没有。吃饭和睡觉是所有动物都有的属性,直接从父类继承,不用再在子类中重新写一遍。
(3)最后是Test1测试类,在main方法中实现前面所有的方法。
通过new关键字实例化创建了一个Dog类对象dog,并通过“对象.属性”给dog方便赋值为“小王”和“3”,并分别打印狗的名字和年龄。之后分别调用eat、sleep、bark方法。eat和sleep方法是父类所有的,所有子类都可以调用,bark方法是Dog子类独有的,只有Dog类对象才能调用。
(4)输出结果:bark是子类独有的方法,打印狗汪汪汪。
二、访问父类成员(遵循就近原则)
(1)先定义了一个父类Animal,然后定义了两个整形变量a和b,然后定义了一个methodA方法和一个methodB方法,分别打印语句“Animal中的methodA()方法”和“Animal中的methodB()方法”。
(2)然后定义了一个子类Dog,继承父类Animal。定义了一个整形变量c,然后定义了一个method方法,无参数,返回值类型,并分别给a、b、c赋值,访问的a和b都是从父类中继承下来的,c是访问子类自己的c,然后定义了一个methodA方法和methodB方法,返回值类型为void,methodA方法的参数为int a,methodB方法无参数,并分别打印各自语句。
然后在Dog子类中定义了一个在methodC方法 ,返回值类型为void,无参数。先调用无参数methodA方法,访问的是父类中的methodA方法;然后调用有参数的methodA方法,访问的是子类的methodA(int)方法。最后调用无参数methodB方法,访问的是子类的methodB方法。
通过这个例子可以看出:访问父类的成员变量和方法遵循就近原则。子类有就优先访问子类自己的,子类没有则向父类中找,子类父类都没有则编译器报错。
(3)在测试类Test1中,定义了main方法,通过new关键字实例化创建了一个Dog类对象dog1,然后调用methodC方法 。
(4)输出结果:
三、super关键字
(1):先定义了一个父类Animal, 分别定义了两个整型变量a和b,然后定义了两个方法methodA方法和methodB,返回值类型为void,无参数。分别打印methodA()和methodB()语句。
(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关键字专门在子类中访问父类变量和方法。
(3):最后定义了一个测试类Test1,在main方法中通过new关键字实例化创建了一个Dog类对象dog,然后调用methodC方法。
(4):输出结果:
四、 子类构造方法:
定义:先有父后有子。子类对象构造时,需要先调用父类构造方法,然后执行子类的构造方法。
(1):定义了一个Animal父类,并定义了一个Animal构造方法,打印Animal语句。
(2):定义了一个子类Dog,继承子类Animal,定义了一个Dog的构造方法,并打印Dog语句。
(3):最后在测试类Test1和main方法中,通过new关键字实例化了一个Dog类对象dog,调用构造方法。
(4):输出结果:分别打印父类和子类的构造方法,先调用父类的构造方法,再调用子类的构造方法。
五、再谈初始化(代码块、构造方法的执行顺序)
(1)父类Animal,定义了name和age两个成员变量,先定义了一个无参构造方法,再定义了一个有参构造方法,打印有参构造方法语句。下面分别是实例代码块和静态代码块,分别打印各自的语句。
(2):子类Dog继承Animal父类,定义了一个有参构造方法,并通过super关键字调用父类的name和age,打印有参构造方法的语句。下面分别是实例代码块和静态代码块,并分别打印各自的语句。
(3):Test1测试类,main方法,new关键字实例化创建了两个对象dog1和dog2,并分别给姓名缓和年龄赋值。
(4):输出结果:
从中可以看出代码块和构造方法的执行顺序为:
父类静态代码块最先执行,子类静态代码块然后执行,且静态代码块都只执行一次,再次创建对象时父类和子类静态代码块均不会执行。
紧接着父类的实例代码块和构造方法先后执行,最后执行子类的实例代码块和构造方法。
总结一句话:先静态,只一次。再父类,终子类。先代码块,后构造方法。
六、final关键字
(1):final关键字修饰变量后,变量的值将不能再被改变。这里定义了一个父类Animal,然后定义了一个整形变量a,用final修饰,并赋值为10,打印a,下面再将a赋值为20,此时编译器报错,因为a用final修饰,不能再被更改。
(2):final关键字修饰的类不能被继承。定义了一个子类Dog,这里继承父类Animal,此时编译器报错。因为父类Animal此前已被final修饰,故不能被子类Dog继承。
(3):final关键字修饰的方法不能被重写。在父类和子类都定义了一个show方法,父类的show方法用final修饰,此时编译器在子类的show方法出报错,因为被final修饰的方法不能被重写
七、super和this:
相同点:都是关键字,都只能在非静态方法中使用,在构造方法调用时,必须是构造方法中的第一条语句。且不能同时存在。
不同点:this是当前对象的引用,super相当于是子类对象中从父类继承下来部分成员的引用。
this()用于调用本类构造方法,super()用于在子类中调用父类构造方法。
八、java不支持多继承:不能一个类继承多个类。
标签:定义,构造方法,继承,子类,面向对象,methodA,父类,方法 From: https://blog.csdn.net/gdswsj/article/details/143135390