原来写过一篇static的总结但是有些理解不够到位,不够详细,所以特别在做一篇关键字final和static的总结。(本文部分内容摘自互联网)
package com.java.importantKey;
public class WithFinalClass {
public WithFinalClass() {
// TODO Auto-generated constructor stub
}
public final void f1() {
System.out.println("带final关键字的 方法!!");
}
public void f2() {
System.out.println("普通方法!!");
}
private static void f3() {// 该类的私有方法,其他任何类都不可见,无法覆盖,继承 只可以在该类内部调用
System.out.println("修饰符为final的方法!!");
}
}
package com.java.importantKey;
public class FinalTest extends WithFinalClass {
/**
* @param args
*/
public static void main(String[] args) {
WithFinalClass wf = new WithFinalClass();
WithFinalClass fn = new FinalTest();
fn.f2();
fn.f1();// 子类继承带final的该方法 调用父类的方法
// fn.f3();//无法调用 除非修改private的修饰
}
public void f2() {
System.out.println("我覆盖父类的方法f2!!");
}
// public void f1(){ java禁止覆盖
//
// System.out.println("我覆盖父类的方法!!");
// }
public void f3() {
System.out.println("我想覆盖父类的私有方法f3!");
}
}
运行结果:
我覆盖父类的方法f2!!
带final关键字的 方法!!
3、final变量(常量)
用final修饰的成员变量表示常量,值一旦给定就无法改变!
final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。
从下面的例子中可以看出,一旦给final变量初值后,值就不能再改变了。
另外,final变量定义的时候,可以先声明,而不给初值,这中变量也称为final空白,无论什么情况,编译器都确保空白final在使用之前必须被初始化。但是,final空白在final关键字final的使用上提供了更大的灵活性,为此,一个类中的final数据成员就可以实现依对象而有所不同,却有保持其恒定不变的特征。
package com.java.importantKey;
public class FinalNomalTest {
private final String S = "final实例变量,我跟这个类息息相关!";
private final int A = 77;
public final int B = 33;
public static final int C = 73;
private static final int D = 37;
public final int E; //final空白,必须在初始化对象的时候赋初值
public FinalNomalTest(int E) {
this.E=E;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
FinalNomalTest fi=new FinalNomalTest(3);
// fi.A=137; //出错,final变量的值一旦给定就无法改变
// fi.B=173;//出错,final变量的值一旦给定就无法改变
// fi.S="想改变我?没门!";//出错,final变量的值一旦给定就无法改变
// fi.E=337;//出错,final变量的值一旦给定就无法改变
//推荐直接用类.属性名 来直接调用静态常量 ,当然先实例化FinalNomalTest类,在调用也可,但是占用不必要的内存。
// FinalNomalTest.C=3377;//出错,final变量的值一旦给定就无法改变
// FinalNomalTest.D=7733;//出错,final变量的值一旦给定就无法改变
System.out.println(fi.A);
System.out.println(fi.B);
System.out.println(FinalNomalTest.C);
System.out.println(FinalNomalTest.D);
System.out.println(fi.E);
System.out.println(fi.S);
}
public void test2() {
final int a; //final空白,在需要的时候才赋值 不能添加权限修饰符 public protected 或者private 否则 需要马上赋值
final int b = 777; //局部常量--final用于局部变量的情形
final int c; //final空白,一直没有给赋值.
a = 3;
//a=7; 出错,已经给赋过值了.
//b=333; 出错,已经给赋过值了.
}
}
4、final参数
public final void FinalC(final int C){
// C=5;//出错, //C是final类型的,值不允许改变的.
}
public class FinalTest {
static final int[] arr={13,17};
public static void main(String[] args) {
for (int a : arr) {
System.out.println("修改之前:"+a); //打印出数组对象的所有值
}
System.out.println("---------------------------------------------------------");
arr[0]=7;
for (int a : arr) {
System.out.println("修改之后:"+a); //打印出数组对象的所有值
}
}
运行结果:
package com.java.importantKey;
public class StaticTest {
public StaticTest() {
System.out.println("我是构造函数");
}
public static void main(String[] args){
new StaticTest();
}
//静态代码块最先执行
static{
System.out.println("第一个!");
}
static{
System.out.println("第二个!");
}
static{
System.out.println("第三个!");
}
static{
System.out.println("第四个!");
}
static{
System.out.println("第五个!");
}
static{
System.out.println("第六个!");
}
}
运行结果:
第一个!
第二个!
第三个!
第四个!
第五个!
第六个!
我是构造函数
public class TestStaticFinal {
private static final String strStaticFinalVar = "aaa";
private static String strStaticVar = null;
private final String strFinalVar = null;
private static final int intStaticFinalVar = 0;
private static final Integer integerStaticFinalVar = new Integer(8);
private static final ArrayList alStaticFinalVar = new ArrayList();
private void test() {
System.out.println("-------------值处理前----------\r\n");
System.out.println("strStaticFinalVar=" + strStaticFinalVar + "\r\n");
System.out.println("strStaticVar=" + strStaticVar + "\r\n");
System.out.println("strFinalVar=" + strFinalVar + "\r\n");
System.out.println("intStaticFinalVar=" + intStaticFinalVar + "\r\n");
System.out.println("integerStaticFinalVar=" + integerStaticFinalVar + "\r\n");
System.out.println("alStaticFinalVar=" + alStaticFinalVar + "\r\n");
//strStaticFinalVar="哈哈哈哈"; //错误,final表示终态,不可以改变变量本身.
strStaticVar = "哈哈哈哈"; //正确,static表示类变量,值可以改变.
//strFinalVar="呵呵呵呵"; //错误, final表示终态,在定义的时候就要初值(哪怕给个null),一旦给定后就不可再更改。
//intStaticFinalVar=2; //错误, final表示终态,在定义的时候就要初值(哪怕给个null),一旦给定后就不可再更改。
//integerStaticFinalVar=new Integer(8); //错误, final表示终态,在定义的时候就要初值(哪怕给个null),一旦给定后就不可再更改。
alStaticFinalVar.add("aaa"); //正确,容器变量本身没有变化,但存放内容发生了变化。这个规则是非常常用的,有很多用途。
alStaticFinalVar.add("bbb"); //正确,容器变量本身没有变化,但存放内容发生了变化。这个规则是非常常用的,有很多用途。
System.out.println("-------------值处理后----------\r\n");
System.out.println("strStaticFinalVar=" + strStaticFinalVar + "\r\n");
System.out.println("strStaticVar=" + strStaticVar + "\r\n");
System.out.println("strFinalVar=" + strFinalVar + "\r\n");
System.out.println("intStaticFinalVar=" + intStaticFinalVar + "\r\n");
System.out.println("integerStaticFinalVar=" + integerStaticFinalVar + "\r\n");
System.out.println("alStaticFinalVar=" + alStaticFinalVar + "\r\n");
}
public static void main(String args[]) {
new TestStaticFinal().test();
}
}