Java继承详解

时间:2024-02-24 09:20:10

继承中用到权限修饰符:

private 本类(自己)
默认 本类(自己),同一个包下的类(自己和后宫)
protected 本类(自己),同一个包下的类(自己和后宫),不同包下的子类(自己,后宫,儿子【子类】)
public 本类(自己),同一个包下的类(自己和后宫),不同包下的子类(自己,后宫,儿子【子类】),不同包下的无关类(所有人)

默认修饰符的案例:

//A包下

//B包下

错误:import A包.Student;//这步导入不了Student

protected修饰符的案例:

//A包下

//B包下

错误:protected仅能允许不同包下的子类(自己,后宫,儿子【子类】)继承

正确:jk是Student类在不同包下的子类

是否能继承private?

答:不能!被private修饰的内容不能被子类继承。
子类可以通过get方法来访问父类的变量(尽管子类内部没法继承父类的私有变量)
即:子类变量 = get父类私有变量{ return 父类私有变量}
例如:一个比较乱伦的故事,王子如何得到父王私有的王后?



this和super

this关键字和super关键字

this关键字:当前类的对象,强调是对象,谁来调用包含this的这个方法,this就指的是谁。

super关键字:父类内存空间的引用。

this和super的一般用法()

成员//main方法内部
this.成员//本类内部的成员变量
this()//本类的构造方法
this.成员()//本类的成员方法
super.成员//父类内部的成员变量
super()//父类的构造方法
super.成员()//父类的成员方法

this和super的深层含义

要了解this和super的深层含义,我们需要了解继承发生的详细过程。



Test运行时,执行
Son son = new Son();
先实例化一个无参类型的Son对象,随后在Son()内部,执行this(10),即实例化一个参数为10的含参数Son对象
然后含参构造方法Son(10)执行时,执行super(10),super(10)开辟一个Son父类Father类的实例内存空间但是不创建对象,
于是先输出“父类的构造方法”。
随后构造方法super(10)开辟了Father类内存空间后,执行到输出“子类的有参构造方法”,
完成了Son(10)构造方法并且创建了含参的Son对象,随后跳回Son()构造方法中,执行“子类的无参构造方法”,
创建了无参的Son类的对象son。

当Son类继承Father类并且实例化时,此时的Father中有默认的无参构造方法Father(),同理Son中也有默认的无参构造方法Son(),
并且在Son中也有默认的无参构造方法Son()中的第一行,有隐藏的super();
这个构造方法Son()中隐藏的super()与Father中有默认的无参构造方法Father()共存,
当Father中有默认的无参构造方法Father()被我们人为显式定义成Father()或者Father(参数列表)的时候,
需要我们手动在Son类中添加构造方法Son(),并且要求在构造方法Son()的第一行显示写出super()或者super(参数列表);
总之,super的使命是让父类在子类实例化前进行初始化,因为子类实例化的时候会用到父类的成员,但是父类并不实例化,
因此super()叫做父类内存空间的引用,super()在子类实例化前创造了父类的内存空间并且让它与子类的对象在产生联系。

执行
Son son2 = new Son(10);
亦然。

子类中的无参构造方法被调用时,会先执行父类的无参构造方法
子类中的带参构造方法被调用时,会先执行父类的无参构造方法

子类在使用子类自己的构造方法创建对象之前,必须先访问父类的构造方法。
为啥?
因为子类在创建对象的过程中可能使用父类的内容,父类如果没有初始化子类不能访问。

举例:

首先父类需要先创建
其次,在子类创建有无参数的构造方法时,会先执行super(),我们可以写可以不写

当父类没有无参构造方法时:

1.我们自己写一个无参构造方法(推荐)
2.我们就在子类中写上super(参数);
只要做到,子类初始化之前,必须先初始化父类即可

举例:一个构造套构造的例子




通过子类对象访问方法

先子类成员范围
再父类成员范围
再父亲的父亲

方法的重写:

子类中出现了与父类一模一样的方法声明,这叫方法的重写

注解

@Override
帮忙检查重写的方法声明是否正确
面试:方法的重写和重载的区别?

方法重写的注意事项:

1.父类的私有方法,子类无法继承也无法重写
2.子类的访问修饰符也必须不比父类的低!(大于等于关系,但是private级别不能被重写)(一个方法前面没有任何访问修饰符,则前面也是有一个默认的访问修饰符的)
3.方法的重写 返回值类型可以不同,但是返回值类型必须是父类返回值类型的子类
比如父类的返回值类型是object,子类的返回值类型是String类,则无错误
4.Java只能单继承,不能多继承,可以多级继承