会在每一次创建对象时调用,构造代码块是先与构造方法执行的。
使用方法:直接在类中提供一个{}
在方法中提供一个{}
局部代码块可以提高栈内存的效率,可以提前释放局部的变量内存。
把原有类中的公共的代码抽取到一个新类中,原有类和新类使用extends关键字进行联系。新类称之为父类,原有类称之为子类,子类会继承父类所有的属性和方法。但是子类只能使用对子类可见的属性方法。
子类 extens父类
继承可以提高代码的复用率
java有多层继承,没有多继承
权限修饰符 | 本类 | 子类 | 同包类 | 其他类 |
---|---|---|---|---|
public | 可以 | 可以 | 可以 | 可以 |
protected | 可以 | 可以 | 可以 | 不可以 |
default | 可以 | 同包子类 | 可以 | 不可以 |
private | 可以 | 不可以 | 不可以 | 不可以 |
super关键字可以调用父类可见的方法和属性
当创建子类对象时,会默认去调用父类的构造方法
可能报错:Implicit super constructor 类名() is undefined. Must explicitly invoke another constructor注意有参和无参调用的方法。
super():调用父类的无参构造,super()代码必须放在方法的第一行
this():调用本类的构造方法,必须放在有效代码第一行
所以说super()和this()不能共存。
在父子类中出现了方法签名一致的非静态方法,就称之为重写(Override)
重要的“两小一大”原则
事物的多种形态
编译时多态:方法的重载
运行时的多态:方法的重写 向上造型
可以修饰变量、方法、代码块
静态变量:使用static修饰的变量,又称之为类变量。可以使用 类名.变量名 来调用静态变量。
静态变量是随着类的加载是加载到方法区的,是先于对象出现的,在方法区中会有一个默认值。不同的对象使用的静态变量是同一个。可以使用类名直接访问。
类是加载到方法区的
类是第一次使用时才加载
类只加载一次
静态变量不可以在构造方法中
使用static修饰的方法称之为静态方法。静态方法会随着类的加载而加载到方法区中,当静态方法被0调用时,区栈中执行。静态方法也是先于对象而存在的。可以使用 类名.静态方法名() 的形式调用。
静态方法中可以适应this/super吗? ----->不可以
静态方法中可以调用本类的非静态方法吗?----->不可以、在本类中调用demo()相当于this.demo,
因为静态方法中不可以使用this,所以静态方法不能调用非静态方法
静态方法可以被继承吗? ----->可以
静态方法可以被重写吗?------>不可以 如果父子类中出现了同名的静态方法,称之为隐藏(hide)。
如果父子类中有同名方法,要么都是静态(隐藏),要么都是非静态(重写)
因残也遵循“两等两小一大”原则
静态代码块:被static修饰的{}静态代码块随着类的加载而加载,会在加载类是调用。静态代码块在栈中执行的。
案例:统计当前类创建对象的个数。
静态代码块 构造代码块 构造方法执行顺序
父类静态——>子类静态——>父类非静态——>子类非静态
类加载的过程:
java通过编译生成class文件,经过类加载器将class文件加载成字节码文件区执行
加载:将字节码文件加载到内存中
校验:检查字节码的安全性
准备:会给静态变量开辟内存空间,并且设定一个标记值。标记值可能会被舍弃
解析:
初始化:开始执行静态代码块和静态变量赋值的代码。没有特定的顺序,那行代码在上就先执行
在标记值状态下,不能进行直接操作,但是可以执行引用操作。