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初始化顺序的主要内容,如果未能解决你的问题,请参考以下文章