OCP Oracle Certified Professional Java SE 17 Developer Study Guide. Jeanne Boyarsky
Читать онлайн книгу.if
Now that we know where the blocks are, we can look at the scope of each variable. hungry
and amountOfFood
are method parameters, so they are available for the entire method. This means their scope is lines 11 to 22. The variable roomInBelly
goes into scope on line 12 because that is where it is declared. It stays in scope for the rest of the method and goes out of scope on line 22. The variable timeToEat
goes into scope on line 14 where it is declared. It goes out of scope on line 20 where the if
block ends. Finally, the variable amountEaten
goes into scope on line 16 where it is declared. It goes out of scope on line 19 where the while
block ends.
You'll want to practice this skill a lot! Identifying blocks and variable scope needs to be second nature for the exam. The good news is that there are lots of code examples to practice on. You can look at any code example on any topic in this book and match up braces.
Applying Scope to Classes
All of that was for local variables. Luckily, the rule for instance variables is easier: they are available as soon as they are defined and last for the entire lifetime of the object itself. The rule for class, aka static
, variables is even easier: they go into scope when declared like the other variable types. However, they stay in scope for the entire life of the program.
Let's do one more example to make sure you have a handle on this. Again, try to figure out the type of the four variables and when they go into and out of scope.
1: public class Mouse { 2: final static int MAX_LENGTH = 5; 3: int length; 4: public void grow(int inches) { 5: if (length < MAX_LENGTH) { 6: int newSize = length + inches; 7: length = newSize; 8: } 9: } 10: }
In this class, we have one class variable, MAX_LENGTH
; one instance variable, length
; and two local variables, inches
and newSize
. The MAX_LENGTH
variable is a class variable because it has the static
keyword in its declaration. In this case, MAX_LENGTH
goes into scope on line 2 where it is declared. It stays in scope until the program ends.
Next, length
goes into scope on line 3 where it is declared. It stays in scope as long as this Mouse
object exists. inches
goes into scope where it is declared on line 4. It goes out of scope at the end of the method on line 9. newSize
goes into scope where it is declared on line 6. Since it is defined inside the if
statement block, it goes out of scope when that block ends on line 8.
Reviewing Scope
Got all that? Let's review the rules on scope:
Local variables: In scope from declaration to the end of the block
Method parameters: In scope for the duration of the method
Instance variables: In scope from declaration until the object is eligible for garbage collection
Class variables: In scope from declaration until the program ends
Not sure what garbage collection is? Relax: that's our next and final section for this chapter.
Destroying Objects
Now that we've played with our objects, it is time to put them away. Luckily, the JVM takes care of that for you. Java provides a garbage collector to automatically look for objects that aren't needed anymore.
Remember, your code isn't the only process running in your Java program. Java code exists inside of a JVM, which includes numerous processes independent from your application code. One of the most important of those is a built-in garbage collector.
All Java objects are stored in your program memory's heap. The heap, which is also referred to as the free store, represents a large pool of unused memory allocated to your Java application. If your program keeps instantiating objects and leaving them on the heap, eventually it will run out of memory and crash. Oh, no! Luckily, garbage collection solves this problem. In the following sections, we look at garbage collection.
Understanding Garbage Collection
Garbage collection refers to the process of automatically freeing memory on the heap by deleting objects that are no longer reachable in your program. There are many different algorithms for garbage collection, but you don't need to know any of them for the exam.
As a developer, the most interesting part of garbage collection is determining when the memory belonging to an object can be reclaimed. In Java and other languages, eligible for garbage collection refers to an object's state of no longer being accessible in a program and therefore able to be garbage collected.
Does this mean an object that's eligible for garbage collection will be immediately garbage collected? Definitely not. When the object actually is discarded is not under your control, but for the exam, you will need to know at any given moment which objects are eligible for garbage collection.
Think of garbage-collection eligibility like shipping a package. You can take an item, seal it in a labeled box, and put it in your mailbox. This is analogous to making an item eligible for garbage collection. When the mail carrier comes by to pick it up, though, is not in your control. For example, it may be a postal holiday, or there could be a severe weather event. You can even call the post office and ask them to come pick it up right away, but there's no way to guarantee when and if this will actually happen. Hopefully, they will come by before your mailbox fills with packages!
Java includes a built-in method to help support garbage collection where you can suggest that garbage collection run.
System.gc();
Just like the post office, Java is free to ignore you. This method is not guaranteed to do anything.
Tracing Eligibility
How does the JVM know when an object is eligible for garbage collection? The JVM waits patiently and monitors each object until it determines that the code no longer needs that memory. An object will remain on the heap until it is no longer reachable. An object is no longer reachable when one of two situations occurs:
The object no longer has any references pointing to it.
All references to the object have gone out of scope.
Objects vs. References
Do not confuse a reference with the object that it refers to; they are two different entities. The reference is a variable that has a name and can be used to access the contents of an object. A reference can be assigned to another reference, passed to a method, or returned from a method. All references are the same size, no matter what their type is.
An object sits on the heap and does not have a name. Therefore, you have no way to access an object except through a reference. Objects come in all different shapes and sizes and consume varying amounts of memory. An object cannot be assigned to another object, and an object cannot be passed to a method or returned from a method. It is the object that gets garbage collected, not its reference.
Realizing