1、附录 A 外文翻译 原文部分 Everything Is an Object “If we spoke a different language, we would perceive a some what different world.” Ludwig Wittgenstein (1889-1951)Although it is based on C+, Java is more of a “pure” object-oriented language. Both C+ and Java are hybrid languages, but in Java the designers fel
2、t that the hybridization was not as important as it was in C+. A hybrid language allows multiple programming styles; the reason C+ is hybrid is to support backward compatibility with the C language. Because C+ is a superset of the C language, it includes many of that languages undesirable features,
3、which can make some aspects of C+ overly complicated. The Java language assumes that you want to do only object-oriented programming. This means that before you can begin you must shift your mindset into an object-oriented world (unless its already there). The benefit of this initial effort is the a
4、bility to program in a language that is simpler to learn and to use than many other OOP languages. In this chapter youll see the basic components of a Java program and learn that (almost) everything in Java is an object. You manipulate objects with references Each programming language has its own me
5、ans of manipulating elements in memory. Sometimes the programmer must be constantly aware of what type of manipulation is going on. Are you manipulating the element directly, or are you dealing with some kind of indirect representation (a pointer in C or C+) that must be treated with a special synta
6、x? All this is simplified in Java. You treat everything as an object, using a single consistent syntax. Although you treat everything as an object, the identifier you manipulate is actually a “reference” to an object. You might imagine a television (the object) and a remote control 1(the reference).
7、 As long as youre holding this reference, you have a connection to the television, but when someone says, “Change the channel” or “Lower the volume,” what youre manipulating is the reference, which in turn modifies the object. If you want to move aroundthe room and still control the television, you
8、take the remote/reference with you, not the television. Also, the remote control can stand on its own, with no television. That is, just because you have a reference doesnt mean theres necessarily an object connected to it. So if you want to hold a word or sentence, you create a String reference: Bu
9、t here youve created only the reference, not an object. If you decided to send a message to s at this point, youll get an error because s isnt actually attached to anything (theres no television). A safer practice, then, is always to initialize a reference when you create it:String s = asdf;However,
10、 this uses a special Java feature: Strings can be initialized with quoted text. Normally, you must use a more general type of initialization for objects. Where storage lives Its useful to visualize some aspects of how things are laid out while the program is runningin particular how memory is arrang
11、ed. There are five different places to store data: 1. Registers. This is the fastest storage because it exists in a place different from that of other storage: inside the processor. However, the number of registers is severely limited, so registers are allocated as they are needed. You dont have dir
12、ect control, nor do you see any evidence in your programs that registers even exist (C & C+, on the other hand, allow you to suggest register allocation to the compiler). 2. The stack. This lives in the general random-access memory (RAM) area, but has direct support from the processor via its stack
13、pointer. The stack pointer is moved down to create new memory and moved up to release that memory. This is an extremely fast and efficient way to allocate storage, second only to registers. The Java system must know, while it is creating the program, the exact lifetime of all the items that are stor
14、ed on the stack. This constraint places limits on the flexibility of your programs, so while some Java storage exists on the stackin particular, object referencesJava objects themselves are not placed on the stack. Special case: primitive types One group of types, which youll use quite often in your
15、 programming, gets special treatment. You can think of these as “primitive” types. The reason for the special treatment is that to create an object with newespecially a small, simple variableisnt very efficient, because new places objects on the heap. For these types Java falls back on the approach
16、taken by C and C+. That is, instead of creating the variable by using new, an “automatic” variable is created that is not a reference. The variable holds the value directly, and its placed on the stack, so its much more efficient. Java determines the size of each primitive type. These sizes dont cha
17、nge from one machine architecture to another as they do in most languages. This size invariance is one reason Java programs are more portable than programs in most other languages.All numeric types are signed, so dont look for unsigned types.The size of the boolean type is not explicitly specified;
18、it is only defined to be able to take the literal values true or false.The “wrapper” classes for the primitive data types allow you to make a non-primitive object on the heap to represent that primitive type. For example: char c = x; Character ch = new Character(c); Or you could also use: Character
19、ch = new Character(x); Java SE5 autoboxing will automatically convert from a primitive to a wrapper type: Character ch = x; and back:char c = ch; The reasons for wrapping primitives will be shown in a later chapter. High-precision numbers Java includes two classes for performing high-precision arith
20、metic: BigInteger and BigDecimal. Although these approximately fit into the same category as the “wrapper” classes, neither one has a primitive analogue.Both classes have methods that provide analogues for the operations that you perform on primitive types. That is, you can do anything with a BigInt
21、eger or BigDecimal that you can with an int or float, its just that you must use method calls instead of operators. Also, since theres more involved, the operations will be slower. Youre exchanging speed for accuracy. BigInteger supports arbitrary-precision integers. This means that you can accurate
22、ly represent integral values of any size without losing any information during operations. BigDecimal is for arbitrary-precision fixed-point numbers; you can use these for accurate monetary calculations, for example. Consult the JDK documentation for details about the constructors and methods you ca
23、n call for these two classes. You never need todestroy an object In most programming languages, the concept of the lifetime of a variable occupies a significant portion of the programming effort. How long does the variable last? If you are supposed to destroy it, when should you? Confusion over variable lifetimes can lead to a lot of bugs, and this section shows how Java greatly simplifies the issue by doing all the cleanup work for you.