static与final的区别
一 static:
1:static表示静态或全局变量,可以修饰属性,方法,代码块。被所有类共享,可以通过类名调用
A a; a.test();,也可以通过创建对象调用A a = new A();a.test();
2 static变量:被static修饰的是类变量或静态变量,没有被static修饰的是实列变量。类中的实例变量是在创建对象时被初始化的,而类变量是在类加载时被创建并进行初始化,类变量只会被创建一次,内存中只有一个内变量,所有类都能共享到,static变量可以修改。
/*类的加载是把类的.class文件调入虚拟机,而实例必须是在类加载之后才可以实例化/
3 static方法:静态方法可以通过类名进行调用,任何实列对象也可以调用因此不能有this,和super关键字,不能访问类的实例变量和实例方法,只能访问静态变量和静态方法。
父子类中:静态方法覆盖静态方法,非静态方法覆盖非静态方法
java的main方法之所以写成static是因为类加载时无法创建对象,静态方法不用通过对象调用,main方法所在类通过main方法入口来运行程序。
4 static代码块:静态代码块,可以有多个,位置可以随便放,不在任何方法体内,JVM加载类时会执行静态代码块,按照先后顺序被执行一次。
当子类继承一个父类时,并创建对象:jvm会先加载类,执行父类的静态代码块——执行子类的静态代码块——在调用new实例后会先调用父类构造函数——调用子类构造函数
二 final:
表示常量,一旦创建就不可以修改的量,可以修饰属性,方法,类。final标记的局部变量为常量,final标记的成员变量在声明时必须赋值或者在构造函数赋值,才能使用。final方法不能被重写,final类不能被继承,final类中方法默认final类型。final不能用于修饰构造方法。Java中的String,Math是final类型,因为String底层的char数组是final类型,不能被修改。
1 final修饰变量:常量,应当大写,一旦赋值不能改变,final没有初始值,在直接初始化时final与static一起。
2 final方法:不能被子类重写
3final修饰类:不能被继承,final类中方法也是final的,父类private方法不能被子类覆盖,所以private默认final类型