重温 Thinking in Java - 1 Everything is an object

Everything in Java is an object.

You manipulate objects with references.

Although you treat everything as an object, the identifier you manipulate is actually a “reference” to an object.

That is, just because you have a reference doesn’t mean there’s necessarily an object connected to it.

You must create all the objects

When you create a reference, you want to connect it with a new object. You do so, in general, with the new operator. The keyword new says, “Make me a new one of these objects.”

Where storage lives


It's useful to visualize some aspects of how things are laid out while the program is running - in particular how memory is arranged. 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 serverly limited, so registers all allocated as they are needed. You don't have direct control, nor do you see and 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 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 register. The Java system must know, while it is creating the program, the exact lifetime of all the items that are stored on the stack. This constraint places limits on the flexibility of your programs, so while some Java storage exists on the stack – in particular, object references – Java objects themselves are not placed on the stack.

3. The heap. This is general-purpose pool of memory (also in the RAM area) where all Java objects live. The nice thing about the heap is that, unlike the stack, the compiler doesn’t need to know how long that storage must stay on the heap. Thus, there’s a great deal of flexibility in using storage on the heap. Whenever you need an object, you simply write the code to create it by using new, and the storage is allocated on the heap when that code is executed. Of course there’s a price you pay for this flexibility: It may take more time to allocate and clean up heap storage than stack storage (if you even could create objects on the stack in Java, as you can in C++).

4. Constant storage. Constant values are often placed directly in the program code, which is safe since they can never change. Sometimes constants are cordoned off by themselves so that they can be optionally placed in read-only memory (ROM), in embedded system.

5. Non-RAM storage. If data lives completely outside a program, it can exist while the program is not running, outside the control of the program. The two primary examples of this are streamed objects, in which objects are turned into streams of bytes, generally to be sent to another machine, and persistent objects, in which the objects are placed on disk so they will hold their state even when the program is terminated. The trick with these types of storage is turning the objects into something that can exist on the other medium, and yet can be resurrected into a regular RAM-based object when necessary. Java provides support for lightweight persistence, and mechanisms such as JDBC and Hibernate provide more sophisticated support for storing and retrieving object information in database.


Special case: primitive types

The variable holds the value directly, and it’s placed on the stack, so it’s much more efficient.
 

Primitive Type Size Minimum Maximum Wrapper type
boolean---Boolean
char16 bitsUnicode 0Unicode 2^16 -1Character
byte8 bits-128+127Byte
short16 bits-2^15+2^15 - 1Short
int32 bits-2^31+2^31 - 1Integer
long64 bits-2^63+2^63 - 1Long
float32 bitsIEEE754IEEE754Float
doulbe64 bitsIEEE754IEEE754Double
void---Void

 

All numberic types are signed.

 

The size of the boolean type is not explicitly specified; 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.

High-precision numbers
-    BigInteger
-    BigDecimal.

Arrays in Java

Using arrays in C and C++ is perilous because those arrays are only blocks of memory.

A Java array is guaranteed to be initialized and cannot be accessed outside of its range. The range checking comes at the price of having a small a amount of memory overhead on each array as well as verifying the index at run time.

You never need to destroy 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? Java does all the cleanup work for you.


Scoping

 

Most procedural languages the concept of scope. This determines both the visibility and lifetime of the names defined within that scope.

Scope is determined by the placement of curly braces {}.

Scope of objects

 

Java objects do not have the name lifetimes as primitives. When you create a Java object using new, it hangs around past the end of the scope. Thus if you use:

{
    String s = new String("This is a string");
}//End of scope

 the reference s vanisheds at the end of the scope. However, the String object that s was pointing to is still occupying memory.



Creating new data types: class

 

If everything is an object, what determines how a particular class of object looks and behaves?Put another way, what establishs the type of an object? The keyword class to mean "I'm about to tell you what a new tpe of object looks like."


Fields and methods

 

When you define a class, you can put two types of elements in your class:fields (sometimes called data members), and methods(sometimes called member functions). A field is an object of any type that you can talk to via its reference, or a primitive type.  If it is a reference to an object, you must initialize that reference to connect it to an actual object.

 

Each object keeps its own storage for its fields; ordinary fields are not shared among objects.


Default values for primitive members


When a primitive data type is a member of a class, it is guaranteed to get a default value if you do not initialize it:

Primitive type Default
booleanfalse
char'\u0000' (null)
byte(byte)0
short(short)0
int0
long0L
float0.0f
double0.0d

The default values are only what Java guarantees when the variable is used as a member of a class. This gurantee doesn't apply to local variables - those that are not fields of a class.


Methods, arguments, and return values

 

Methods in Java determine the messages an object can receive. The fundamental parts of a method are the name, the arguments, the return types, and the body.

ReturnType methodName(/* Argument list */){
    /* Method body */
}

 

The argument list

 

The method argument list specifies what information you pass into the mehtod.

 

Building a Java program


Name visibility

 

pacage (namespace)

 

Using other components

 

import


The static keyword

You don’t actually get an object until you create one using new, and at that point storage is allocated and methods become available.

There are two situations in which this approach is not sufficient. One is if you want to have only a single piece of storage for a particular field, regardless of how many objects of that class are created, or even if no objects are created. The other is if you need a method that isn’t associated with any particular object of this class. That is, you need a method that you can call even if no objects are created.

When you say something is static, it means that particular field or methods is not tied to any particular object instance of that class. So even if you ‘ve never created an object of that class you can call a static method or access a static field.


<EOA>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值