C++ 中static 和final的区别是什么
展开全部
static 是静态变量,它在编译时系统就分配内存,程序结束时才释放。
1、在类中,用static声明的成员变量为静态成员变量,它为该类的公用变量,在类加载的时候被创建并初始化(只被创建初始化一次),对于该类的所有对象来说,staitic成员变量只有一份。
2、用static声明的方法为静态方法,在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非静态的成员。
3、可以通过对象引用或类名访问静态成员。也就是说即可使用对象引用也可使用类名来访问静态的成员变量和成员方法。
final 是常量,不变的。
1、final的成员变量不能改变。
2、final的局部变量不能改变。(当是形参时:目的是当形参是引用型变量时,防止改变其引用型变量指向其他的对象)。
展开全部
C++貌似没有final哦,C++ Builder扩展支持__finally, 其实这个关键字也不太需要。
而在Java中关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。
final类不能被继承,没有子类,final类中的方法默认是final的。
final方法不能被子类的方法覆盖,但可以被继承。
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
final不能用于修饰构造方法。
而在C++中static被用来控制变量的存储方式和可见性。有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。其具体用法参见
http://baike.baidu.com/view/536145.htm
而在Java中关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。
final类不能被继承,没有子类,final类中的方法默认是final的。
final方法不能被子类的方法覆盖,但可以被继承。
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
final不能用于修饰构造方法。
而在C++中static被用来控制变量的存储方式和可见性。有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。其具体用法参见
http://baike.baidu.com/view/536145.htm
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.static修饰一个属性字段,那么这个属性字段将成为类本身的资源,public修饰为共有的,可以在类的外部通过test.a来访问此属性;在类内部任何地方可以使用.如果被修饰为private私有,那么只能在类内部使用.
public class Test{public static int a;private Test(){a=0;}}
如果属性被修饰为static静态类资源,那么这个字段永远只有一个,也就是说不管你new test()多少个类的对象,操作的永远都只是属于类的那一块内存资源.例如:
Test t1=new Test();t1.a=10;Test t2=new Test();System.out.println(t1.a);System.out.println(t2.a);System.out.println(Test.a);
结果是3个0
2.final 用于声明属性,方法和类,分别表示属性一旦被分配内存空间就必须初始化并且以后不可变,方法一旦定义必须有实现代码并且子类里不可被覆盖,类一旦定义不能被定义为抽象类或是接口,因为不可被继承。
而你的代码里对final修饰的属性进行了修改,所以错误.
3. 被final修饰而没有被static修饰的类的属性变量只能在两种情况下初始化:
a.在它被定义的时候,例:
public class Test{public final int a=0;private Test(){}}
b.在构造函数里初始化,例:
public class Test{public final int a;private Test(){a=0;}}
4.同时被final和static修饰的类的属性变量只能在两种情况下初始化:
a.在它被定义的时候,例:
public class Test{public final int a=0;private Test(){}}
b.在类的静态块里初始化,例:
public class Test{public final int a;static{a=0;}}
5.分析第三第四原因:
第三条:当这个属性被修饰为final,而非static的时候,它属于类的实例对象的资源,当类被加载进内存的时候这个属性并没有给其分配内存空间,而只是定义了一个变量a,只有当类被实例化的时候这个属性才被分配内存空间,而实例化的时候同时执行了构造函数,所以属性被初始化了,也就符合了当它被分配内存空间的时候就需要初始化,以后不再改变的条件.
第四条:当类的属性被同时被修饰为static和final的时候,他属于类的资源,那么就是类在被加载进内存的时候(也就是应用程序启动的时候)就要已经为此属性分配了内存,所以此时属性已经存在,它又被final修饰,所以必须在属性定义了以后就给其初始化值.而构造函数是在当类被实例化的时候才会执行,所以用构造函数,这时候这个属性没有被初始化.程序就会报错.而static块是类被加载的时候执行,且只执行这一次,所以在static块中可以被初始化
public class Test{public static int a;private Test(){a=0;}}
如果属性被修饰为static静态类资源,那么这个字段永远只有一个,也就是说不管你new test()多少个类的对象,操作的永远都只是属于类的那一块内存资源.例如:
Test t1=new Test();t1.a=10;Test t2=new Test();System.out.println(t1.a);System.out.println(t2.a);System.out.println(Test.a);
结果是3个0
2.final 用于声明属性,方法和类,分别表示属性一旦被分配内存空间就必须初始化并且以后不可变,方法一旦定义必须有实现代码并且子类里不可被覆盖,类一旦定义不能被定义为抽象类或是接口,因为不可被继承。
而你的代码里对final修饰的属性进行了修改,所以错误.
3. 被final修饰而没有被static修饰的类的属性变量只能在两种情况下初始化:
a.在它被定义的时候,例:
public class Test{public final int a=0;private Test(){}}
b.在构造函数里初始化,例:
public class Test{public final int a;private Test(){a=0;}}
4.同时被final和static修饰的类的属性变量只能在两种情况下初始化:
a.在它被定义的时候,例:
public class Test{public final int a=0;private Test(){}}
b.在类的静态块里初始化,例:
public class Test{public final int a;static{a=0;}}
5.分析第三第四原因:
第三条:当这个属性被修饰为final,而非static的时候,它属于类的实例对象的资源,当类被加载进内存的时候这个属性并没有给其分配内存空间,而只是定义了一个变量a,只有当类被实例化的时候这个属性才被分配内存空间,而实例化的时候同时执行了构造函数,所以属性被初始化了,也就符合了当它被分配内存空间的时候就需要初始化,以后不再改变的条件.
第四条:当类的属性被同时被修饰为static和final的时候,他属于类的资源,那么就是类在被加载进内存的时候(也就是应用程序启动的时候)就要已经为此属性分配了内存,所以此时属性已经存在,它又被final修饰,所以必须在属性定义了以后就给其初始化值.而构造函数是在当类被实例化的时候才会执行,所以用构造函数,这时候这个属性没有被初始化.程序就会报错.而static块是类被加载的时候执行,且只执行这一次,所以在static块中可以被初始化
参考资料: http://www.china-cto.cn/cu/74419s.html
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
static 是静态变量,注意变量这个词,它在编译时系统就分配内存,程序结束时才释放。
final 是常量,不变的。
final 是常量,不变的。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2010-09-24
展开全部
static是静态的意思,可以直接通过实例类访问
fina是最终,如果加上这个申明,变量和函数等将无法修
fina是最终,如果加上这个申明,变量和函数等将无法修
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询