@ final , finalize,finally的异同
final:用来修饰类、方法和变量。修饰类时,这个类不能被继承,此类中的所有成员方法都被隐式的定义为final。修饰方法不能被重写,类的private方法会隐式的指定为final方法。修饰变量,是引用不变,但是引用的对象其内容可变,只能赋值一次。被final修饰的变量必须被初始化。
finally:是try语句的一个语句体,不能单独使用,用来释放资源。提供finally块来执行任何清除操作。
finally何时被调用。?
finalize:finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。finalize不一定被jvm调用,只有当垃圾回收器要清除垃圾时才被调用。
@ 父子类之间构造方法的调用机制?递归调用父类的构造方法?
创建子类时一直调用父类的构造方法,一直调用到object。
实例化一个类时,其父类也实例化,一直实例化到Object类。若代码中还加入代码块,代码块中,静态代码块最先执行且只执行一次,非静态代码块每次随着父类的构造之前执行一次。
当实例化子类时会递归调用父类中的构造方法
当new一个子类对象时,需要调用父类的构造方法,如果在子类中我们没有显示的调用父类的构造方法(没有写super函数),就会调用父类的无参构造方法,如果父类中没有这个无参的构造方法就会报错。
子类的构造方法总是先调用父类的构造方法,如果子类的构造方法没有显示的调用父类构造方法(没有super),就默认调用父类的无参的构造方法,若父类没有无参的构造方法,我们就需要显示(写上super)的调用父类的构造方法。
- 非静态语句块,在类每次使用new创建对象时都会被执行。
- 静态语句快在类的加载时就执行,且只执行一次。
- static{ } 静态语句块
结果 t1 2 1 5 \n t2 1 1 5
执行非静态语句块中的int i 和 test()函数中的int j 时,都是局部变量,对全局变量无影响。最后输出的 i , j , s 的值为全局变量的值。
静态语句块只能调用静态变量
static的方法只能调用static的方法和变量。
static语句块只能调用static变量。
@@ 【 扩展】
父子类中含有成员变量、静态成员变量、非静态语句块、构造方法,请问创建一个父类对象和一个子类对象时,他们的执行顺序是什么?
父类静态成员变量与父类静态代码块(谁在前先调用谁,顺序加载)
子类静态成员变量与子类静态代码块(顺序加载)
父类非静态成员变量、
父类非静态代码块、
父类构造函数
子类非静态成员变量
子类非静态代码块
子类构造函数
@ 算数运算符
整型做除法的结果仍是整型
i++,i-- 叫做表达式 有两种值:
- 整体表达式的值。
- 表达式中的变量自己的值。
整体表达式的值是先增+1,后增不+1,无论是先增还是后增,整体变量i的值总是+1的。
int k = i++ ; k=0, i=1
if (i++>5)
while(j--<3) j--的值与3比较
i-- ; if (i>3)
@关系比较运算符 > ,< ,== , >= , <= 运算结果是Boolean类型的
@ 如何不使用第三个临时变量,如何交换两个整型变量的值?
第一种方法:数值相加减
a = a + b;
b = a - b;
a = a - b;
第二种方法:位运算交换
a = a ^ b;
b = a ^ b;
a = a ^ b;
第三种方法:使用栈
int exchange(int x,int y)
{
stack S;
push(S,x);
push(S,y);
x=pop(S);
y=pop(S);
}
@计算机中的所有数(+,- , 0)都是以补码的形式存在的。位运算是在补码的基础上进行的
@原码、补码、反码
原码:负数最高位用1表示,正数用0表示
反码:正数反码是其本身,负数反码是符号位不变,数值为取反
补码:正数补码是其本身,负数补码是符号位不变,数值为取反+1
课后作业:
結果:t1: 2 1 6 \n t2: 1 1 6
执行顺序 | t1.i | t1.j | t1.s |
---|---|---|---|
初始化: | 0 | 0 | 0 |
1 | |||
0 | 1 | 2 | |
3 | |||
1 | 1 | 4 | |
2 | 1 | 5 | |
6 |
执行顺序 | t2.i | t2.j | t2.s |
---|---|---|---|
初始化: | 0 | 0 | 2 |
0 | 1 | 3 | |
1 | 1 | 6 |