子类的实例化过程(继承中的构造关系)
带子父类关系的构造方法的执行:
特别注意
子类实例化不会创建父类的对象
子类中所有构造函数默认都会访问父类中无参构造方法,
子类构造方法的第一行默认都有一个super()语句
为了对父类的成员进行初始化
这样做的原因:
构造的作用就是对类中的成员初始化
子类会自动具备父类中的非私有数据,这些数据的初始化靠父类完成,所以会先调用父类
构造方法完成,子类无论是有参构造还是无参构造都会调用父类中的无参构造
注意:
如果父类中没有无参构造怎么办?
可以通过super(参数);去访问父类中的有参构造
可以通过this(参数);调用本类其他构造(不建议,子类总得保证至少有一个访问父类构造)
目的是因为这个构造可以访问父类的某个构造
子父类构造函数没有重写
因为构造方法不被执行
代码块的执行顺序
静态代码块
用static修饰的{}:
static{
//代码
}
程序一执行就需连接数据库
如果仅在一个类
静态代码块-->构造代码块--->构造方法
静态代码块仅执行一次,构造代码块和构造方法(调用的)每次创建每次创建对象都执行
如果是子父类关系的两个类中
父类的静态代码块--子类的静态代码块--父类构造代码块--父类的构造方法--子类构造代码块---子类构造方法
方法区:方法,静态区,常量池,代码区
子类使用父类私有成员的方式
方式1:子类通过父类的set方法提供公共访问可以给父类的成员变量赋值
方式2:通过子类调用父类的带参构造方法,并且构造方法里面对私有成员属性进行赋值
都体现了封装思想
提供了显示的构造方法后,默认的无参构造可以不给(只要用不到),但是建议给因为可能会遇到
final关键字
很多时候有些内容是不能让子类重写的,
针对这种情况,我们如果做一个标记,告诉别人这个不可以重写就可以
java提供了final关键字来标记
final关键字:可以修饰类,修饰成员变量和成员方法
修饰的类不能被继承(最底层的类):final class
修饰的成员变量,其实就是一个常量
常量:
字面值常量:
定义常量:
和定义的格式一样,加final修饰
修饰的成员方法,方法不能被重写
一旦修饰数据,其内容不会改变
对于基本数据类型 变量被固化
对于引用数据类型 地址值被固化(内容可以更改)
finally关键字
finalize()方法
串讲
好多的类拥有很多相同属性
继承
格式:class A extends B
好处:提高复用性 产生类之间的关系多态前提
特点(弊端):只支持单继承,避免多继承调用不明确;支持多重继承
体现:is a 的关系 (同时使用父类中的非私有成员,对象调用也可以)
注意:
不要为了使用功能而使用继承
变量查找顺寻
局部-成员-父类-报错
构造方法
父类super()或者父类(参数)(子类构造函数的第一行)
通过this()
方法
没有重写父类非私有就直接使用
重写
子父类权限:子类>=父类
父类中私有不能重写
静态只能被静态重写
final修饰的不能重写
代码块执行顺序问题
一个类
静态代码块--构造代码块--构造方法
子类使用父类私有成员的方式
子类使用父类的set方法
通过父类提供的带参的构造方法,并且构造方法
final关键字
一旦被初始化将不再发生改变
一旦修饰数据,其内容不会改变
对于基本数据类型 变量被固化
对于引用数据类型 地址值被固化(内容可以更改)
|