Java中final和static的区别

1.final和static变量:

  1.1. final只能在类中定义时或者在构造器中进行初始化,且只能使用一种方法,属于对象。不同对象可以有不同的值,一旦赋值之后则不允许修改。  static可在类中定义、构造器、或者通过类名.变量名(对象.变量名)的方式赋值,即可以修改,但修改后所有对象对应的该变量值均相等。二者都在静态存储区。

final修饰的类属性(Field)、实例属性、局部属性能指定初始值的地方:

1)类属性:必须在类的静态初始化块或声明该属性时指定初始值。

2)实例属性:必须在非静态初始化块、声明该属性或构造器中指定初始值。

3)局部属性:局部变量中的属性必须由程序员显示初始化,形参中的final属性不能修改其值。

1.2. 当final修饰引用类型变量时,该引用的对象所引用的地址不可变,即一直指向同一个对象,但该对象中的属性内容可以改变。

static只能修饰类属性或方法。

1.3. 可执行“宏替换”的final变量

条件:1)使用final修饰

           2)在定义时指定了初始值。

           3)该初始值在编译时就可确定下来。

例如:1)在方法中定义

          final int a=5;//即可作为宏替换使用。

          2)若被赋值的表达式只是基本算术表达式或者字符串连接,没有访问普通变量或者调用方法,则同样可作为宏替换使用。如:

          final string s1="zhang"+88;//可直接将s1认为是“zhang88”,即s1=="zhang88";

          final string s2="zhang"+String.valueOf(88);//调用了String的valueOf()方法,不能将s2作为宏替换。若使用==,则时s2!="zhang88"。

2.方法:

  fianl:不允许其子类覆盖该方法。

  static:只能访问所属类的static成员变量和成员方法以及一些基本数据类型变量。private成员都隐式地指定为final,即不让子类访问。

3.修饰类时:

  final:说明不能定义该类的子类。因为此时默认的成员方法全为final

  static:不能修饰外部类,但可以定义静态内部类,可以把一个类隐藏在另一个类的内部,以便取消赋值时产生的引用。

4.什么时候定义静态函数/静态变量?

  当对象中出现共享数据时,该数据被静态所修饰。(对象中的特有数据要定义成非静态存在于堆内存中)

  当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义为静态的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值