一、概述
继承的概述:将多个类相同的部分使用同一个类括起来,其他类与这个类产生继承关系,这样其他类就包含了这个类的成员
关键字:extends
描述:class A extends B(){ }
A:子类,派生类
B:父类,超类,基类
特点: java中类与类之间只能单继承,不能多继承;
类和类之间可以进行多层继承,形成继承体系
注意事项:1、子类只能继承父类所有非私有的成员(成员方法和成员变量);
2、子类不能继承父类的构造方法,但是可以通过super(后面讲)关键字去访问父类构造方法;
3、不要为了部分功能而去继承
package com.shujia.day06.ketang; /* java中继承的特点(注意事项): 1、java中的类与类之间不能进行多继承,只能进行单继承,但是可以进行多层继承,形成继承体系 2、子类只能继承父类中所有非私有的成员(成员变量和成员方法) 3、子类无法继承父类中的构造方法,但是要想初始化子类,必须先初始化父类(指的是执行一次父类中任意一个构造方法) 4、不要为了部分功能去使用继承 5、什么时候使用继承?满足英语中的 is a的关系 */ class Father{ int a = 10; // private int b = 20; Father(){ System.out.println("这是父类中的无参构造方法"); } private void show(){ System.out.println("这是父类中私有的成员方法"); } } class Son extends Father{ public void fun1(){ System.out.println(a); // System.out.println(b); // show(); } } public class ExtendsDemo2 { public static void main(String[] args) { Son son = new Son(); // son.fun1(); // son.show(); } }
super :表示类的直接父类引用
面试题:super与this的异同
package com.shujia.day06.ketang; /* 继承中成员变量的关系(就近原则) 面试题:java中this和super的异同之处 1、相同点:使用的语句格式都差不多 访问成员变量:this.成员变量 super.成员变量 访问成员方法:this.成员方法(..) super.成员方法(..) 访问构造方法:this(..) super(..) 2、不同点:this代表的是当前类的对象 super代表的是直接父类的引用 */ class Demo1 { int a = 10; } class Demo1Zi extends Demo1 { int a = 100; public void fun1(){ int a = 11; System.out.println(a); //需求:我就想输出父类中的a // Demo1 demo1 = new Demo1(); // System.out.println(demo1.a); //获取当前类中的成员变量值 System.out.println(this.a); //java提供了一个与this关键字很像的另一个关键字: super 代表的是直接父类的引用 System.out.println(super.a); } } public class ExtendsDemo3 { public static void main(String[] args) { Demo1Zi demo1Zi = new Demo1Zi(); demo1Zi.fun1(); } }
二、子类初始化
要想初始化子类,必须先初始化父类,只要子类构造方法中第一句话调用父类中任意一个构造方法即可(结合super关键字来解释)
1、子类中每一个构造方法的第一句话默认是super() (super()的意思是调用直接父类的构造方法)
2、如果父类中没有无参构造方法? 直接在子类中通过super关键字调用父类其他的构造方法,或者间接地调用
3、父类不能进行多次初始化
package com.shujia.day06.ketang; /* 要想初始化子类,必须先初始化父类,只要子类构造方法中第一句话调用父类中任意一个构造方法即可(结合super关键字来解释) 1、子类中每一个构造方法的第一句话默认是super() (super()的意思是调用直接父类的构造方法) 2、如果父类中没有无参构造方法? 直接在子类中通过super关键字调用父类其他的构造方法,或者间接地调用 3、父类不能进行多次初始化 */ class Fu { // Fu(){ // System.out.println("这是父类中的构造方法"); // } Fu(String s) { System.out.println("这是父类中带参数构造方法" + s); } } class Zi extends Fu { Zi(){ //这里第一句话默认会有一个super() // this("hello"); super("hello"); // super("hello"); //父类不能进行多次初始化 // this("hello"); } Zi(String s){ super("hello"); } } public class ExtendsDemo4 { public static void main(String[] args) { Zi zi = new Zi(); } }
三、方法的重写
继承中成员方法的关系:
方法的重写:在继承关系中,子类中的方法的声明(返回值类型,方法名,参数列表)与父类中的方法声明都一样,只是实现不一样,这样的现象,叫做方法的重写
判断一个方法能不能重写,可以在方法的上面加上一个注解@Override,能加上不报错,就说明可以重写
面试题:重写与重载的区别?Override与Overload的区别?
方法的重写:在继承关系中,子类中的方法的声明(返回值类型,方法名,参数列表)与父类中的方法声明都一样,只是实现不一样,这样的现象,叫做方法的重写。
方法的重载:在同一个类中,方法的方法名相同,参数列表不同,这个现象叫做方法的重载,与返回值无关。
注意事项:
1.父类中私有方法不能被重写 因为子类根本无法继承私有的
2.子类重写父类方法时,访问权限不能更低 推荐除特殊要求外 子类重写与父类的权限保持一致肯定不会错
3.父类静态方法,子类无法重写
四、final关键字
父类中非私有的成员方法可以被子类继承,也可以被重写,但是如果父类中的非私有方法只想被子类使用,但是不想被子类重写,该怎么做呢?
final(最终的,不可变的):可以修饰类,变量,成员方法
特点:修饰类,类不能被继承
修饰变量,变量变常量
修饰方法,方法不能被重写
标签:重写,Java,构造方法,继承,子类,面向对象,父类,super From: https://www.cnblogs.com/SIKE231310/p/17803433.html