In C we can write:
#define LOWER 0
And in Java we can write:
static int lower = 0;
Don't these statements have the same purpose of letting other methods use the variable lower?
他们完全不同。定义更像是 C 预处理器使用的复制粘贴。Static 是 Java 类的属性修饰符。静态属性可以在运行时更改。
#define
在 C 中导致文本替换。例如:
#define PI 3.14
...
a = PI * r * r; // becomes: a = 3.14 * r * r
现在,范围#define
远不止于此;它不仅限于变量(Java 中没有直接等价的东西)。当您有一个static
变量时,无法保证该变量不会改变,因此无法制作类似的“文本变电站”。但是,当您声明一个static final
变量并将其分配给编译时常量时,就有了这样的保证。所以:
public static final double PI = 3.14;
...
a = PI * r * r; // becomes: a = 3.14 * r * r, like in C
就像发生了什么一样#define
,静态最终常量在编译时被它们的实际值替换。从这个意义上说,静态最终常量类似于#define
常量。
定义预处理器非常适合命名常量,但它不提供 Java(或 C++)常量声明所允许的相同类型检查。作为 C 和 C++ 开发人员多年,我非常喜欢 C++(和 Java)提供的类型检查。让人联想到合同设计等。
但是 Perl、Python 和 Ruby 等提供“鸭子类型”的语言的灵活性以及对类型声明的不那么严格的方法也具有优点。严格的类型检查提供的哲学学科有其优点。但是当你只是试图声明一个(命名的)const(ant) 时,所有的严格性似乎都被夸大了。
所以,是的,#define 是拼写“常量”的一种方式。
#define PIE (3.142) //C preprocessor
float PIE_() { return 3.142; } //C also
const float PIE = 3.142; //C++ const
public static final float PIE = 3.142; //Java
PIE = 3.142 #Ruby makes variables with initial capital constant
PIE = 3.142 #Python doesn't really have constants
#Perl is harder, you really have a hard time defining constants
sub PIE { 3.142; }
但是请阅读有关在 Python 中创建变量常量的难度。 http://code.activestate.com/recipes/65207-constants-in-python/?in=user-97991
Java 定义的最大优点final int LOWER=0;
是 LOWER 始终是一个变量,并且对调试器是可见的。
在 C 中,定义的值被代码中的预编译器替换,并且常量名消失了。
从 C 到 C++ 的第一个建议是:“不要使用 #define”,尝试使用常量变量。'#define' 很难调试。
#define
是一个预处理器指令 - 您定义的值在编译之前被交换到代码中提到的任何地方。但是它有许多陷阱——就像任何全局变量一样,它可能与其他地方(除其他外)类似命名的变量发生冲突。
如果您想要一个常量,请const
改用。
静态的,没有。
最终,是的。
final int LOWER = 0;
一个final
变量只能初始化一次。
static
变量属于类,而不是实例。
然而
它们在功能上可能相似,但操作方式完全不同。
final 变量仍然是一个变量。C(++) 中的A#define
实际上在构建时被解释,并相应地修改二进制输出,导致 vales 在运行时成为常量。
#define
效率更高。
在#define lower 0
较低的不是一个变量。在编译时,lower
将被替换0
为在整个代码中使用的位置。
而static int lower = 0;
定义一个变量和实际的内存引用将在运行时完成以访问变量的值。加值可以在您的代码中更改。
为避免更改,您可以像这样定义它static final int lower = 0;
现在的编译器在优化方面做得非常好。所以在编译时只有这lower
将被替换为0
.
所以你只能“说”#define lower 0
在C中相当于static final int lower = 0;
但它们不一样。因为后者在优化阶段被替换了。如果优化关闭,它不会在编译时被替换。
我希望这有帮助。