Professional Documents
Culture Documents
class Car
{
String make;
String model;
int numDoors;
Car(String make, String model)
{
this(make, model, 4);
}
Car(String make, String model, int numDoors)
{
this.make = make;
this.model = model;
this.numDoors = numDoors;
}
void printDetails()
{
System.out.println("Make = "+make);
System.out.println("Model = "+model);
System.out.println("Number of doors = "+numDoors);
System.out.println();
}
public static void main(String[] args)
{
Car myCar = new Car("Toyota", "Camry");
myCar.printDetails();
Car yourCar = new Car("Mazda", "RX-8", 2);
yourCar.printDetails();
}
}
CHAPTER 2 DISCOVERING CLASSES AND OBJECTS
,ISTING DECLARES AN INSTANCE METHOD NAMED printDetails() "Y CONVENTION A METHODS NAME
BEGINS WITH A LOWERCASE LETTER AND THE FIRST LETTER OF EACH SUBSEQUENT WORD IN A MULTIWORD METHOD NAME
IS CAPITALIZED
-ETHODS ARE LIKE CONSTRUCTORS IN THAT THEY HAVE PARAMETER LISTS 9OU PASS ARGUMENTS TO THESE
PARAMETERS WHEN YOU CALL THE METHOD "ECAUSE printDetails() DOES NOT TAKE ARGUMENTS ITS PARAMETER
LIST IS EMPTY
■ Note A method’s name and the number, types, and order of its parameters are known as its signature.
7HEN A METHOD IS INVOKED THE CODE WITHIN ITS BODY IS EXECUTED )N THE CASE OF printDetails() THIS
METHODS BODY EXECUTES A SEQUENCE OF System.out.println() METHOD CALLS TO OUTPUT THE VALUES OF ITS
make model AND numDoors INSTANCE FIELDS
5NLIKE CONSTRUCTORS METHODS ARE DECLARED TO HAVE RETURN TYPES ! RETURN TYPE IDENTIFIES THE KIND OF
VALUES RETURNED BY THE METHOD EG int count() RETURNS BIT INTEGERS )F A METHOD DOES NOT RETURN A
VALUE AND printDetails() DOES NOT ITS RETURN TYPE IS REPLACED WITH KEYWORD void AS IN void
printDetails()
■ Note Constructors don’t have return types because they cannot return values. If a constructor could return an
arbitrary value, how would that value be returned? After all, the new operator returns a reference to an object, and
how could new also return a constructor value?
! METHOD IS INVOKED BY USING THE MEMBER ACCESS OPERATOR THE LEFT OPERAND SPECIFIES THE OBJECTS
REFERENCE AND THE RIGHT OPERAND SPECIFIES THE METHOD TO BE CALLED &OR EXAMPLE THE
myCar.printDetails() AND yourCar.printDetails() EXPRESSIONS INVOKE THE printDetails() INSTANCE
METHOD ON THE myCar AND yourCar OBJECTS
#OMPILE ,ISTING javac Car.java AND RUN THIS APPLICATION java Car 9OU SHOULD OBSERVE THE
FOLLOWING OUTPUT WHOSE DIFFERENT INSTANCE FIELD VALUES PROVE THAT printDetails() ASSOCIATES WITH AN
OBJECT
Make = Toyota
Model = Camry
Number of doors = 4
Make = Mazda
Model = RX-8
Number of doors = 2
7HEN AN INSTANCE METHOD IS INVOKED *AVA PASSES A HIDDEN ARGUMENT TO THE METHOD AS THE LEFTMOST
ARGUMENT IN A LIST OF ARGUMENTS 4HIS ARGUMENT IS THE REFERENCE TO THE OBJECT ON WHICH THE METHOD IS
INVOKED AND IS REPRESENTED AT THE SOURCE CODE LEVEL VIA RESERVED WORD this 9OU DONT NEED TO PREFIX AN
INSTANCE FIELD NAME WITH hthis.v FROM WITHIN THE METHOD WHENEVER YOU ATTEMPT TO ACCESS AN INSTANCE
FIELD NAME THAT ISNT ALSO THE NAME OF A PARAMETER BECAUSE hthis.v IS ASSUMED IN THIS SITUATION
CHAPTER 2 DISCOVERING CLASSES AND OBJECTS
METHOD-CALL STACK
Method invocations require a method-call stack (also known as a method-invocation stack) to keep track
of the statements to which execution must return. Think of the method-call stack as a simulation of a pile
of clean trays in a cafeteria—you pop (remove) the clean tray from the top of the pile and the dishwasher
will push (insert) the next clean tray onto the top of the pile.
When a method is invoked, the JVM pushes its arguments and the address of the first statement to
execute following the invoked method onto the method-call stack. The JVM also allocates stack space for
the method’s local variables. When the method returns, the JVM removes local variable space, pops the
address and arguments off the stack, and transfers execution to the statement at this address.
Listing 2-10. Implementing instance methods so that calls to these methods can be chained together
class SavingsAccount
{
int balance;
SavingsAccount deposit(int amount)
{
balance += amount;
return this;
}
SavingsAccount printBalance()
{
System.out.println(balance);
return this;
}
public static void main(String[] args)
{
new SavingsAccount().deposit(1000).printBalance();
}
}
,ISTING SHOWS THAT YOU MUST SPECIFY THE CLASSS NAME AS THE INSTANCE METHODS RETURN TYPE
%ACH OF deposit() AND printBalance() MUST SPECIFY SavingsAccount AS THE RETURN TYPE !LSO YOU MUST
SPECIFY return this; RETURN CURRENT OBJECTS REFERENCE AS THE LAST STATEMENT) DISCUSS THE RETURN
STATEMENT LATER
&OR EXAMPLE new SavingsAccount().deposit(1000).printBalance(); CREATES A SavingsAccount
OBJECT USES THE RETURNED SavingsAccount REFERENCE TO INVOKE SavingsAccountS deposit() INSTANCE
METHOD TO ADD ONE THOUSAND DOLLARS TO THE SAVINGS ACCOUNT )M IGNORING CENTS FOR CONVENIENCE AND
FINALLY USES deposit()S RETURNED SavingsAccount REFERENCE WHICH IS THE SAME SavingsAccount INSTANCE
TO INVOKE SavingsAccountS printBalance() INSTANCE METHOD TO OUTPUT THE ACCOUNT BALANCE
CHAPTER 2 DISCOVERING CLASSES AND OBJECTS
class Conversions
{
static double c2f(double degrees)
{
return degrees*9.0/5.0+32;
}
static double f2c(double degrees)
{
return (degrees-32)*5.0/9.0;
}
}
,ISTING S Conversions CLASS DECLARES c2f() AND f2c() METHODS FOR CONVERTING FROM DEGREES
#ELSIUS TO DEGREES &AHRENHEIT AND VICE VERSA AND RETURNING THE RESULTS OF THESE CONVERSIONS %ACH
method header METHOD SIGNATURE AND OTHER INFORMATION IS PREFIXED WITH KEYWORD static TO TURN THE
METHOD INTO A CLASS METHOD
4O EXECUTE A CLASS METHOD YOU TYPICALLY PREFIX ITS NAME WITH THE CLASS NAME &OR EXAMPLE YOU CAN
EXECUTE Conversions.c2f(100.0); TO FIND OUT THE &AHRENHEIT EQUIVALENT OF DEGREES #ELSIUS AND
Conversions.f2c(98.6); TO DISCOVER THE #ELSIUS EQUIVALENT OF THE NORMAL BODY TEMPERATURE 9OU DONT
NEED TO INSTANTIATE Conversions AND THEN CALL THESE METHODS VIA THAT INSTANCE ALTHOUGH YOU COULD DO SO
BUT THAT ISNT GOOD FORM
■ Note Every application has at least one class method. Specifically, an application must specify public static
void main(String[] args) to serve as the application’s entry point. The static reserved word makes this
method a class method. (I will explain reserved word public later in this chapter.)
"ECAUSE CLASS METHODS ARE NOT CALLED WITH A HIDDEN ARGUMENT THAT REFERS TO THE CURRENT OBJECT
c2f() f2c() AND main() CANNOT ACCESS AN OBJECTS INSTANCE FIELDS OR CALL ITS INSTANCE METHODS 4HESE
CLASS METHODS CAN ONLY ACCESS CLASS FIELDS AND CALL CLASS METHODS
CHAPTER 2 DISCOVERING CLASSES AND OBJECTS
CHAPTER 2 DISCOVERING CLASSES AND OBJECTS
Listing 2-12. Using the return statement to return prematurely from a method
class Employee
{
String name;
Employee(String name)
{
setName(name);
}
void setName(String name)
{
if (name == null)
{
System.out.println("name cannot be null");
return;
}
else
this.name = name;
}
public static void main(String[] args)
{
Employee john = new Employee(null);
}
}
,ISTING S Employee(String name) CONSTRUCTOR INVOKES THE setName() INSTANCE METHOD TO
INITIALIZE THE name INSTANCE FIELD 0ROVIDING A SEPARATE METHOD FOR THIS PURPOSE IS A GOOD IDEA BECAUSE IT
LETS YOU INITIALIZE THE INSTANCE FIELD AT CONSTRUCTION TIME AND ALSO AT A LATER TIME 0ERHAPS THE EMPLOYEE
CHANGES HIS OR HER NAME
■ Note When you invoke a class’s instance or class method from a constructor or method within the same class,
you specify only the method’s name. You don’t prefix the method invocation with the member access operator and
an object reference or class name.
setName() USES AN IF STATEMENT TO DETECT AN ATTEMPT TO ASSIGN A NULL REFERENCE TO THE name FIELD 7HEN
SUCH AN ATTEMPT IS DETECTED IT OUTPUTS THE hname cannot be nullv ERROR MESSAGE AND RETURNS
PREMATURELY FROM THE METHOD SO THAT THE NULL VALUE CANNOT BE ASSIGNED AND REPLACE A PREVIOUSLY
ASSIGNED NAME
■ Caution When using the return statement, you might run into a situation where the compiler reports an
“unreachable code” error message. It does so when it detects code that will never be executed and occupies
memory unnecessarily. One area where you might encounter this problem is the switch statement. For example,
CHAPTER 2 DISCOVERING CLASSES AND OBJECTS
suppose you specify case "-v": printUsageInstructions(); return; break; as part of this statement. The
compiler reports an error when it detects the break statement following the return statement because the break
statement is unreachable; it never can be executed.
4HE PREVIOUS FORM OF THE RETURN STATEMENT IS NOT LEGAL IN A METHOD THAT RETURNS A VALUE &OR SUCH
METHODS *AVA PROVIDES AN ALTERNATE VERSION OF RETURN THAT LETS THE METHOD RETURN A VALUE WHOSE TYPE
MUST MATCH THE METHODS RETURN TYPE 4HE FOLLOWING EXAMPLE DEMONSTRATES THIS VERSION
double divide(double dividend, double divisor)
{
if (divisor == 0.0)
{
System.out.println("cannot divide by zero");
return 0.0;
}
return dividend/divisor;
}
divide() USES AN IF STATEMENT TO DETECT AN ATTEMPT TO DIVIDE ITS FIRST ARGUMENT BY AND OUTPUTS AN
ERROR MESSAGE WHEN THIS ATTEMPT IS DETECTED &URTHERMORE IT RETURNS 0.0 TO SIGNIFY THIS ATTEMPT )F THERE
IS NO PROBLEM THE DIVISION IS PERFORMED AND THE RESULT IS RETURNED
■ Caution You cannot use this form of the return statement in a constructor because constructors do not have
return types.
CHAPTER 2 DISCOVERING CLASSES AND OBJECTS
!LTHOUGH THIS CODE ACCOMPLISHES ITS TASK VIA ITERATION factorial() COULD ALSO BE WRITTEN ACCORDING
TO THE FOLLOWING EXAMPLES RECURSIVE STYLE
int factorial(int n)
{
if (n == 1)
return 1; // base problem
else
return n*factorial(n-1);
}
4HE RECURSIVE APPROACH TAKES ADVANTAGE OF BEING ABLE TO EXPRESS A PROBLEM IN SIMPLER TERMS OF ITSELF
!CCORDING TO THIS EXAMPLE THE SIMPLEST PROBLEM WHICH IS ALSO KNOWN AS THE base problem IS
7HEN AN ARGUMENT GREATER THAN IS PASSED TO factorial() THIS METHOD BREAKS THE PROBLEM INTO A
SIMPLER PROBLEM BY CALLING ITSELF WITH THE NEXT SMALLER ARGUMENT VALUE %VENTUALLY THE BASE PROBLEM WILL
BE REACHED
&OR EXAMPLE CALLING factorial(4) RESULTS IN THE FOLLOWING STACK OF EXPRESSIONS
4*factorial(3)
3*factorial(2)
2*factorial(1)
4HIS LAST EXPRESSION IS AT THE TOP OF THE STACK 7HEN factorial(1) RETURNS THESE EXPRESSIONS ARE
EVALUATED AS THE STACK BEGINS TO UNWIND
• 2*factorial(1) NOW BECOMES
• 3*factorial(2) NOW BECOMES
• 4*factorial(3) NOW BECOMES
2ECURSION PROVIDES AN ELEGANT WAY TO EXPRESS MANY PROBLEMS !DDITIONAL EXAMPLES INCLUDE
SEARCHING TREE BASED DATA STRUCTURES FOR SPECIFIC VALUES AND IN A HIERARCHICAL FILE SYSTEM FINDING AND
OUTPUTTING THE NAMES OF ALL FILES THAT CONTAIN SPECIFIC TEXT
■ Caution Recursion consumes stack space, so make sure that your recursion eventually ends in a base problem;
otherwise, you will run out of stack space and your application will be forced to terminate.
Overloading Methods
*AVA LETS YOU INTRODUCE METHODS WITH THE SAME NAME BUT DIFFERENT PARAMETER LISTS INTO THE SAME CLASS
4HIS FEATURE IS KNOWN AS method overloading 7HEN THE COMPILER ENCOUNTERS A METHOD INVOCATION
EXPRESSION IT COMPARES THE CALLED METHODS ARGUMENTS LIST WITH EACH OVERLOADED METHODS PARAMETER
LIST AS IT LOOKS FOR THE CORRECT METHOD TO INVOKE
4WO SAME NAMED METHODS ARE OVERLOADED WHEN THEIR PARAMETER LISTS DIFFER IN NUMBER OR ORDER OF
PARAMETERS &OR EXAMPLE *AVAS String CLASS PROVIDES OVERLOADED public int indexOf(int ch) AND
public int indexOf(int ch, int fromIndex) METHODS 4HESE METHODS DIFFER IN PARAMETER COUNTS )
EXPLORE String IN #HAPTER
CHAPTER 2 DISCOVERING CLASSES AND OBJECTS
4WO SAME NAMED METHODS ARE OVERLOADED WHEN AT LEAST ONE PARAMETER DIFFERS IN TYPE &OR EXAMPLE
*AVAS java.lang.Math CLASS PROVIDES OVERLOADED public static double abs(double a) AND public
static int abs(int a) METHODS /NE METHODS PARAMETER IS A double THE OTHER METHODS PARAMETER IS
AN int ) EXPLORE Math IN #HAPTER
9OU CANNOT OVERLOAD A METHOD BY CHANGING ONLY THE RETURN TYPE &OR EXAMPLE double
sum(double... values) AND int sum(double... values) ARE NOT OVERLOADED 4HESE METHODS ARE NOT
OVERLOADED BECAUSE THE COMPILER DOES NOT HAVE ENOUGH INFORMATION TO CHOOSE WHICH METHOD TO CALL
WHEN IT ENCOUNTERS sum(1.0, 2.0) IN SOURCE CODE
■ Note Field access and method call rules are combined in expression System.out.println();, where the
leftmost member access operator accesses the out class field (of type java.io.PrintStream) in the
java.lang.System class, and where the rightmost member access operator calls this field’s println() method.
You’ll learn about PrintStream in Chapter 8 and System in Chapter 4.
CHAPTER 2 DISCOVERING CLASSES AND OBJECTS
(IDING )NFORMATION
%VERY CLASS X EXPOSES AN interface A PROTOCOL CONSISTING OF CONSTRUCTORS METHODS AND ;POSSIBLY= FIELDS
THAT ARE MADE AVAILABLE TO OBJECTS CREATED FROM OTHER CLASSES FOR USE IN CREATING AND COMMUNICATING WITH
XS OBJECTS
!N INTERFACE SERVES AS A ONE WAY CONTRACT BETWEEN A CLASS AND ITS clients WHICH ARE THE EXTERNAL
CONSTRUCTORS METHODS AND OTHER INITIALIZATION ORIENTED CLASS ENTITIES DISCUSSED LATER IN THIS CHAPTER
THAT COMMUNICATE WITH THE CLASSS INSTANCES BY CALLING CONSTRUCTORS AND METHODS AND BY ACCESSING
FIELDS TYPICALLY public static final FIELDS OR CONSTANTS 4HE CONTRACT IS SUCH THAT THE CLASS PROMISES TO
NOT CHANGE ITS INTERFACE WHICH WOULD BREAK CLIENTS THAT DEPEND UPON THE INTERFACE
X ALSO PROVIDES AN implementation THE CODE WITHIN EXPOSED METHODS ALONG WITH OPTIONAL HELPER
METHODS AND OPTIONAL SUPPORTING FIELDS THAT SHOULD NOT BE EXPOSED THAT CODIFIES THE INTERFACE Helper
methods ARE METHODS THAT ASSIST EXPOSED METHODS AND SHOULD NOT BE EXPOSED
7HEN DESIGNING A CLASS YOUR GOAL IS TO EXPOSE A USEFUL INTERFACE WHILE HIDING DETAILS OF THAT
INTERFACES IMPLEMENTATION 9OU HIDE THE IMPLEMENTATION TO PREVENT DEVELOPERS FROM ACCIDENTALLY
ACCESSING PARTS OF YOUR CLASS THAT DO NOT BELONG TO THE CLASSS INTERFACE SO THAT YOU ARE FREE TO CHANGE THE
IMPLEMENTATION WITHOUT BREAKING CLIENT CODE (IDING THE IMPLEMENTATION IS OFTEN REFERRED TO AS
information hiding &URTHERMORE MANY DEVELOPERS CONSIDER IMPLEMENTATION HIDING TO BE PART OF
ENCAPSULATION
*AVA SUPPORTS IMPLEMENTATION HIDING BY PROVIDING FOUR LEVELS OF ACCESS CONTROL WHERE THREE OF THESE
LEVELS ARE INDICATED VIA A RESERVED WORD 9OU CAN USE THE FOLLOWING ACCESS CONTROL LEVELS TO CONTROL ACCESS
TO FIELDS METHODS AND CONSTRUCTORS AND TWO OF THESE LEVELS TO CONTROL ACCESS TO CLASSES
• Public ! FIELD METHOD OR CONSTRUCTOR THAT IS DECLARED public IS ACCESSIBLE FROM
ANYWHERE #LASSES CAN BE DECLARED public AS WELL
• Protected ! FIELD METHOD OR CONSTRUCTOR THAT IS DECLARED protected IS ACCESSIBLE
FROM ALL CLASSES IN THE SAME PACKAGE AS THE MEMBERS CLASS AS WELL AS SUBCLASSES OF
THAT CLASS REGARDLESS OF PACKAGE ) WILL DISCUSS PACKAGES IN #HAPTER
• Private ! FIELD METHOD OR CONSTRUCTOR THAT IS DECLARED private CANNOT BE
ACCESSED FROM BEYOND THE CLASS IN WHICH IT IS DECLARED
• Package-private )N THE ABSENCE OF AN ACCESS CONTROL RESERVED WORD A FIELD
METHOD OR CONSTRUCTOR IS ONLY ACCESSIBLE TO CLASSES WITHIN THE SAME PACKAGE AS
THE MEMBERS CLASS 4HE SAME IS TRUE FOR NON public CLASSES 4HE ABSENCE OF
public protected OR private IMPLIES PACKAGE PRIVATE
■ Note A class that is declared public must be stored in a file with the same name. For example, a public Image
class must be stored in Image.java. A source file can declare one public class only.
9OU WILL OFTEN DECLARE YOUR CLASSS INSTANCE FIELDS TO BE private AND PROVIDE SPECIAL public INSTANCE
METHODS FOR SETTING AND GETTING THEIR VALUES "Y CONVENTION METHODS THAT SET FIELD VALUES HAVE NAMES
STARTING WITH set AND ARE KNOWN AS setters 3IMILARLY METHODS THAT GET FIELD VALUES HAVE NAMES WITH get
OR is FOR "OOLEAN FIELDS PREFIXES AND ARE KNOWN AS getters ,ISTING DEMONSTRATES THIS PATTERN IN THE
CONTEXT OF AN Employee CLASS DECLARATION
CHAPTER 2 DISCOVERING CLASSES AND OBJECTS
CHAPTER 2 DISCOVERING CLASSES AND OBJECTS
{
return getFirstName()+" "+getLastName();
}
public void setFirstName(String empFirstName)
{
firstName = empFirstName;
}
public String getFirstName()
{
return firstName;
}
public void setLastName(String empLastName)
{
lastName = empLastName;
}
public String getLastName()
{
return lastName;
}
}
,ISTING REVEALS THAT THE name FIELD HAS BEEN REMOVED IN FAVOR OF NEW firstName AND lastName
FIELDS WHICH WERE ADDED TO IMPROVE PERFORMANCE "ECAUSE setFirstName() AND setLastName() WILL BE
CALLED MORE FREQUENTLY THAN setName() AND BECAUSE getFirstName() AND getLastName() WILL BE CALLED
MORE FREQUENTLY THAN getName() IT IS MORE PERFORMANT IN EACH CASE TO HAVE THE FIRST TWO METHODS
SETGET firstNameS AND lastNameS VALUES RATHER THAN MERGING EITHER VALUE INTOEXTRACTING THIS VALUE
FROM nameS VALUE
,ISTING ALSO REVEALS setName() CALLING setFirstName() AND setLastName() AND getName() CALLING
getFirstName() AND getLastName() RATHER THAN DIRECTLY ACCESSING THE firstName AND lastName FIELDS
!LTHOUGH AVOIDING DIRECT ACCESS TO THESE FIELDS IS NOT NECESSARY IN THIS EXAMPLE IMAGINE ANOTHER
IMPLEMENTATION CHANGE THAT ADDS MORE CODE TO setFirstName() setLastName() getFirstName() AND
getLastName() NOT CALLING THESE METHODS WILL RESULT IN THE NEW CODE NOT EXECUTING
Client code CODE THAT INSTANTIATES AND USES A CLASS SUCH AS Employee WILL NOT BREAK WHEN EmployeeS
IMPLEMENTATION CHANGES FROM THAT SHOWN IN ,ISTING TO THAT SHOWN IN ,ISTING BECAUSE THE
ORIGINAL INTERFACE REMAINS INTACT ALTHOUGH THE INTERFACE HAS BEEN EXTENDED 4HIS LACK OF BREAKAGE RESULTS
FROM HIDING ,ISTING S IMPLEMENTATION ESPECIALLY THE name FIELD
■ Note setName() invokes the String class’s indexOf() and substring() methods. You’ll learn about these
and other String methods in Chapter 4.
*AVA PROVIDES A LITTLE KNOWN INFORMATION HIDING RELATED LANGUAGE FEATURE THAT LETS ONE OBJECT OR
CLASS METHODINITIALIZER ACCESS ANOTHER OBJECTS private FIELDS OR INVOKE ITS private METHODS ,ISTING
PROVIDES A DEMONSTRATION
CHAPTER 2 DISCOVERING CLASSES AND OBJECTS
class PrivateAccess
{
private int x;
PrivateAccess(int x)
{
this.x = x;
}
boolean equalTo(PrivateAccess pa)
{
return pa.x == x;
}
public static void main(String[] args)
{
PrivateAccess pa1 = new PrivateAccess(10);
PrivateAccess pa2 = new PrivateAccess(20);
PrivateAccess pa3 = new PrivateAccess(10);
System.out.println("pa1 equal to pa2: "+pa1.equalTo(pa2));
System.out.println("pa2 equal to pa3: "+pa2.equalTo(pa3));
System.out.println("pa1 equal to pa3: "+pa1.equalTo(pa3));
System.out.println(pa2.x);
}
}
,ISTING S PrivateAccess CLASS DECLARES A private int FIELD NAMED x )T ALSO DECLARES AN equalTo()
METHOD THAT TAKES A PrivateAccess ARGUMENT 4HE IDEA IS TO COMPARE THE ARGUMENT OBJECT WITH THE
CURRENT OBJECT TO DETERMINE IF THEY ARE EQUAL
4HE EQUALITY DETERMINATION IS MADE BY USING THE == OPERATOR TO COMPARE THE VALUE OF THE ARGUMENT
OBJECTS x INSTANCE FIELD WITH THE VALUE OF THE CURRENT OBJECTS x INSTANCE FIELD RETURNING "OOLEAN TRUE
WHEN THEY ARE THE SAME 7HAT MAY SEEM BAFFLING IS THAT *AVA LETS YOU SPECIFY pa.x TO ACCESS THE ARGUMENT
OBJECTS private INSTANCE FIELD !LSO main() IS ABLE TO DIRECTLY ACCESS x VIA THE pa2 OBJECT
) PREVIOUSLY PRESENTED *AVAS FOUR ACCESS CONTROL LEVELS AND PRESENTED THE FOLLOWING STATEMENT
REGARDING THE PRIVATE ACCESS CONTROL LEVEL h! FIELD METHOD OR CONSTRUCTOR THAT IS DECLARED private
CANNOT BE ACCESSED FROM BEYOND THE CLASS IN WHICH IT IS DECLAREDv 7HEN YOU CAREFULLY CONSIDER THIS
STATEMENT AND EXAMINE ,ISTING YOU WILL REALIZE THAT x IS NOT BEING ACCESSED FROM BEYOND THE
PrivateAccess CLASS IN WHICH IT IS DECLARED 4HEREFORE THE PRIVATE ACCESS CONTROL LEVEL IS NOT BEING
VIOLATED
4HE ONLY CODE THAT CAN ACCESS THIS private INSTANCE FIELD IS CODE LOCATED WITHIN THE PrivateAccess
CLASS )F YOU ATTEMPTED TO ACCESS x VIA A PrivateAccess OBJECT THAT WAS CREATED IN THE CONTEXT OF ANOTHER
CLASS THE COMPILER WOULD REPORT AN ERROR
"EING ABLE TO DIRECTLY ACCESS x FROM WITHIN PrivateAccess IS A PERFORMANCE ENHANCEMENT IT IS FASTER
TO DIRECTLY ACCESS THIS IMPLEMENTATION DETAIL THAN TO CALL A METHOD THAT RETURNS ITS VALUE
#OMPILE PrivateAccess.java javac PrivateAccess.java AND RUN THE APPLICATION java
PrivateAccess 9OU SHOULD OBSERVE THE FOLLOWING OUTPUT
pa1 equal to pa2: false
pa2 equal to pa3: false
pa1 equal to pa3: true
20