JAVA final

final定义的变量可以看做一个常量,不能被改变;

  final定义的方法不能被覆盖;

  final定义的类不能被继承。

  final static 就是再加上static的特性就可以了

final:

  final可修饰类、域(变量和常量)、方法   (而static不修饰类)

  1、final修饰类,表示该类不可被继承。

  如定义了一个final类:

1
2
3
4
5
6
7
8
9
10
11
12
13
final    class    SnowBird{
int    i;
String   s;
static    void    fly(){
System.out.println( "snowbird   is   flying" );
}
}
//现在定义一个类,试图继承SnowBird类:
public    class    Bird    extends    SnowBird{
public    static    void    main(String[]   args){
SnowBird.fly();
}
}


  把上面的两个类拷贝到文件中,文件名保存为Bird.java   ,现在编译看看会出现什么问题?

  出错信息是:cannot   inherit   from   final   SnowBird

  表明final   类不可被继承。

  那么,final修饰变量是怎么样呢?

  2、final修饰变量

  程序中经常需要定义各种类型的常量,如:3.24268,"201"等等。这时候我们就用final来修饰一个类似于标志符名字。如:

  final   String   connectNumber   =   "201";

  final表明   connectNumber是一个常量,它的取值在整个过程都不会改变。

  如果把final   去掉则connectNumber就成为变量了。

  有时我们为了节省空间,常量通常声明为   static   .因为如上所说的   static   用的是类的内存空间。

  3、修饰方法:

  final修饰的方法,称为最终方法。最终方法不可被子类重新定义,即不可被覆盖。

  如父类定义了public   void   fly(){   ....}

  则子类就不能定义

  public   void   fly(){。。。。。。}

  但注意覆盖与重载的区别。不能被覆盖并不是不能被重载,如你还可以定义

  public   void   fly(int   i){.....},

  举个例子如下:

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class    FinalValue   {
   static    final    int    i   =    1 ;
   final    void    fly(){
  System.out.println( "SnowBird   is   flying   over   FinalValue   " );
  }
  }
   class    TestFinal    extends    FinalValue   {
   int    i   =    2 ;
   void    fly(){
  System.out.println( "SnowBird   is   flying   over   TestFinal" );
  System.out.println( "In   class   FinalValue   static   Final   i   =   " +   FinalValue.i);
  System.out.println( "In   class   TestFinal   i   =   " +   i);
  }
   void    fly(String   s){
  System.out.println( "fly(" +   s   +    ")" );
  }
  }
   public    class    Test   {
   public    static    void    main(String   args[]){
  TestFinal   tf   =    new    TestFinal();
  tf.fly();
  tf.fly( "ok" );
  System.out.println(tf.i);
  }
  }


  把上面的程序保存为Test.java编译看看,出现什么错误?

  然后,把TestFinal类中的   void   fly(){   ...   }   注解掉

  即   如下

  

1
2
3
4
5
/*   void   fly(){
  System.out.println("SnowBird   is   flying   over   TestFinal");
  System.out.println("In   class   FinalValue   static   Final   i   =   "+   FinalValue.i);
  System.out.println("In   class   TestFinal   i   =   "+   i);
  }*/


  现在再编译看看通过了吗?   可见重载与覆盖的区别了吧。   还发现   FinalValue中的   i   与   TestFinal中的   i   没关系   。因为对于变量而言,重定义只是父类的同名域被隐藏了而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值