黑马程序员技术交流社区
标题: 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 |