static,final的区别

 我来答
小孤阿9
2018-04-24 · TA获得超过2.8万个赞
知道小有建树答主
回答量:90
采纳率:100%
帮助的人:1.5万
展开全部

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); 

}*/

Storm代理
2023-07-25 广告
StormProxies是一家可靠的代理服务提供商,提供原生IP(住宅原生IP)和高匿名代理服务。以下是关于StormProxies的原生IP服务的一些信息:1. 住宅原生IP:StormProxies提供的住宅原生IP是指从真实的家庭或企... 点击进入详情页
本回答由Storm代理提供
Frankie_0616
2011-02-15 · TA获得超过146个赞
知道答主
回答量:17
采纳率:0%
帮助的人:0
展开全部
final被修饰的变量为常量一旦赋值不能修改,被修改的方法为最终方法不能被重写,被修饰的类是最终类,不能被继承
static被修饰的变量和方法,为该整个类及其类的对象所共享,一个类或对象修改了被定义的类或方法,其他的也会跟着变量。。这就是说被static修饰的是大家共用的。。
就一块肥皂多个人用,每个人用都会少而不是像不用static修饰的是每个人有每个人的肥皂,你用自己的和别人没有关系。。
祝你好运!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
2L水瓶
推荐于2017-10-10 · 超过29用户采纳过TA的回答
知道答主
回答量:50
采纳率:0%
帮助的人:34.7万
展开全部

如果你说的是java

final是常量,也就是不可以在运行期间更改

static变量一般都放在函数里,且该变量可以被任何其他的函数调用,比如说:

    

public class Stuff {
    public static String name = "I'm a static variable";
}

public class Application {
    
    public static void main(String[] args) {
        System.out.println(Stuff.name);
    }

}

其中很明显stuff是一个函数,但是我依旧可以在main里面调用这个变量,就是因为它是static

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友76cf9b1
推荐于2017-09-08 · TA获得超过177个赞
知道答主
回答量:69
采纳率:0%
帮助的人:95.9万
展开全部
在java里面:
static表示修饰的属性和方法是静态的,可以直接通过类名调用。
final表示修饰的属性和方法是不能被修改的,用于定义常量。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式