- final
- final类不能被继承,没有子类,final类中的方法默认是final的
- final方法不能被子类的方法覆盖,但可以被继承【修补继承打破封锁规则】
- final成员变量表示常量,只能被赋值一次,赋值后不能再被改变
- final不能用于修饰构造方法
- private不能被子类方法覆盖,private类型的方法默认是final类型的
- static
成员变量与静态变量的区别:
名称 | 所属 | 内存位置 | 存在时间 | 消失时间 | 调用 |
---|---|---|---|---|---|
成员变量 | 实例对象 | 堆内存 | 对象new存在 | 对象被回收 | 对象调用 |
静态变量 | 类变量 | 方法区 | 类加载时存在 | 类消失 | 对象(共享)或类名 |
static代码块随着类加载而被执行,只执行一次(new 多个对象只执行一次),和主函数在同一个类中优先于主函数被执行。
执行顺序:静态代码块—>构造代码块—>构造函数(补充:之间区别)
class A{
public A(){
System.out.println("class A()");
}
final void print(){ // 继承的一个弊端--打破了方法的封装性--解决办法final
System.out.println("print");
}
}
class B extends A{
final int a = 10; // 最终变量必须初始化而且无法被改写
public B(){}
public B(int a){
System.out.println("class B()");
}
public B(String B){
System.out.println("class B(String)");
}
}
public class Test extends B{
static int B = 2 ;
static{
System.out.println("static block");
}
public Test(){
// 必须要写父类的无参构造--否则必须显示指明调用的父类那个构造方法
System.out.println("class Test()");
}
public Test(String A){
super(""); // 必须位于第一行 如果不写那么默认调用B()
System.out.println("class Test(String)");
}
public static void main(String[] args) {
Test test = new Test("") ;
test.print();
System.out.println(test.B); // 通过实例对象调用--共享变量
System.out.println(Test.B);
}
}
output~:
static block
class A()
class B(String)
class Test(String)
print
2
2