JAVA学习笔记3-----继承 实例化过程

is-a 的关系时用继承来表达的 
而has-a的关系是用组合来表达的

继承
java中支持单继承 不直接支持多继承 对c++中的多继承机制进行改良
单 一个子类只能有一个直接父类
多 若多个父类有相同成员 会产生调用不确定性
但经过改良 java中通过多实现的方式来体现

java支持多层(多重)继承 A继承B B继承C
源头就一个object主类
当要使用一个继承体系的时候
1 查看该体系中的顶层类 了解该体系的基本功能
2 创建体系中的最子类对象 完成功能的使用

 定义继承
 当类与类之间存在着所属关系的时候 即a类是b类的一种
 就可以a extends b
 本类成员和局部变量同名用 this区分
 当子父类中成员变量同名 用super区分父类

 this 代表一个本类对象的引用
 super 代表一个父类空间 因为 父类可没有new对象吧 

 new一个子类的时候若子类有继承关系 父类肯定也占有空间 类嘛都在代码区 
 new的时候针对同名变量 在同一块堆内存里分开存储

 子类对于父类私有的成员是被继承了 但若是直接super访问是绝对不行的 还是需要父类的函数
 封装后再对其进行访问 因为私有成员是不可以直接被访问的 

 子类成员函数覆盖成员函数注意
 1 子类权限必须要大于等于父类权限 
2 针对静态方法 静态只能覆盖静态 或被静态覆盖 必须子父均为静态

什么时候使用覆盖操作:
覆盖更类似于升级,,,,原来show函数只显示号码 以后还要显示图片等 
这样的话根本不用修改 而是用继承的方式用来扩展
1 当对一个类进行子类的扩展时 子类需要保留父类的功能声明
但是要定义子类中该功能的特有内容时 就使用覆盖操作完成

\
子父类构造函数
子类的构造函数中第一行有一个默认的隐式语句 super()调用了父类中的空参数的构造函数

所以子类构造对象时候 发现访问子类构造函数时父类也运行了
且还在第一行

如果父类中没有空类型的构造函数 如有int型的参数 那么创建子类对象必定报错 
还需要在第一行调用super(5) 这种 所以我们在写类的时候
一般多写构造函数 莫忘空类型构造函数

构造函数绝对不能覆盖
子类的实例化过程 子类中所有构造函数默认都会访问父类中的空参数构造函数
 
为什么子类实例化要访问父类构造
子类继承自父类 获取到了父类中的诸如属性的内容 所以
在继承父类内容之前 先看父类是如何对自己的内容进行初始化

所以子类构造对象时 必须访问父类中的构造函数
为了完成这个必须的 动作 就在子类的构造函数中加入了super()语句

如果父类中没有定义空参数构造语句 那么子类的构造函数必须用super明确调用
父类中哪个构造函数.
还有子类构造函数中如果使用this调用了本类构造函数时 那么super就没有了 因为super和this只能定义一行
所以只能有一个 但是可以保证的是 子类中肯定会有其他的构造函数访问父类的构造函数

类中有属性和方法 
在new一个对象执行时 还未调用构造函数完成之前 有一个默认初始化
比如类中变量 public int num=8; 默认初始化就是num=0
子类构造器先开始 后一定要让super()这个执行完 才能对子类构造函数执行
通过super初始化父类内容时 子类的成员变量并未显示初始化也就是变成8

一个对象的实例化过程
Person p = new Person()

1 JVM 会读取指定的路径下的person.class文件 并加载进内存
 并会先加载person的父类(有直接父类的话)
2 在堆内存中开辟空间 分配地址
3 并在对象空间中 对对象中的属性进行默认初始化
4 调用对应的构造函数进行初始化
5 在构造函数中 第一行会先调用父类构造函数进行初始化
6 父类初始化完毕后 再对子类的属性进行显示初始化
7 再进行子类构造函数中的特定初始化
8 初始化完成后 将地址值复制给引用变量 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值