Java关键字final,static使用总结

一,final

在Java中,final关键字是”这是无法改变的”和”终态的“含义,它可以修饰非抽象类,非抽象类成员方法和变量。

        1,final类不能被继承,没有子类,类中方法是final的(太监类)。

        2,final方法不能被子类覆写,但可以被继承。

        3,final成员变量表示常量。只能被赋值一次,赋值后值不能改变。

        4,final不能用于修饰构造方法。

        注意:父类中的private成员方法是不能被子类方法覆写的,也不能不被继承。所以private成员方法默认是final类型的。

1,final类

        final类是不能被继承的,因此final类的成员方法不能被覆写,默认都是final的。在设计类的时候,如果这个类不需要有子类,类的实现细节不能被改变,并且这个类不会再被扩展,那就设计成final类。

2,final方法

        如果一个类不需要子类覆写其方法,则将方法定义成final类型方法。

        使用final方法的原因:

        (1)把方法锁定,组织任何继承类改变它的意义和实现。

        (2)高效,在遇到final方法的时候,会转入内嵌机制,大大提高效率。



package org.panda.Final;

class Test1							//创建类
{
	public void f1()				//新建方法
	{
		System.out.println("f1") ;
	}
	public final void f2()			//新建final方法,不能被覆写,但可以被继承
	{
		System.out.println("f2") ;
	}
	public void f3()
	{
		System.out.println("f3");
	}
	private void f4()
	{
		System.out.println("f4");
	}
}
public class FinalDemo01 extends Test1
{
	public void f1()				//覆写父类中一般方法
	{
		System.out.println("父类中一般方法被覆写");
	}
	public void f3()
	{
		System.out.println("f3");
	}
	
	public static void main(String[] args)
	{
		FinalDemo01 f = new FinalDemo01() ;//声明并实例化子类对象
		f.f1() ;							//因为子类覆写父类方法,所以调用子类中方法
		f.f2() ;							//调用从父类中继承的final方法
		f.f3() ;							//调用从父类中继承的方法					
		//f.f4() ;							//调用失败,无法从父类中继承获得。
	}
}
package org.panda.Final;

class Test1							//创建类
{
	public void f1()				//新建方法
	{
		System.out.println("f1") ;
	}
	public final void f2()			//新建final方法,不能被覆写,但可以被继承
	{
		System.out.println("f2") ;
	}
	public void f3()
	{
		System.out.println("f3");
	}
	private void f4()
	{
		System.out.println("f4");
	}
}
public class FinalDemo01 extends Test1
{
	public void f1()				//覆写父类中一般方法
	{
		System.out.println("父类中一般方法被覆写");
	}
	public void f3()
	{
		System.out.println("f3");
	}
	
	public static void main(String[] args)
	{
		FinalDemo01 f = new FinalDemo01() ;//声明并实例化子类对象
		f.f1() ;							//因为子类覆写父类方法,所以调用子类中方法
		f.f2() ;							//调用从父类中继承的final方法
		f.f3() ;							//调用从父类中继承的方法					
		//f.f4() ;							//调用失败,无法从父类中继承获得。
	}
}



 

3,final变量(常量)
        用final修饰的成员变量表示常量,值一旦改变不能更改变。修饰的变量要被初始化。

          final修饰的变量有三种,静态变量,实例变量和局部变量。分别表示三种类型的常量。

二,static关键字

         static表示“全局”或“静态”的意思。用来修饰成员变量和成员方法。也可以形成static静态代码块。在Java语言中没有全局变量的概念。

         static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接使用类名来访问。

         类名.静态变量名

         类名.静态方法名(参数类型,参数列表)

        用static修饰的代码块称为静态代码块,当JVM加载类时,就会执行该代码块。

1,static变量

        一种是被static修饰的变量,叫静态变量或类变量;另一中没有被static修饰的变量,叫实例变量。

2,static方法

      静态方法可以直接通过类名直接调用,任何的实例都可以调用。因此在静态方法中不能使用this和super关键字。不能直接访问所属类的实例变量和变量方法(就是不带static的的成员变量和成员方法),只能访问所属类的静态成员变量和成员方法。

三,static 和 final一起用表示什么?

         static final用来修饰成员变量和成员方法,可以简单理解为“全局常量”。

         对于变量,表示一旦给值就不能修改。并且可以通过类名直接调用。

         对于方法,表示不可覆盖,可以通过类名直接访问。



package org.panda.Final;

import java.util.ArrayList;

