From: mathew Date: 2005-07-23T15:31:00+09:00 Subject: Re: Ruby/Rails as a starter language? Karl von Laudermann wrote: >mathew wrote: >> In Java, the word "static" really means "global". A static method >> is a global function, and a static field is a global variable. Just >> remember to stick the class name in front when using them. > > Wrong. "static" does not mean "global" in Java, anymore than it does > in C. Java has no global variables in the sense that C does. Sure it does. Consider: Foo.java: public class Foo { static String name = "John"; } Bar.java: public class Bar { public static void main(String[] argv) { System.out.println(Foo.name); Foo.name = "Oops"; System.out.println(Foo.name); } } Foo.name is a variable with global visibility. Sure, it happens to have a '.' in its name, but if it looks like a duck, quacks like a duck... If it helps, rename the Foo class as Global. Same goes for methods. If I can call it from any piece of code in my program, without having to import it or declare it, then it's a global function. The fact that the name has a '.' in it doesn't change its visibility. > The accessibility of a static member depends on whether it is declared > as public, protected, package, or private, just like with non-static > members. I.e., you simply can't access a *private* static member from > anywhere outside the class it's declared in. Sure, you can override static with private. But that doesn't really change the fact that static fields have global visibility unless explicitly made private. >> Personally, I find the use of the word 'static' in Java to be confusing; >> after all, static fields aren't static (as per the usual dictionary >> definition) at all--their contents can be changed. > > > You're confusing "static" with "const" (in C; "final" in Java). That's exactly my point. It's a confusing use of words. >> It's also the exact >> opposite of C, where 'static' means 'local'. > > > > Wrong. In C, "static" does not mean "local" It means a piece of memory > allocated on the heap when the program loads, as opposed to being > allocated on the stack or dynamically. K&R, page 83, paragraph 1: "The static declaration, applied to an external variable or function, limits the scope of that object to the rest of the source file being compiled." Paragraph 4: "Normally, function names are global, visible to any part of the entire program. If a function is declared static, however, its name is invisible outside of the file in which it is declared." The implementation may or may not involve statically allocated memory, but the effect of the keyword, as described, is to limit scope of variables and functions. (I'm not even sure offhand how I would tell programmatically whether something was in dynamically or statically allocated memory.) Of course, it's possible that ANSI C has changed the language in this area; I don't have a copy of the full ANSI C specification to check. > In C, a local variable (declared in a function without the "static" > keyword) is allocated/deallocated on the stack on the fly as the > function is called and exits. You're eliding common implementation and the language itself. Sure, that's the reason why static originally restricted the scope of things which would otherwise be global; but that doesn't change the fact that in C, static makes file-local that which would otherwise be global. And that is why I find it a confusing choice of keyword for Java, where static things are not file-local, but are (unless modified by private) program-global. mathew -- WE HAVE TACOS