Java初始化顺序

Posted 菜菜小谭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java初始化顺序相关的知识,希望对你有一定的参考价值。

*********************继承中的对象初始化顺序(内存结构)************************


private 修饰的属性 和方法 不能被继承

 

父类中 private 修饰的属性 比如 private BMW bmw = new BMW(); 在子类对象中存在不存在?


其实是有的! 子类对象包含父类中所有的属性的....

 

一.隐式的创建父类的对象

1. 给父类对象的实例变量分配空间、默认初始化

2. 声明时初始化、初始化块初始化

3. 构造函数初始化

 


二.创建子类的对象

1. 给子类对象的实例变量分配空间、默认初始化

2. 声明时初始化、初始化块初始化

3. 构造函数初始化

二.创建子类的对象

 

父类对象的初始化块执行
使用父类的name,age构造函数初始化
子类对象的初始化块执行
子类sno,name,age构造函数执行

 

*******************************super指针****************************

super 指向隐式创建的父类对象


一. 使用super()调用父类的构造函数

(1) super()

在子类构造函数中 如果什么也不写 相当于写上 super() 调用父类默认的构造函数

注意: 这时 父类中 如果写了带参数的构造函数,一定要把不带参数的默认的构造函数加上

否则会报错

2. super(参数) 调用指定的父类构造函数


public Student(int sno,String name,int age){
//super();//调用父类的默认的构造函数
super(name,age);//调用指定的父类构造函数初始化

System.out.println("子类sno,name,age构造函数执行");
this.sno = sno;
}

 


继承! = 含有


继承: 子类对象可以有权利随意访问,使用this来随意访问属性或方法才叫继承


二. 使用super 访问被隐藏的父类同名实例变量

super.父类属性名

例如

super.name


三. 使用super调用 父类的方法

super.父类方法名()


public class JavaTeacher extends Teacher{

public void teach(){

super.teach();//调用父类的teach()方法 保留父类的行为 解决了代码冗余问题

System.out.println("我不仅要说 而且要敲代码");
}

public static void main(String[] args) {
JavaTeacher jt = new JavaTeacher();

jt.teach();
}
}

 


*********************************************属性的隐藏**************************************


父类Person 中定义一个name="父亲"

子类Student中也定义一个name="孩子"


子类对象中有两份name,直接在子类对象中 定义一个方法 intro 打印 name 打印的是子类对象的name

叫做属性的隐藏

 

 

*******************************************继承中的类初始化**************************************


第一次使用类的时候

Student s = new Student();


一.父类的类初始化


二.子类的类初始化


********************************重写 Override (也叫覆盖)************************

一.why


大雁和鸽子都属于鸟类, 继承鸟这个类,都可以飞,而鸵鸟是一种特殊的鸟,不会飞.如果鸵鸟

继承鸟类以后不做任何处理,鸵鸟也会飞了.. 显然不对


当子类的行为 和 从父类继承下来的行为 不太一样的时候, 需要使用重写 ,来重新定义子类的行为


二.what 什么是重写

也叫做覆盖


推翻 父类继承下来的行为 整个推翻 重写

三. how 如何重写


重写首先建立在继承的基础上,子类要继承父类..

最简单的重写: 子类定义的方法 和父类方法完全一样 ,叫做重写


演示代码:


package com.chapter8.演示重写;

//鸟
public class Bird {

public void fly(){
System.out.println("我是一只小小鸟,我在飞");
}
}

 


鸵鸟

public class TuoNiao extends Bird {

public void fly(){
System.out.println("我是鸵鸟,我不会飞");
}

public static void main(String[] args) {
TuoNiao tuoniao = new TuoNiao();

tuoniao.fly();
}
}


************************************重写规则: 一同一大两小 ***************************************


一同: 方法的签名相同


方法的签名 = 方法名 + 参数列表

 

如何验证是否是正确的重写

使用注解 @Override

如果是正确的重写 不报错 否则 编译报错

编译的时候 编译器帮你验证


注解是有功能的,注释只是一个提示作用,没有其他功能

 

一大: 子类方法的访问控制权限 比父类方法的访问控制权限要大(或相同)


private
default
protected
public


两小:

1. 子类方法的返回值 是 父类方法返回值的子类(协变式返回值)

2. 子类方法抛出的异常 比 父类方法抛出的异常 范围小


 


************************************Overload 和Override的区别***************************************


一.Overload 重载


1.方法的名称相同,参数列表不同的方法之间叫做重载

参数列表不同体现在三个方面:

1. 个数不同

2. 类型不同

3. 顺序不同

 


二. Override 重写


子类继承父类, 子类重写父类的方法, 只要符合重写规则就叫重写


重写规则如下:

...

 

************************************其他零散知识***************************************


1.同一个类中的方法之间可以相互重写吗??

 

不可以. 重写要建立在继承的基础上,子类去重写父类的方法.

 

2. 子类可以重载父类的方法吗??


可以.

 














































































以上是关于Java初始化顺序的主要内容,如果未能解决你的问题,请参考以下文章

java初始化顺序

Java基础(Java类的初始化顺序)

jvm系列学习之--Java类的初始化顺序

Java类继承关系中的初始化顺序

Java类成员初始化顺序

java类的初始化顺序