例如汽车Car有引擎Engine这样的关系
class Car{
private Engine engine;
}
前面提过初始化的几个步骤,这里引入了组合
基本数据类型会在加载完成之后置空(0或者0.0或者false等)
引用数据类型会在加载完成之后置为null
引用类型初始化的四种方式
class Demo{
private int i = 21;
}
class Demo{
private int i;
public Demo(){
i = 22;
}
}
class Demo{
private SomeThingBig someThingBig;
public void method(){
if(someThingBig==null){
someThingBig = new SomeThingBig();
//一些消耗资源的初始化操作
}
}
}
class Demo{
private int x;
{
x = 123;
}
}
例如红色Red是颜色Color的一种
class Red extends Color{
}
所以推荐将父类的属性设置为private,仅仅是父类自己可以访问。
将方法设置为public,那样所有人都可以访问
前一章提到过,如果出现了一个属性或者方法,仅仅是想给子类访问,那么就是设置成protected,注意protected同时兼具默认包访问权限。
编译器会自动在子类的构造器中调用父类的构造器(针对的是无参构造器)
如果想要调用有参构造器或者是父类仅仅有有参构造器,那么在子类构造器中必须手动调用父类的构造方法。
子类中如果想要获取父类的引用,可用super来实现。
执行类的清理顺序的时候,顺序要求与生成顺序相反
overload 如果发生在子类想要对父类的方法上
由于子类与父类在继承图上,父类位于上部,子类位于下部。
类的代码在初次使用的时候才会加载,通常指创建类的第一个对象的时候或者是访问类中static的属性或者方法的时候(构造方法是隐式static的)
package com.pikzas.thinkinjava.chapterseven;
public class Insect {
private int i = 9;
protected int j;
Insect(){
System.out.println("i = " + i +" , j = " + j);
j = 47;
}
private static int x1 = printInit("static Insect x1 init");
static int printInit(String s){
System.out.println(s);
return 99;
}
}
public class Bettle extends Insect {
private int k = printInit("None Static field init");
public Bettle(){
System.out.println("k = " + k );
System.out.println("j = " + j );
}
private static int x2 = printInit("static Bettle x2 init");
public static void main(String[] args) {
System.out.println("Bettle main method");
Bettle b = new Bettle();
}
}
运行bettle 中main的结果是:
static Insect x1 init
static Bettele x2 init
Bettle main method
i = 9 , j = 0
None Static field init
k = 99
j = 47
分析加载过程
例如发动汽车Car,实际执行者是Engine
class Car{
private Engine engine;
public void start(){
engine.start();
}
}
如果是基本数据类型,那么该变量的值就不会再变动了
如果是引用数据类型(包括数组),指的是该变量所指向的内存地址不会再变动,但是该对象内部属性还是可变的。
满足三点要求的变量可以成为编译期常量
java允许我们在声明一个变量为final的前提下但是不给定初始值,但是在使用前,必须要指定值,这样增加了灵活性,也就必然要使用到构造器初始化。
class Demo{
private int i;
public Demo(){
i = 1;
}
public Demo(int x){
i = x;
}
}
准确的说是加在方法上的参数列表的修饰符上,表明这个对象不能在方法中变动。否则会报错。
class Demo{
public void method(final int i){
i = 123; // 这里尝试修改i的值,会报错。
}
}
private修饰的方法隐式的包含了final的意思
表示该类不能被继承,其中的方法也不能被覆盖(都不能继承,咋覆盖),其中的属性依据需要,决定是否是final的。
原文:https://www.cnblogs.com/Pikzas/p/11247630.html