static与final的区别

原创 2016年08月30日 21:46:06

final定义的变量可以看做一个常量,不能被改变;
final定义的方法不能被覆盖;
final定义的类不能被继承。
final static 就是再加上static的特性就可以了

static 和final是没有直接关系的

static 是在内存中分配一块区域,供整个类通用,所有的类的对象都享有它的共同的值

static 和final的区别
一、static :
什么情况下我们要使用static呢?
1、只想用一个存储区域来保存一个特定的数据——无论要创建多少个对象,甚至根本不创 建对象。
2、我们需要一个特殊的方法,它没有与这个类的任何对象关联。也就是说,即使没有创建对象,也需要一个能调用的方法。
为满足这两方面的要求,可使用static(静态)关键字。
下面我先举个例子:

一旦将什么东西设为static,数据或方法就不会同那个类的任何对象实例联系到一起。所以尽管从未创建那个类的一个对象,仍能调用一个static方法,或访问一些static数据。
为了将数据成员或方法设为static,只需在定义前置和这个关键字即可。
例如,下述代码能生成一个static数据成员,并对其初始化:

class StaticTest {
Static int i = 47;
}

现在,尽管我们制作了两个StaticTest对象,但它们仍然只占据StaticTest.i的一个存储空间。这两个对象都共享同样的i。请考察下述代码:
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
此时,无论st1.i还是st2.i都有同样的值47,因为它们引用的是同样的内存区域
有两个办法可引用一个static变量。正如上面展示的那样,可通过一个对象命名它,如st2.i。亦可直接用它的类名引用,而这在非静态成员里是行不通的(最好用这个办法引用static变量,因为它强调了那个变量的“静态”本质)。
StaticTest.i++;
其中,++运算符会使变量增值。此时,无论st1.i还是st2.i的值都是48。

类似的逻辑也适用于静态方法。既可象对其他任何方法那样通过一个对象引用静态方法,亦可用特殊的语法格式“类名.方法()”加以引用。静态方法的定义是类似的:
class StaticFun {
static void incr() { StaticTest.i++; }
}
从中可看出,StaticFun的方法incr()使静态数据i增值。可用典型的方法调用incr():

StaticFun sf = new StaticFun();
sf.incr();

或者,由于incr()是一种静态方法,所以可通过它的类直接调用:
StaticFun.incr();
对方法来说,static一项重要的用途就是帮助我们在不必创建对象的前提下调用那个方法。
举简单一例如下:
public class TestStatic {
public static void main(String args[]){
PhoneCard mycard_1 = new PhoneCard();//创建第一张卡对象
PhoneCard mycard_2 = new PhoneCard();//创建第二张卡对象

mycard_1.addFee = 0.8;//给第一张卡的附加费addFee赋值为0.8
//注意到我们没有给第二张卡赋值

System.out.println(“第一张卡的附加费:” + mycard_1.addFee);
System.out.println(“第二张卡的附加费:” + mycard_2.addFee);
//发现没有?输出结果中第二张卡的附加费也是0.8 了。
System.out.println(“卡的附加费:” + PhoneCard.addFee);
//该句的打印输出表明卡类的附加费都是0.8
}
}

class PhoneCard{
static double addFee;//静态域addFee
}

该例创建了两个类,PhoneCard类只定义了一个变量,TestStatic类里创建了两个PhoneCard类对象,并给其中的一个对象的附加费addFee赋值,而另一个对象没赋值。

由上例可以看出,静态域保存在类的公共存储单元,而不是保存在对象的存储单元内。

static 修饰方法时是同理。

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

1、final修饰类,表示该类不可被继承。
如定义了一个final类:
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){…..},

举个例子如下:

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(){ … } 注解掉
即 如下
/* 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);
}*/

版权声明:本文为博主原创文章,未经博主允许不得转载。

static与final的区别

一、staic static 表示静态或全局,它可以修饰属性,方法和代码块。由于静态属性和方法是属于该类的所有对象的,所以可以用类名.静态属性/方法名来访问。用static修饰的代码块表示静态代码块...
  • liang_70121385
  • liang_70121385
  • 2016年01月19日 13:09
  • 2872

java中final关键字的使用及static final 和final的区别

javastring优化 java中final关键字可以用在类成员(是不是所谓的域),类的方法及类中。 一、final用在域中表示: 1,一个永不改变的编译时常量。 2,一个在运行时被...
  • u013256831
  • u013256831
  • 2014年09月13日 16:53
  • 3480

final、static和abstract区别和使用

static 和final以及abstract的使用及区别
  • high2011
  • high2011
  • 2015年09月24日 17:03
  • 2804

类中static final域和final域的区别

简单来看,static final跟final的区别就是前者多了个static。static表示是静态的,static含有两个很关键的特点。一是static分配的存储空间不会变,而且static会在装...
  • luopeng123456789
  • luopeng123456789
  • 2014年05月28日 11:35
  • 1335

static、final、transient等关键字的作用

staticstatic表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块 被static修饰后的成员,在编译时由内存分配一块内存空间,直到程序停止运行才会释...
  • zhangfengzhang123
  • zhangfengzhang123
  • 2017年02月28日 17:11
  • 665

final、static、static final修饰引用类型时的区别

final、static、static final修饰引用类型时的区别
  • queenmary55
  • queenmary55
  • 2017年02月19日 16:38
  • 417

java基础学习(7)浅析final,private,public,protected,static等关键以及它们的区别的联系

1.首先来谈final,它一般有三种用法,下面来分别介绍,简单来说定义变量,包括静态的和非静态的,或是定义方法的参数; 定义方法; 定义类。1.1 定义变量包括静态的和非静态的变量。大家都知道用fin...
  • yywan1314520
  • yywan1314520
  • 2016年07月24日 10:34
  • 1346

接口中定义变量必须为public static final的原因

在interface里面的变量默认都是public static final 的。所以可以直接省略修饰符:  String param="ssm";//变量需要初始化  为什么接口...
  • a_long_
  • a_long_
  • 2016年06月21日 18:41
  • 3490

Java关键字final、static、abstract使用总结

一、final 根据程序上下文环境,Java关键字final有“无法改变”或者“终态”的含义,它可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,没有子类,final类中的方法默认...
  • u013842976
  • u013842976
  • 2016年05月10日 13:48
  • 1369

Static和Final的深度理解

在Java中,static和final是使用频率非常高的关键字,之前也简单地用过static和final,但是始终觉得没有从深层次上理解这两个关键字。本文将从class文件和类的初始化机制出发理解这两...
  • daoye2011
  • daoye2011
  • 2013年10月04日 14:22
  • 868
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:static与final的区别
举报原因:
原因补充:

(最多只允许输入30个字)