public class StaticFinalDemo01 
{
	private static final String strStaticFinalVar = "IronMan" ;	//定义属性用static final修饰
	private static String strStaticVar = "null" ;				//定义属性用static修饰
	private final String strFinalVar = "null" ;					//定义属性用final修饰
	private static final int intStaticFinalVar = 0 ;		//定义int属性用static final修饰
	private static final Integer integerStaticFinalVar = new Integer(8) ;				//定义容器
	private static final ArrayList<String> alStaticFinalVar = new ArrayList<String>() ;	//定义容器
			
	private void test()
	{
		System.out.println("--------------值处理前-------------");
		System.out.println("strStaticFinalVar:"+strStaticFinalVar);
		System.out.println("strStaticVar:"+strStaticVar);
		System.out.println("strFinalVar:"+strFinalVar);
		System.out.println("intStaticFinalVar:"+intStaticFinalVar);
		System.out.println("integerStaticFinalVar:"+integerStaticFinalVar);
		System.out.println("alStaticFinalVar:"+alStaticFinalVar);
		
		//strStaticFinalVar = "Hulk" ;				//错误,final表示终态,不能被改变
		strStaticVar = "Hello World" ;				//正确,static表示类变量,值可以改变
		//strFinalVar = "ByeBye World" ;				//错误,final表示终态,不能被改变
		//intStaticFinalVar = 1 ; 	 				//错误,final表示终态,不能被改变
		//integerStaticFinalVar = new Integer(8) ;	//错误,final表示终态,不能被改变
		alStaticFinalVar.add("aaa") ;				//正确,容器变量本身没有变化,但存放内容发生变化
		
		System.out.println("--------------值处理后-------------");
		System.out.println("strStaticFinalVar:"+strStaticFinalVar);
		System.out.println("strStaticVar:"+strStaticVar);
		System.out.println("strFinalVar:"+strFinalVar);
		System.out.println("intStaticFinalVar:"+intStaticFinalVar);
		System.out.println("integerStaticFinalVar:"+integerStaticFinalVar);
		System.out.println("alStaticFinalVar:"+alStaticFinalVar);
		
		
	}
	public static void main(String[] args)
	{
		new StaticFinalDemo01().test() ;
	}
}
package org.panda.Final;

import java.util.ArrayList;

public class StaticFinalDemo01 
{
	private static final String strStaticFinalVar = "IronMan" ;	//定义属性用static final修饰
	private static String strStaticVar = "null" ;				//定义属性用static修饰
	private final String strFinalVar = "null" ;					//定义属性用final修饰
	private static final int intStaticFinalVar = 0 ;		//定义int属性用static final修饰
	private static final Integer integerStaticFinalVar = new Integer(8) ;				//定义容器
	private static final ArrayList<String> alStaticFinalVar = new ArrayList<String>() ;	//定义容器
			
	private void test()
	{
		System.out.println("--------------值处理前-------------");
		System.out.println("strStaticFinalVar:"+strStaticFinalVar);
		System.out.println("strStaticVar:"+strStaticVar);
		System.out.println("strFinalVar:"+strFinalVar);
		System.out.println("intStaticFinalVar:"+intStaticFinalVar);
		System.out.println("integerStaticFinalVar:"+integerStaticFinalVar);
		System.out.println("alStaticFinalVar:"+alStaticFinalVar);
		
		//strStaticFinalVar = "Hulk" ;				//错误,final表示终态,不能被改变
		strStaticVar = "Hello World" ;				//正确,static表示类变量,值可以改变
		//strFinalVar = "ByeBye World" ;				//错误,final表示终态,不能被改变
		//intStaticFinalVar = 1 ; 	 				//错误,final表示终态,不能被改变
		//integerStaticFinalVar = new Integer(8) ;	//错误,final表示终态,不能被改变
		alStaticFinalVar.add("aaa") ;				//正确,容器变量本身没有变化,但存放内容发生变化
		
		System.out.println("--------------值处理后-------------");
		System.out.println("strStaticFinalVar:"+strStaticFinalVar);
		System.out.println("strStaticVar:"+strStaticVar);
		System.out.println("strFinalVar:"+strFinalVar);
		System.out.println("intStaticFinalVar:"+intStaticFinalVar);
		System.out.println("integerStaticFinalVar:"+integerStaticFinalVar);
		System.out.println("alStaticFinalVar:"+alStaticFinalVar);
		
		
	}
	public static void main(String[] args)
	{
		new StaticFinalDemo01().test() ;
	}
}