黑马程序员技术交流社区

标题: static和final的区别 [打印本页]

作者: 柳雷    时间: 2012-7-24 09:17
标题: static和final的区别
本帖最后由 柳雷 于 2012-7-26 14:04 编辑

static作为静态变量,不应该是不能改变的吗?final修饰的变量是不能改变的,static修饰的方法可以重载,覆盖吗?final修饰的方法呢?
什么时候他们共同修饰一个变量,方法,修饰后的方法有什么特点呢?


作者: 孙建飞    时间: 2012-7-24 18:09
static作为静态变量,不应该是不能改变的吗?
答:static 修饰的变量可以修改,final修饰的变量不可修改  
final修饰的变量是不能改变的,static修饰的方法可以重载,覆盖吗?final修饰的方法呢?
答:,static修饰的方法可以被重载,不能覆盖,因为静态的成员(函数)在内存空间只有一份,所有不可以被覆盖.
final修饰的方法可以被重载,不能被覆盖,因为覆盖是用于父子类之间的。final修饰的方法在子类是不可见的,所以不能被覆盖
什么时候他们共同修饰一个变量,方法,修饰后的方法有什么特点呢
答:当一个变量是固定的值,并且不创建对象就想使用它的时候,例如: static final double pai = 3.14f;     这样使用pai很方便

public class Test{
     static int a = 1;
     final int b = 2;
     final  static c = 3;
   public void setA(){
       a = b;
    }
   public void setB(){
       b = c;           //因为b是由static修饰,所以b的值不能更改。
    }   
   public void setC(){
       c = 0;          //原因同上
    }
}

作者: 王志明    时间: 2012-7-24 20:13
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:
     Final StringBuffera=newStringBuffer("immutable");
执行如下语句将报告编译期错误:
     a=newStringBuffer("");
但是,执行如下语句则可以通过编译:
a.append(" broken!");
     有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:
public void method(final  StringBuffer  param)
{
}
     实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:
     param.append("a");

静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个staticVar变量,并且每创建一个实例对象,这个staticVar就会加1;但是,每创建一个实例对象,就会分配一个instanceVar,即可能分配多个instanceVar,并且每个instanceVar的值都只自加了1次。
public class VariantTest
{
public static int staticVar = 0;
public int instanceVar = 0;
public VariantTest()
{
staticVar++;
instanceVar++;
System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);
}
}

当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2