`

java中final方法

 
阅读更多

之所以要使用final方法,可能是出于对两方面理由的考虑。第一个是为方法“上锁”,防止任何继承类改变它的本来含义。设计程序时,若希望一个方法的行为在继承期间保持不变,而且不可被覆盖或改写,就可以采取这种做法。
采用final方法的第二个理由是程序执行的效率。将一个方法设成final后,编译器就可以把对那个方法的所有调用都置入“嵌入”调用里。

  final在Java中并不常用,然而它却为我们提供了诸如在C语言中定义常量的功能,不 仅如此,final还可以让你控制你的成员、方法或者是一个类是否可被覆写或继承等功能,这些特点使final在Java中拥有了一个不可或缺的地位,也 是学习Java时必须要知道和掌握的关键字之一。 final成员   当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变, 而对于对象变量来说其引用不可再变。其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中。这两个地方 只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。下面这段代码演示了这一点: import java.util.List; import java.util.ArrayList; import java.util.LinkedList; public class Bat{     final PI=3.14;          //在定义时便给址值     f

 

1.定义及编程技巧

/*

 * final方法是在派生类中不能被覆盖的方法,final类是不能被覆盖的类。一个类可以含有final方法

 * final类和final方法使用final声明

 * 技巧:final static 类型成员变量。static使得变量只存在一个拷贝。final使得它不能改变。

 * */

2.关于final成员赋值的讨论:

a.final 成员能且只能被初始化一次

b.final成员必须在声明时或者方法中被初始化,而不能在其它的地方被初始化。

eg:

 

package mypackage;

public final class FinallyTest

{

private final int params;

 

  public FinallyTest()

  {

  params=5;

  }

 public FinallyTest(int para)

  {

  params=para;

  }

  public static void main(String[] args)

  {

  FinallyTest ft=new FinallyTest(20);

  System.out.println(ft.params);

  }

}

eg2:

 

package mypackage;

public final class FinallyTest

{

private final int params;

  public FinallyTest()

  {

     this(10);

  }

  public FinallyTest(int para)

  {

  params=para;

   }

  public static void main(String[] args)

  {

  FinallyTest ft=new FinallyTest();

  System.out.println(ft.params);

  }

}

上面是两个final初始化的例子。下面我们看一下两种错误的例子

eg3

 

package mypackage;

public final class FinallyTest

{

private final int params=11;//此处已经赋值

  public FinallyTest()

  {

     this(10);

  }

  public FinallyTest(int para)

  {

  params=para;

  }

  public static void main(String[] args)

  {

  FinallyTest ft=new FinallyTest();

  System.out.println(ft.params);

  }

}

Error(18,3): variable params is declared final; cannot be assigned

eg4:

 

package mypackage;

public final class FinallyTest

{

private final int params;

  public FinallyTest()

  {

   this(10);

  }

  public FinallyTest(int para)

  {

 

this.setParams(para);//不能用函数给它赋值必须直接赋值
  }

 public void setParams(int b)

 {

 params=b;

 }

  public static void main(String[] args)

  {

  FinallyTest ft=new FinallyTest();

  System.out.println(ft.params);

  }

}

Error(22,2): variable params is declared final; cannot be assigned

eg5

package mypackage;

public final class FinallyTest

{

private final int params;

  public FinallyTest()

  {

   this(10);

  }

  public FinallyTest(int para)

  {

  }

  public static void main(String[] args)

  {

  FinallyTest ft=new FinallyTest();

  System.out.println(ft.params);

  }

}

Error(10,19): variable params might not have been initialized

3.几点说明:

在java中,普通变量系统是自动初始化的,数值变量自动初始化为0,其余类型变量自动初始化为空。但是final类型的变量必须显示初始化,且初始化的方法必须是在申明时或者在构造方法中直接赋值,而不能通过调用函数赋值。

关于构造方法重载的问题,如果程序中没有显示的说明构造方法,那么就有默认的构造方法。如果程序中显示的声明了构造方法,那么默认的构造方法就不再存在。

在本例中,给出了关于this的使用方法

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics