This book aims to help Java/J2EE practitioners prepare for job interviews by concisely summarizing core concepts and key areas. Over the author's career contracting for different organizations, he found it necessary to extensively prepare for interviews by reading many technical books and articles. This book collates that information to save time previously spent on preparation. The summarized content has helped the author progress his career through successful interviews, on-the-job performance, and contract negotiations. The book's goal is to similarly benefit others seeking to showcase their technical skills and knowledge for career advancement.
2. 1
Learn Java/J2EE core concepts and key areas
With
Java/J2EE Job Interview Companion
By
K.Arulkumaran
&
A.Sivayini
Technical Reviewers
Craig Malone
Stuart Watson
Arulazi Dhesiaseelan
Lara D’Albreo
Cover Design, Layout, & Editing
A.Sivayini
Acknowledgements
A. Sivayini
Mr. & Mrs. R. Kumaraswamipillai
3. 2
Java/J2EE
Job Interview Companion
Copy Right 2005-2007 ISBN 978-1-4116-6824-9
The author has made every effort in the preparation of this book to ensure the accuracy of the information. However,
information in this book is sold without warranty either expressed or implied. The author will not be held liable for any
damages caused or alleged to be caused either directly or indirectly by this book.
Please e-mail feedback & corrections (technical, grammatical and/or spelling) to
java-interview@hotmail.com
First Edition (220+ Q&A): Dec 2005
Second Edition (400+ Q&A): March 2007
4. 3
Outline
SECTION DESCRIPTION
What this book will do for you?
Motivation for this book
Key Areas index
SECTION 1 Interview questions and answers on:
Java
Fundamentals
Swing
Applet
Performance and Memory issues
Personal and Behavioral/Situational
Behaving right in an interview
Key Points
SECTION 2 Interview questions and answers on:
Enterprise Java
J2EE Overview
Servlet
JSP
JDBC / JTA
JNDI / LDAP
RMI
EJB
JMS
XML
SQL, Database, and O/R mapping
RUP & UML
Struts
Web and Application servers.
Best practices and performance considerations.
Testing and deployment.
Personal and Behavioral/Situational
Key Points
SECTION 3 Putting it all together section.
How would you go about…?
1. How would you go about documenting your Java/J2EE application?
2. How would you go about designing a Java/J2EE application?
3. How would you go about identifying performance problems and/or memory leaks in your Java
application?
4. How would you go about minimizing memory leaks in your Java/J2EE application?
5. How would you go about improving performance of your Java/J2EE application?
6. How would you go about identifying any potential thread-safety issues in your Java/J2EE
application?
7. How would you go about identifying any potential transactional issues in your Java/J2EE
5. 4
application?
8. How would you go about applying the Object Oriented (OO) design concepts in your Java/J2EE
application?
9. How would you go about applying the UML diagrams in your Java/J2EE project?
10. How would you go about describing the software development processes you are familiar with?
11. How would you go about applying the design patterns in your Java/J2EE application?
12. How would you go about designing a Web application where the business tier is on a separate
machine from the presentation tier. The business tier should talk to 2 different databases and your
design should point out the different design patterns?
13. How would you go about determining the enterprise security requirements for your Java/J2EE
application?
14. How would you go about describing the open source projects like JUnit (unit testing), Ant (build
tool), CVS (version control system) and log4J (logging tool) which are integral part of most
Java/J2EE projects?
15. How would you go about describing Service Oriented Architecture (SOA) and Web services?
SECTION 4 Emerging Technologies/Frameworks
Test Driven Development (TDD).
Aspect Oriented Programming (AOP).
Inversion of Control (IoC) (Also known as Dependency Injection).
Annotations or attributes based programming (xdoclet etc).
Spring framework.
Hibernate framework.
EJB 3.0.
JavaServer Faces (JSF) framework.
SECTION 5 Sample interview questions …
Java
Web Components
Enterprise
Design
General
GLOSSARY OF TERMS
RESOURCES
INDEX
6. 5
Table of contents
Outline_________________________________________________________________________________________ 3
Table of contents ________________________________________________________________________________ 5
What this book will do for you? ____________________________________________________________________ 7
Motivation for this book __________________________________________________________________________ 8
Key Areas Index ________________________________________________________________________________ 11
Java – Interview questions & answers _____________________________________________________________ 13
Java – Fundamentals _____________________________________________________________________________________ 14
Java – Swing ____________________________________________________________________________________________ 69
Java – Applet____________________________________________________________________________________________ 76
Java – Performance and Memory issues _____________________________________________________________________ 78
Java – Personal and Behavioral/Situational __________________________________________________________________ 83
Java – Behaving right in an interview________________________________________________________________________ 89
Java – Key Points ________________________________________________________________________________________ 91
Enterprise Java – Interview questions & answers ____________________________________________________ 94
Enterprise - J2EE Overview ________________________________________________________________________________ 95
Enterprise - Servlet ______________________________________________________________________________________ 108
Enterprise - JSP ________________________________________________________________________________________ 126
Enterprise – JDBC & JTA _________________________________________________________________________________ 145
Enterprise – JNDI & LDAP ________________________________________________________________________________ 155
Enterprise - RMI ________________________________________________________________________________________ 159
Enterprise – EJB 2.x _____________________________________________________________________________________ 163
Enterprise - JMS ________________________________________________________________________________________ 180
Enterprise - XML ________________________________________________________________________________________ 190
Enterprise – SQL, Database, and O/R mapping _______________________________________________________________ 197
Enterprise - RUP & UML __________________________________________________________________________________ 206
Enterprise - Struts_______________________________________________________________________________________ 214
Enterprise - Web and Application servers ___________________________________________________________________ 218
Enterprise - Best practices and performance considerations ___________________________________________________ 222
Enterprise – Logging, testing and deployment _______________________________________________________________ 225
Enterprise – Personal and Behavioral/Situational_____________________________________________________________ 228
Enterprise – Software development process _________________________________________________________________ 230
Enterprise – Key Points __________________________________________________________________________________ 233
How would you go about…?_____________________________________________________________________ 238
Q 01: How would you go about documenting your Java/J2EE application? FAQ ________________________________ 239
Q 02: How would you go about designing a Java/J2EE application? FAQ _____________________________________ 240
Q 03: How would you go about identifying performance and/or memory issues in your Java/J2EE application? FAQ _ 243
Q 04: How would you go about minimizing memory leaks in your Java/J2EE application? FAQ __________________ 244
Q 05: How would you go about improving performance in your Java/J2EE application? FAQ _____________________ 244
Q 06: How would you go about identifying any potential thread-safety issues in your Java/J2EE application? FAQ __ 245
Q 07: How would you go about identifying any potential transactional issues in your Java/J2EE application? FAQ __ 246
7. 6
Q 08: How would you go about applying the Object Oriented (OO) design concepts in your Java/J2EE application? FAQ
247
Q 09: How would you go about applying the UML diagrams in your Java/J2EE project? FAQ _____________________249
Q 10: How would you go about describing the software development processes you are familiar with? FAQ ________251
Q 11: How would you go about applying the design patterns in your Java/J2EE application? _____________________253
Q 12: How would you go about designing a Web application where the business tier is on a separate machine from the
presentation tier. The business tier should talk to 2 different databases and your design should point out the different
design patterns? FAQ ____________________________________________________________________________________286
Q 13: How would you go about determining the enterprise security requirements for your Java/J2EE application? ___287
Q 14: How would you go about describing the open source projects like JUnit (unit testing), Ant (build tool), CVS
(version control system) and log4J (logging tool) which are integral part of most Java/J2EE projects? ________________292
Q 15: How would you go about describing Service Oriented Architecture (SOA) and Web services? FAQ ___________299
Emerging Technologies/Frameworks… ____________________________________________________________311
Q 01: What is Test Driven Development (TDD)? FAQ _______________________________________________________312
Q 02: What is the point of Test Driven Development (TDD)? What do you think of TDD?__________________________313
Q 03: What is aspect oriented programming (AOP)? Do you have any experience with AOP? _____________________313
Q 04: What are the differences between OOP and AOP? ____________________________________________________317
Q 05: What are the benefits of AOP?_____________________________________________________________________317
Q 06: What is attribute or annotation oriented programming? FAQ ___________________________________________317
Q 07: What are the pros and cons of annotations over XML based deployment descriptors? FAQ _________________318
Q 08: What is XDoclet? ________________________________________________________________________________319
Q 09: What is inversion of control (IoC) (also known more specifically as dependency injection)? FAQ_____________319
Q 10: What are the different types of dependency injections? FAQ ___________________________________________321
Q 11: What are the benefits of IoC (aka Dependency Injection)? FAQ _________________________________________322
Q 12: What is the difference between a service locator pattern and an inversion of control pattern? _______________323
Q 13: Why dependency injection is more elegant than a JNDI lookup to decouple client and the service? ___________323
Q 14: Explain Object-to-Relational (O/R) mapping? ________________________________________________________323
Q 15: Give an overview of hibernate framework? FAQ ______________________________________________________324
Q 16: Explain some of the pitfalls of Hibernate and explain how to avoid them? Give some tips on Hibernate best
practices? FAQ _________________________________________________________________________________________333
Q 17: Give an overview of the Spring framework? What are the benefits of Spring framework? FAQ _______________334
Q 18: How would EJB 3.0 simplify your Java development compared to EJB 1.x, 2.x ? FAQ ______________________337
Q 19: Briefly explain key features of the JavaServer Faces (JSF) framework? __________________________________339
Q 20: How would the JSF framework compare with the Struts framework? How would a Spring MVC framework compare
with Struts framework?___________________________________________________________________________________341
Sample interview questions… ____________________________________________________________________344
Java___________________________________________________________________________________________________345
Web components________________________________________________________________________________________345
Enterprise ______________________________________________________________________________________________345
Design_________________________________________________________________________________________________347
General ________________________________________________________________________________________________347
GLOSSARY OF TERMS__________________________________________________________________________348
RESOURCES __________________________________________________________________________________350
INDEX ________________________________________________________________________________________352
8. 7
What this book will do for you?
Have you got the time to read 10 or more books and articles to add value prior to the interview? This book has been
written mainly from the perspective of Java/J2EE job seekers and interviewers. There are numerous books and articles
on the market covering specific topics like Java, J2EE, EJB, Design Patterns, ANT, CVS, Multi-Threading, Servlets, JSP,
emerging technologies like AOP (Aspect Oriented Programming), Test Driven Development (TDD), Dependency Injection
Dl (aka IoC – Inversion of Control) etc. But from an interview perspective it is not possible to brush up on all these books
where each book usually has from 300 pages to 600 pages. The basic purpose of this book is to cover all the core
concepts and key areas, which all Java/J2EE developers, designers and architects should be conversant with to perform
well in their current jobs and to launch a successful career by doing well at interviews. The interviewer can also use this
book to make sure that they hire the right candidate depending on their requirements. This book contains a wide range of
topics relating to Java/J2EE development in a concise manner supplemented with diagrams, tables, sample codes and
examples. This book is also appropriately categorized to enable you to choose the area of interest to you.
This book will assist all Java/J2EE practitioners to become better at what they do. Usually it takes years to understand all
the core concepts and key areas when you rely only on your work experience. The best way to fast track this is to read
appropriate technical information and proactively apply these in your work environment. It worked for me and hopefully it
will work for you as well. I was also at one stage undecided whether to name this book “Java/J2EE core concepts and
key areas” or “Java/J2EE Job Interview Companion”. The reason I chose “Java/J2EE Job Interview Companion” is
because the core concepts and key areas discussed in this book helped me to be successful in my interviews, helped me
to survive and succeed at my work regardless what my job (junior developer, senior developer, technical lead, designer,
contractor etc) was and also gave me thumbs up in code reviews. This book also has been set out as a handy reference
guide and a roadmap for building enterprise Java applications.
9. 8
Motivation for this book
I started using Java in 1999 when I was working as a junior developer. During those two years as a permanent employee,
I pro-actively spent many hours studying the core concepts behind Java/J2EE in addition to my hands on practical
experience. Two years later I decided to start contracting. Since I started contracting in 2001, my career had a much-
needed boost in terms of contract rates, job satisfaction, responsibility etc. I moved from one contract to another with a
view of expanding my skills and increasing my contract rates.
In the last 5 years of contracting, I have worked for 5 different organizations both medium and large on 8 different
projects. For each contract I held, on average I attended 6-8 interviews with different companies. In most cases multiple
job offers were made and consequently I was in a position to negotiate my contract rates and also to choose the job I
liked based on the type of project, type of organization, technology used, etc. I have also sat for around 10 technical tests
and a few preliminary phone interviews.
The success in the interviews did not come easily. I spent hours prior to each set of interviews wading through various
books and articles as a preparation. The motivation for this book was to collate all this information into a single book,
which will save me time prior to my interviews but also can benefit others in their interviews. What is in this book has
helped me to go from just a Java/J2EE job to a career in Java/J2EE in a short time. It has also given me the job
security that ‘I can find a contract/permanent job opportunity even in the difficult job market’.
I am not suggesting that every one should go contracting but by performing well at the interviews you can be in a position
to pick the permanent role you like and also be able to negotiate your salary package. Those of you who are already in
good jobs can impress your team leaders, solution designers and/or architects for a possible promotion by demonstrating
your understanding of the key areas discussed in this book. You can discuss with your senior team members about
performance issues, transactional issues, threading issues (concurrency issues) and memory issues. In most of
my previous contracts I was in a position to impress my team leads and architects by pinpointing some of the critical
performance, memory, transactional and threading issues with the code and subsequently fixing them. Trust me it is not
hard to impress someone if you understand the key areas.
For example:
Struts action classes are not thread-safe (Refer Q113 in Enterprise section).
JSP variable declaration is not thread-safe (Refer Q34 in Enterprise section).
Valuable resources like database connections should be closed properly to avoid any memory and performance
issues (Refer Q45 in Enterprise section).
Throwing an application exception will not rollback the transaction in EJB. (Refer Q77 in Enterprise section).
The other key areas, which are vital to any software development, are a good understanding of some of key design
concepts, design patterns, and a modeling language like UML. These key areas are really worthy of a mention in your
resume and interviews.
For example:
Know how to use inheritance, polymorphism and encapsulation (Refer Q7, Q8, Q9, and Q10 in Java section.).
Why use design patterns? (Refer Q5 in Enterprise section).
Why is UML important? (Refer Q106 in Enterprise section).
If you happen to be in an interview with an organization facing serious issues with regards to their Java application
relating to memory leaks, performance problems or a crashing JVM etc then you are likely to be asked questions on
these topics. Refer Q72 – Q74 in Java section and Q123, Q125 in Enterprise section.
If you happen to be in an interview with an organization which is working on a pilot project using a different development
methodology like agile methodology etc or has just started adopting a newer development process or methodology
then you are likely to be asked questions on this key area.
If the team lead/architect of the organization you are being interviewed for feels that the current team is lacking skills in
the key areas of design concepts and design patterns then you are likely to be asked questions on these key areas.
10. 9
Another good reason why these key areas like transactional issues, design concepts, design patterns etc are vital are
because solution designers, architects, team leads, and/or senior developers are usually responsible for conducting the
technical interviews. These areas are their favorite topics because these are essential to any software development.
Some interviewers request you to write a small program during interview or prior to getting to the interview stage. This is
to ascertain that you can code using object oriented concepts and design patterns. So I have included a coding key area
to illustrate what you need to look for while coding.
Apply OO concepts like inheritance, polymorphism and encapsulation: Refer Q10 in Java section.
Program to interfaces not to implementations: Refer Q12, Q17 in Java section.
Use of relevant design patterns: Refer Q11, Q12 in How would you go about… section.
Use of Java collections API and exceptions correctly: Refer Q16 and Q39 in Java section.
Stay away from hard coding values: Refer Q05 in Java section.
L anguage
F u n d a m e n ta ls H o w m a n y b o o k s d o I h a v e to re a d to P e rfo rm a n c e
u n d e rs ta n d a n d p u t to g e th e r a ll th e s e Is s u e s
k e y a re a s ?
H o w m a n y y e a rs o f e x p e rie n c e
s h o u ld I h a v e to u n d e rs ta n d a ll th e s e
S p e c ific a tio n k e y a re a s ? E x c e p tio n
F u n d a m e n ta ls H a n d lin g
W ill th e s e k e y a re a s h e lp m e
p ro g re s s in m y c a re e r?
S o ftw a re
D e v e lo p m e n t
P ro c e s s
W ill th e s e k e y a re a s h e lp m e c u t
q u a lity c o d e ? D e s ig n
D e s ig n C o n c e p ts
S E c u rity
P a tte rn s
T ra n s a c tio n a l
Is s u e s
B est
C o n c u rre n c y S c a la b ility P ra c tic e s
Is s u e s Iss u e s
M e m o ry
Is su e s
C O d in g
LF DC CI PI SE EH SD
DP SF MI SI TI BP CO
This book aims to solve the above dilemma.
My dad keeps telling me to find a permanent job (instead of contracting), which in his view provides better job security but
I keep telling him that in my view in Information Technology the job security is achieved only by keeping your knowledge
and skills sharp and up to date. The 8 contract positions I held over the last 5.5 years have given me broader experience
in Java/J2EE and related technologies. It also kept me motivated since there was always something new to learn in each
assignment, and not all companies will appreciate your skills and expertise until you decide to leave. Do the following
statements sound familiar to you when you hand in your resignation or decide not to extend your contract after getting
another job offer? “Can I tempt you to come back? What can I do to keep you here?” etc. You might even think why you
waited so long. The best way to make an impression in any organizations is to understand and proactively apply and
11. 10
resolve the issues relating to the Key Areas discussed in this book. But be a team player, be tactful and don’t be
critical of everything, do not act in a superior way and have a sense of humor.
“Technical skills must be complemented with good business and interpersonal skills.”
Describe a time when you
were faced with a stressful
situation that demonstrated
Give me an example your coping skills?
of a time when you
set a goal and were
able to achieve it?
Development team
You
Knowledge/understanding of the business.
Ability to communicate and interact effectively with the
business users/customers.
Ability to look at things from the user's perspective as
opposed to only technology perspective.
Ability to persuade/convince business with alternative
solutions.
Ability to communicate effectively with your fellow
developers, immediate and senior management. Immediate
Business users/ Ability to work in a team as well as independently. management
External customers Problem solving/analytical skills.
Organizational skills.
Ability to cope with difficult situations like stress due to work
load, deadlines etc and manage or deal with difficult people.
Being a good listener with the right attitude.
Give me an example of a time you
Describe a time when you had to motivated others? Or dealt with a
work with others in the organization difficult person?
to accomplish the organizational
goals?
Senior management
IMPORTANT: Technical skills alone are not sufficient for you to perform well in your interviews and progress in your
career. Your technical skills must be complemented with business skills (i.e. knowledge/understanding of the business,
ability to communicate and interact effectively with the business users/customers, ability to look at things from the users’
perspective as opposed to only from technology perspective, ability to persuade/convince business with alternative
solutions, which can provide a win/win solution from users’ perspective as well as technology perspective), ability to
communicate effectively with your fellow developers, immediate and senior management, ability to work in a team as well
as independently, problem solving/analytical skills, organizational skills, ability to cope with difficult situations like stress
due to work load, deadlines etc and manage or deal with difficult people, being a good listener with the right attitude (It is
sometimes possible to have “I know it all attitude”, when you have strong technical skills. These are discussed in “Java
– Personal” and “Enterprise Java – Personal” sub-sections with examples.
Quick Read guide: It is recommended that you go through all the questions in all the sections (all it takes is to read a
few questions & answers each day) but if you are pressed for time or would like to read it just before an interview then
follow the steps shown below:
-- Read/Browse all questions marked as “FAQ” in all four sections.
-- Read/Browse Key Points in Java and Enterprise Java sections.
12. 11
Key Areas Index
I have categorized the core concepts and issues into 14 key areas as listed below. These key areas are vital for any
good software development. This index will enable you to refer to the questions based on key areas. Also note that each
question has an icon next to it to indicate which key area or areas it belongs to. Additional reading is recommended for
beginners in each of the key areas.
Key Areas icon --------------------------------------- Question Numbers ------------------------------------------------
Java section Enterprise Java section How Emerging
would you Technologies
go / Frameworks
about…?
Language Q1-Q6, Q12-Q16, Q18- - Q10, Q15,
Fundamentals Q24, Q26-Q33, Q35- Q17, Q19
LF
Q38, Q41-Q50, Q53-Q71
Specification - Q1, Q2, Q4, Q6, Q7-Q15, Q15
Fundamentals Q17-Q19, Q22, Q26-Q33,
Q35-Q38, Q41, Q42, Q44,
Q46-Q81, Q89-Q93, Q95-
SF
Q97, Q99, 102, Q110,
Q112-Q115, Q118-Q119,
Q121, Q126, Q127, Q128
Design Concepts Q1, Q7-Q12, Q15, Q26, Q2, Q3, Q19, Q20, Q21, Q02, Q08, Q3 - Q13,
Q22, Q56 Q31, Q45, Q91, Q94, Q98, Q09, Q15 Q13, Q14,
DC Q101, Q106, Q107, Q108, Q16, Q17,
Q109, Q111 Q18, Q20
Design Patterns Q12, Q16, Q24, Q36, Q5, Q5, Q22, Q24, Q25, Q11, Q12 Q9 - Q13
Q51, Q52, Q58, Q63, Q41, Q83, Q84, Q85, Q86,
DP Q75 Q87, Q88, Q110, Q111,
Q116
Transactional - Q43, Q71, Q72, Q73, Q74, Q7
Issues TI Q75, Q77, Q78, Q79
Concurrency Issues Q15, Q17, Q21, Q34, Q16, Q34, Q72, Q78, Q6
CI Q42, Q46, Q62 Q113
Performance Issues Q15, Q17,Q20-Q26, Q10, Q16, Q43, Q45, Q46, Q3, Q5
Q46, Q62, Q72 Q72, Q83-Q88, Q93, Q97,
PI Q98, Q100, Q102, Q123,
Q125, Q128
Memory Issues Q26, Q34, Q37,Q38, Q45, Q93 Q3, Q4
MI Q42, Q51, Q73, Q74
Scalability Issues Q23, Q24 Q20, Q21, Q120, Q122
SI
Exception Handling Q39, Q40 Q76, Q77
EH
Security Q10, Q35, Q70 Q12, Q13, Q23, Q35, Q46, Q13
SE Q51, Q58, Q81, Q92
Best Practices Q17, Q25, Q39, Q72, Q10, Q16, Q39, Q40, Q41, Q1, Q2
BP Q73 Q46, Q82, Q124, Q125
13. 12
Software - Q103-Q109, Q129, Q130, Q1, Q9, Q1, Q2
Development SD Q132, Q136 Q10, Q14
Process
Coding1 Q05, Q10, Q12, Q14 – Q10, Q18, Q21, Q23, Q36, Q11, Q12
Q21, Q23, Q25, Q26, Q38, Q42, Q43, Q45, Q74,
CO Q33, Q35, Q39, Q51, Q75, Q76, Q77, Q112,
Q52, Q55 Q114, Q127, Q128
Frequently Asked Q1, Q6, Q7, Q9, Q10, Q1, Q2, Q3, Q7, Q10, Q11, Q1, Q2, Q1, Q6, Q7,
Questions Q12, Q13, Q14, Q15, Q12, Q13, Q16, Q19, Q22, Q3, Q4, Q9, Q10, Q11,
Q16, Q18, Q20, Q21, Q24, Q25, Q27, Q28, Q30, Q5, Q6, Q15, Q16,
Q22, Q23, Q27, Q28, Q31, Q32, Q34, Q35, Q36, Q7, Q8, Q17, Q18
Q29, Q30, Q31, Q32, Q39, Q40, Q41, Q42, Q43, Q9, Q10,
Q36, Q37, Q43, Q45, Q45, Q46, Q48, Q49, Q50, Q12, Q15
Q46, Q48, Q51, Q52, Q52, Q53, Q61, Q63, Q65,
Q55, Q58, Q60, Q62, Q66, Q69, Q70, Q71, Q72,
FAQ Q63, Q64, Q67, Q68, Q73, Q76, Q77, Q82, Q83,
Q69, Q70, Q71 Q84, Q85, Q86, Q87, Q90,
Q72 – Q86 Q91, Q93, Q95, Q96, Q97,
Q98, Q100, Q101, Q102,
Q107, Q108, Q110, Q113,
Q115, Q116, Q118, Q123,
Q124, Q125, Q126, Q129,
Q130, Q131, Q133, Q134,
Q135, Q136.
1
Some interviewers request you to write a small program during interview or prior to getting to the interview stage. This is to ascertain
that you can code using object oriented concepts and design patterns. I have included a coding key area to illustrate what you need to
look for while coding. Unlike other key areas, the CO is not always shown against the question but shown above the actual section of
relevance within a question.
14. Java 13
SECTION ONE
Java – Interview questions & answers
Language Fundamentals LF
K
E
Design Concepts DC
Y Design Patterns DP
Concurrency Issues CI
A Performance Issues PI
R Memory Issues MI
E Exception Handling EH
A
S
Security SE
Scalability Issues SI
Coding1 CO
FAQ - Frequently Asked Questions
1
Unlike other key areas, the CO is not always shown against the question but shown above the actual content of relevance within a
question.
15. 14 Java - Fundamentals
Java – Fundamentals
Q 01: Give a few reasons for using Java? LF DC FAQ
A 01: Java is a fun language. Let’s look at some of the reasons:
Built-in support for multi-threading, socket communication, and memory management (automatic garbage
collection).
Object Oriented (OO).
Better portability than other languages across operating systems.
Supports Web based applications (Applet, Servlet, and JSP), distributed applications (sockets, RMI, EJB etc)
and network protocols (HTTP, JRMP etc) with the help of extensive standardized APIs (Application
Programming Interfaces).
Q 02: What is the main difference between the Java platform and the other software platforms? LF
A 02: Java platform is a software-only platform, which runs on top of other hardware-based platforms like UNIX, NT etc.
The Java platform has 2 components:
Java Virtual Machine (JVM) – ‘JVM’ is a software that can be ported onto various hardware platforms. Byte
codes are the machine language of the JVM.
Java Application Programming Interface (Java API) – set of classes written using the Java language and run
on the JVM.
Q 03: What is the difference between C++ and Java? LF
A 03: Both C++ and Java use similar syntax and are Object Oriented, but:
Java does not support pointers. Pointers are inherently tricky to use and troublesome.
Java does not support multiple inheritances because it causes more problems than it solves. Instead Java
supports multiple interface inheritance, which allows an object to inherit many method signatures from
different interfaces with the condition that the inheriting object must implement those inherited methods. The
multiple interface inheritance also allows an object to behave polymorphically on those methods. [Refer Q9
and Q10 in Java section.]
Java does not support destructors but adds a finalize() method. Finalize methods are invoked by the garbage
collector prior to reclaiming the memory occupied by the object, which has the finalize() method. This means
you do not know when the objects are going to be finalized. Avoid using finalize() method to release non-
memory resources like file handles, sockets, database connections etc because Java has only a finite
number of these resources and you do not know when the garbage collection is going to kick in to release
these resources through the finalize() method.
Java does not include structures or unions because the traditional data structures are implemented as an
object oriented framework (Java Collections Framework – Refer Q16, Q17 in Java section).
16. Java - Fundamentals 15
All the code in Java program is encapsulated within classes therefore Java does not have global variables or
functions.
C++ requires explicit memory management, while Java includes automatic garbage collection. [Refer Q37 in
Java section].
Q 04: What are the usages of Java packages? LF
A 04: It helps resolve naming conflicts when different packages have classes with the same names. This also helps you
organize files within your project. For example: java.io package do something related to I/O and java.net
package do something to do with network and so on. If we tend to put all .java files into a single package, as the
project gets bigger, then it would become a nightmare to manage all your files.
You can create a package as follows with package keyword, which is the first keyword in any Java program
followed by import statements. The java.lang package is imported implicitly by default and all the other packages
must be explicitly imported.
package com.xyz.client ;
import java.io.File;
import java.net.URL;
Q 05: Explain Java class loaders? If you have a class in a package, what do you need to do to run it? Explain dynamic
class loading? LF
A 05: Class loaders are hierarchical. Classes are introduced into the JVM as they are referenced by name in a class that
is already running in the JVM. So, how is the very first class loaded? The very first class is especially loaded with
the help of static main( ) method declared in your class. All the subsequently loaded classes are loaded by the
classes, which are already loaded and running. A class loader creates a namespace. All JVMs include at least one
class loader that is embedded within the JVM called the primordial (or bootstrap) class loader. Now let’s look at
non-primordial class loaders. The JVM has hooks in it to allow user defined class loaders to be used in place of
primordial class loader. Let us look at the class loaders created by the JVM.
CLASS LOADER reloadable? Explanation
Bootstrap No Loads JDK internal classes, java.* packages. (as defined in the sun.boot.class.path
(primordial) system property, typically loads rt.jar and i18n.jar)
Extensions No Loads jar files from JDK extensions directory (as defined in the java.ext.dirs system
property – usually lib/ext directory of the JRE)
System No Loads classes from system classpath (as defined by the java.class.path property, which
is set by the CLASSPATH environment variable or –classpath or –cp command line
options)
JVM class loaders
Bootstrap
(primordial)
Classes loaded by Bootstrap class loader have no visibility into classes
(rt.jar, i18.jar)
loaded by its descendants (ie Extensions and Systems class loaders).
Extensions The classes loaded by system class loader have visibility into classes loaded
(lib/ext) by its parents (ie Extensions and Bootstrap class loaders).
If there were any sibling class loaders they cannot see classes loaded by
System each other. They can only see the classes loaded by their parent class
(-classpath) loader. For example Sibling1 class loader cannot see classes loaded by
Sibling2 class loader
Sibling1 Sibling2 Both Sibling1 and Sibling2 class loaders have visibilty into classes loaded
classloader classloader by their parent class loaders (eg: System, Extensions, and Bootstrap)
Class loaders are hierarchical and use a delegation model when loading a class. Class loaders request their
parent to load the class first before attempting to load it themselves. When a class loader loads a class, the child
class loaders in the hierarchy will never reload the class again. Hence uniqueness is maintained. Classes loaded
17. 16 Java - Fundamentals
by a child class loader have visibility into classes loaded by its parents up the hierarchy but the reverse is not true
as explained in the above diagram.
Q. What do you need to do to run a class with a main() method in a package?
Example: Say, you have a class named “Pet” in a project folder “c:myProject” and package named
com.xyz.client, will you be able to compile and run it as it is?
package com.xyz.client;
public class Pet {
public static void main(String[] args) {
System.out.println("I am found in the classpath");
}
}
To run c:myProject> java com.xyz.client.Pet
The answer is no and you will get the following exception: “Exception in thread "main" java.lang.-
NoClassDefFoundError: com/xyz/client/Pet”. You need to set the classpath. How can you do that? One of the
following ways:
1. Set the operating system CLASSPATH environment variable to have the project folder “c:myProject”. [Shown
in the above diagram as the System –classpath class loader]
2. Set the operating system CLASSPATH environment variable to have a jar file “c:/myProject/client.jar”, which
has the Pet.class file in it. [Shown in the above diagram as the System –classpath class loader].
3. Run it with –cp or –classpath option as shown below:
c:>java –cp c:/myProject com.xyz.client.Pet
OR
c:>java -classpath c:/myProject/client.jar com.xyz.client.Pet
Important: Two objects loaded by different class loaders are never equal even if they carry the same values, which mean a
class is uniquely identified in the context of the associated class loader. This applies to singletons too, where each class
loader will have its own singleton. [Refer Q51 in Java section for singleton design pattern]
Q. Explain static vs. dynamic class loading?
Static class loading Dynamic class loading
Classes are statically loaded with Java’s Dynamic loading is a technique for programmatically invoking the functions of a
“new” operator. class loader at run time. Let us look at how to load classes dynamically.
class MyClass { Class.forName (String className); //static method which returns a Class
public static void main(String args[]) {
Car c = new Car(); The above static method returns the class object associated with the class
} name. The string className can be supplied dynamically at run time. Unlike the
} static loading, the dynamic loading will decide whether to load the class Car or
the class Jeep at runtime based on a properties file and/or other runtime
conditions. Once the class is dynamically loaded the following method returns an
instance of the loaded class. It’s just like creating a class object with no
arguments.
class.newInstance (); //A non-static method, which creates an instance of a
//class (i.e. creates an object).
Jeep myJeep = null ;
//myClassName should be read from a .properties file or a Constants class.
// stay away from hard coding values in your program. CO
String myClassName = "au.com.Jeep" ;
Class vehicleClass = Class.forName(myClassName) ;
myJeep = (Jeep) vehicleClass.newInstance();
myJeep.setFuelCapacity(50);
A NoClassDefFoundException is A ClassNotFoundException is thrown when an application tries to load in a
thrown if a class is referenced with class through its string name using the following methods but no definition for the
Java’s “new” operator (i.e. static loading) class with the specified name could be found:
but the runtime system cannot find the
referenced class. The forName(..) method in class - Class.
The findSystemClass(..) method in class - ClassLoader.
The loadClass(..) method in class - ClassLoader.
18. Java - Fundamentals 17
Q. What are “static initializers” or “static blocks with no function names”? When a class is loaded, all blocks
that are declared static and don’t have function name (i.e. static initializers) are executed even before the
constructors are executed. As the name suggests they are typically used to initialize static fields. CO
public class StaticInitializer {
public static final int A = 5;
public static final int B; //note that it is not public static final int B = null;
//note that since B is final, it can be initialized only once.
//Static initializer block, which is executed only once when the class is loaded.
static {
if(A == 5)
B = 10;
else
B = 5;
}
public StaticInitializer(){} //constructor is called only after static initializer block
}
The following code gives an Output of A=5, B=10.
public class Test {
System.out.println("A =" + StaticInitializer.A + ", B =" + StaticInitializer.B);
}
Q 06: What is the difference between constructors and other regular methods? What happens if you do not provide a
constructor? Can you call one constructor from another? How do you call the superclass’s constructor? LF FAQ
A 06:
Constructors Regular methods
Constructors must have the same name as the class Regular methods can have any name and can be called any number of
name and cannot return a value. The constructors times. E.g. for a Pet.class.
are called only once per creation of an object while
regular methods can be called many times. E.g. for a public void Pet(){} // regular method has a void return type.
Pet.class
Note: method name is shown starting with an uppercase to
public Pet() {} // constructor differentiate a constructor from a regular method. Better naming
convention is to have a meaningful name starting with a lowercase
like:
public void createPet(){} // regular method has a void return type
Q. What happens if you do not provide a constructor? Java does not actually require an explicit constructor in
the class description. If you do not include a constructor, the Java compiler will create a default constructor in the
byte code with an empty argument. This default constructor is equivalent to the explicit “Pet(){}”. If a class includes
one or more explicit constructors like “public Pet(int id)” or “Pet(){}” etc, the java compiler does not create the
default constructor “Pet(){}”.
Q. Can you call one constructor from another? Yes, by using this() syntax. E.g.
public Pet(int id) {
this.id = id; // “this” means this object
}
public Pet (int id, String type) {
this(id); // calls constructor public Pet(int id)
this.type = type; // ”this” means this object
}
Q. How to call the superclass constructor? If a class called “SpecialPet” extends your “Pet” class then you can
use the keyword “super” to invoke the superclass’s constructor. E.g.
public SpecialPet(int id) {
super(id); //must be the very first statement in the constructor.
}
To call a regular method in the super class use: “super.myMethod( );”. This can be called at any line. Some
frameworks based on JUnit add their own initialization code, and not only do they need to remember to invoke
19. 18 Java - Fundamentals
their parent's setup() method, you, as a user, need to remember to invoke theirs after you wrote your initialization
code:
public class DBUnitTestCase extends TestCase {
public void setUp() {
super.setUp();
// do my own initialization
}
}
public void cleanUp() throws Throwable
{
try {
… // Do stuff here to clean up your object(s).
}
catch (Throwable t) {}
finally{
super.cleanUp(); //clean up your parent class. Unlike constructors
// super.regularMethod() can be called at any line.
}
}
Q 07: What are the advantages of Object Oriented Programming Languages (OOPL)? DC FAQ
A 07: The Object Oriented Programming Languages directly represent the real life objects like Car, Jeep, Account,
Customer etc. The features of the OO programming languages like polymorphism, inheritance and
encapsulation make it powerful. [Tip: remember pie which, stands for Polymorphism, Inheritance and
Encapsulation are the 3 pillars of OOPL]
Q 08: How does the Object Oriented approach improve software development? DC
A 08: The key benefits are:
Re-use of previous work: using implementation inheritance and object composition.
Real mapping to the problem domain: Objects map to real world and represent vehicles, customers,
products etc: with encapsulation.
Modular Architecture: Objects, systems, frameworks etc are the building blocks of larger systems.
The increased quality and reduced development time are the by-products of the key benefits discussed above.
If 90% of the new application consists of proven existing components then only the remaining 10% of the code
have to be tested from scratch.
Q 09: How do you express an ‘is a’ relationship and a ‘has a’ relationship or explain inheritance and composition? What
is the difference between composition and aggregation? DC FAQ
A 09: The ‘is a’ relationship is expressed with inheritance and ‘has a’ relationship is expressed with composition. Both
inheritance and composition allow you to place sub-objects inside your new class. Two of the main techniques for
code reuse are class inheritance and object composition.
Inheritance [ is a ] Vs Composition [ has a ]
Building is a is a [House is a Building] has a [House has a Bathroom]
class Building{ class House {
has a ....... Bathroom room = new Bathroom() ;
} ....
public void getTotMirrors(){
class House extends Building{ room.getNoMirrors();
Bathroom ......... ....
House
} }
}
Inheritance is uni-directional. For example House is a Building. But Building is not a House. Inheritance uses
extends key word. Composition: is used when House has a Bathroom. It is incorrect to say House is a
20. Java - Fundamentals 19
Bathroom. Composition simply means using instance variables that refer to other objects. The class House will
have an instance variable, which refers to a Bathroom object.
Q. Which one to favor, composition or inheritance? The guide is that inheritance should be only used when
subclass ‘is a’ superclass.
Don’t use inheritance just to get code reuse. If there is no ‘is a’ relationship then use composition for code
reuse. Overuse of implementation inheritance (uses the “extends” key word) can break all the subclasses, if
the superclass is modified.
Do not use inheritance just to get polymorphism. If there is no ‘is a’ relationship and all you want is
polymorphism then use interface inheritance with composition, which gives you code reuse (Refer Q10
in Java section for interface inheritance).
What is the difference between aggregation and composition?
Aggregation Composition
Aggregation is an association in which one class Composition is an association in which one class belongs to a
belongs to a collection. This is a part of a whole collection. This is a part of a whole relationship where a part
relationship where a part can exist without a whole. cannot exist without a whole. If a whole is deleted then all parts are
For example a line item is a whole and product is a deleted. For example An order is a whole and line items are parts.
part. If a line item is deleted then corresponding If an order is deleted then all corresponding line items for that
product need not be deleted. So aggregation has a order should be deleted. So composition has a stronger
weaker relationship. relationship.
Q 10: What do you mean by polymorphism, inheritance, encapsulation, and dynamic binding? DC SE FAQ
A 10: Polymorphism – means the ability of a single variable of a given type to be used to reference objects of
different types, and automatically call the method that is specific to the type of object the variable references. In a
nutshell, polymorphism is a bottom-up method call. The benefit of polymorphism is that it is very easy to add new
classes of derived objects without breaking the calling code (i.e. getTotArea() in the sample code shown
below) that uses the polymorphic classes or interfaces. When you send a message to an object even though you
don’t know what specific type it is, and the right thing happens, that’s called polymorphism. The process used by
object-oriented programming languages to implement polymorphism is called dynamic binding. Let us look at
some sample code to demonstrate polymorphism: CO
Sam ple code:
//client or calling code <<abstract>>
For exam ple: given a base Shape
double dim = 5.0; //ie 5 m eters radius or width
List listShapes = new ArrayList(20); class/interface Shape,
polymorphism allows the +area() : double
Shape s = new Circle(); program m er to define
listShapes.add(s); //add circle
different area(double
s = new Square(); dim 1) methods for any Circle
listShapes.add(s); //add square number of derived classes Square
such as Circle, Square etc. +area() : double
getTotArea (listShapes,dim ); //returns 78.5+25.0=103.5
N o m atter what shape an +area() : double
//Later on, if you decide to add a half circle then define object is, applying the area
//a HalfCircle class, which extends Circle and then provide an m ethod to it will return the H alfC ircle
//area(). m ethod but your called m ethod getTotArea(...) rem ains right results.
//sam e.
+area() : double
s = new H alfCircle(); Later on H alfCicle can be
listShapes.add(s); //add HalfC ircle added without breaking
your called code i.e.
getTotArea (listShapes,dim ); //returns 78.5+25.0+39.25=142.75
m ethod getTotalArea(...) «interface»
Shape
/** called m ethod: m ethod which adds up areas of various
+area() : double
** shapes supplied to it.
**/ Depending on what the
public double getTotArea(List listShapes, double dim ){ shape is, appropriate
Iterator it = listShapes.iterator(); area(double dim ) m ethod Circle Square
double totalArea = 0.0; gets called and calculated.
//loop through different shapes
Circle area is 78.5sqm +area() : double +area() : double
w hile(it.hasNext()) {
Shape s = (Shape) it.next(); Square area is 25sqm
totalArea += s.area(dim ); //polym orphic m ethod call HalfC ircle area is 39.25
HalfCircle
} sqm
return totalArea ;
} +area() : double
21. 20 Java - Fundamentals
Inheritance – is the inclusion of behavior (i.e. methods) and state (i.e. variables) of a base class in a derived class so
that they are accessible in that derived class. The key benefit of Inheritance is that it provides the formal mechanism for
code reuse. Any shared piece of business logic can be moved from the derived class into the base class as part of
refactoring process to improve maintainability of your code by avoiding code duplication. The existing class is called the
superclass and the derived class is called the subclass. Inheritance can also be defined as the process whereby one
object acquires characteristics from one or more other objects the same way children acquire characteristics from their
parents. There are two types of inheritances:
1. Implementation inheritance (aka class inheritance): You can extend an application’s functionality by reusing
functionality in the parent class by inheriting all or some of the operations already implemented. In Java, you can only
inherit from one superclass. Implementation inheritance promotes reusability but improper use of class inheritance can
cause programming nightmares by breaking encapsulation and making future changes a problem. With implementation
inheritance, the subclass becomes tightly coupled with the superclass. This will make the design fragile because if you
want to change the superclass, you must know all the details of the subclasses to avoid breaking them. So when using
implementation inheritance, make sure that the subclasses depend only on the behavior of the superclass, not on
the actual implementation. For example in the above diagram, the subclasses should only be concerned about the
behavior known as area() but not how it is implemented.
2. Interface inheritance (aka type inheritance): This is also known as subtyping. Interfaces provide a mechanism for
specifying a relationship between otherwise unrelated classes, typically by specifying a set of common methods each
implementing class must contain. Interface inheritance promotes the design concept of program to interfaces not to
implementations. This also reduces the coupling or implementation dependencies between systems. In Java, you can
implement any number of interfaces. This is more flexible than implementation inheritance because it won’t lock you into
specific implementations which make subclasses difficult to maintain. So care should be taken not to break the
implementing classes by modifying the interfaces.
Which one to use? Prefer interface inheritance to implementation inheritance because it promotes the design concept of
coding to an interface and reduces coupling. Interface inheritance can achieve code reuse with the help of object
composition. If you look at Gang of Four (GoF) design patterns, you can see that it favors interface inheritance to
implementation inheritance. CO
Implementation inheritance Interface inheritance with composition
Let’s assume that savings account and term deposit account Let’s look at an interface inheritance code sample, which makes use
have a similar behavior in terms of depositing and of composition for reusability. In the following example the methods
withdrawing money, so we will get the super class to deposit(…) and withdraw(…) share the same piece of code in
implement this behavior and get the subclasses to reuse this AccountHelper class. The method calculateInterest(…) has its specific
behavior. But saving account and term deposit account implementation in its own class.
have specific behavior in calculating the interest.
Super class Account has reusable code as methods public interface Account {
deposit (double amount) and withdraw (double amount). public abstract double calculateInterest(double amount);
public abstract void deposit(double amount);
public abstract class Account { public abstract void withdraw(double amount);
public void deposit (double amount) { }
System.out.println("depositing " + amount);
} Code to interface so that the implementation can change.
public void withdraw (double amount) { public interface AccountHelper {
System.out.println ("withdrawing " + amount); public abstract void deposit (double amount);
} public abstract void withdraw (double amount);
}
public abstract double calculateInterest(double amount);
} class AccountHelperImpl has reusable code as methods deposit
(double amount) and withdraw (double amount).
public class SavingsAccount extends Account { public class AccountHelperImpl implements AccountHelper {
public void deposit(double amount) {
public double calculateInterest (double amount) { System.out.println("depositing " + amount);
// calculate interest for SavingsAccount }
return amount * 0.03;
} public void withdraw(double amount) {
System.out.println("withdrawing " + amount);
public void deposit (double amount) { }
super.deposit (amount); // get code reuse
// do something else }
}
public void withdraw (double amount) { public class SavingsAccountImpl implements Account {
22. Java - Fundamentals 21
super.withdraw (amount); // get code reuse // composed helper class (i.e. composition).
// do something else AccountHelper helper = new AccountHelperImpl ();
}
} public double calculateInterest (double amount) {
// calculate interest for SavingsAccount
public class TermDepositAccount extends Account { return amount * 0.03;
}
public double calculateInterest (double amount) {
// calculate interest for SavingsAccount public void deposit (double amount) {
return amount * 0.05; helper.deposit( amount); // code reuse via composition
} }
public void deposit(double amount) { public void withdraw (double amount) {
super.deposit (amount); // get code reuse helper.withdraw (amount); // code reuse via composition
// do something else }
} }
public void withdraw(double amount) { public class TermDepositAccountImpl implements Account {
super.withdraw (amount); // get code reuse
// do something else // composed helper class (i.e. composition).
} AccountHelper helper = new AccountHelperImpl ();
}
public double calculateInterest (double amount) {
//calculate interest for SavingsAccount
return amount * 0.05;
}
public void deposit (double amount) {
helper.deposit (amount) ; // code reuse via composition
}
public void withdraw (double amount) {
helper.withdraw (amount) ; // code reuse via composition
}
}
The Test class:
public class Test {
public static void main(String[] args) {
Account acc1 = new SavingsAccountImpl();
acc1.deposit(50.0);
Account acc2 = new TermDepositAccountImpl();
acc2.deposit(25.0);
acc1.withdraw(25);
acc2.withdraw(10);
double cal1 = acc1.calculateInterest(100.0);
double cal2 = acc2.calculateInterest(100.0);
System.out.println("Savings --> " + cal1);
System.out.println("TermDeposit --> " + cal2);
}
}
The output:
depositing 50.0
depositing 25.0
withdrawing 25.0
withdrawing 10.0
Savings --> 3.0
TermDeposit --> 5.0
Q. Why would you prefer code reuse via composition over inheritance? Both the approaches make use of
polymorphism and gives code reuse (in different ways) to achieve the same results but:
The advantage of class inheritance is that it is done statically at compile-time and is easy to use. The disadvantage of
class inheritance is that because it is static, implementation inherited from a parent class cannot be changed at run-
23. 22 Java - Fundamentals
time. In object composition, functionality is acquired dynamically at run-time by objects collecting references to other
objects. The advantage of this approach is that implementations can be replaced at run-time. This is possible because
objects are accessed only through their interfaces, so one object can be replaced with another just as long as they
have the same type. For example: the composed class AccountHelperImpl can be replaced by another more
efficient implementation as shown below if required:
public class EfficientAccountHelperImpl implements AccountHelper {
public void deposit(double amount) {
System.out.println("efficient depositing " + amount);
}
public void withdraw(double amount) {
System.out.println("efficient withdrawing " + amount);
}
}
Another problem with class inheritance is that the subclass becomes dependent on the parent class implementation.
This makes it harder to reuse the subclass, especially if part of the inherited implementation is no longer desirable and
hence can break encapsulation. Also a change to a superclass can not only ripple down the inheritance hierarchy to
subclasses, but can also ripple out to code that uses just the subclasses making the design fragile by tightly coupling
the subclasses with the super class. But it is easier to change the interface/implementation of the composed class.
Due to the flexibility and power of object composition, most design patterns emphasize object composition over
inheritance whenever it is possible. Many times, a design pattern shows a clever way of solving a common problem
through the use of object composition rather then a standard, less flexible, inheritance based solution.
Encapsulation – refers to keeping all the related members (variables and methods) together in an object. Specifying
member variables as private can hide the variables and methods. Objects should hide their inner workings from the
outside view. Good encapsulation improves code modularity by preventing objects interacting with each other in
an unexpected way, which in turn makes future development and refactoring efforts easy. CO
Sample code
Class MyMarks {
private int vmarks = 0; k) in
private String name; ar tg Member
t m et
(in M
ar
variables are
ks encapsulated,
public void setMarks(int mark) ar ks
()
throws MarkException { tM so that they
if(mark > 0)
se can only be
this.vmarks = mark; accessed via
else { private int vmarks; encapsulating
throw new MarkException("No negative private String name; methods.
Values");
} se
tN )
} am e(
e m
(S
tri tNa
public int getMarks(){ ng ge
na g
return vmarks; rin
} m
e) St
//getters and setters for attribute name goes here.
}
Being able to encapsulate members of a class is important for security and integrity. We can protect variables from
unacceptable values. The sample code above describes how encapsulation can be used to protect the MyMarks object
from having negative values. Any modification to member variable “vmarks” can only be carried out through the setter
method setMarks(int mark). This prevents the object “MyMarks” from having any negative values by throwing an
exception.
Q 11: What is design by contract? Explain the assertion construct? DC
A 11: Design by contract specifies the obligations of a calling-method and called-method to each other. Design by
contract is a valuable technique, which should be used to build well-defined interfaces. The strength of this
programming methodology is that it gets the programmer to think clearly about what a function does, what pre
and post conditions it must adhere to and also it provides documentation for the caller. Java uses the assert
statement to implement pre- and post-conditions. Java’s exceptions handling also support design by contract
especially checked exceptions (Refer Q39 in Java section for checked exceptions). In design by contract in
addition to specifying programming code to carrying out intended operations of a method the programmer also
specifies:
24. Java - Fundamentals 23
1. Preconditions – This is the part of the contract the calling-method must agree to. Preconditions specify the
conditions that must be true before a called method can execute. Preconditions involve the system state and the
arguments passed into the method at the time of its invocation. If a precondition fails then there is a bug in the
calling-method or calling software component.
On public methods On non-public methods
Preconditions on public methods are enforced by explicit checks You can use assertion to check the parameters of the
that throw particular, specified exceptions. You should not use non-public methods.
assertion to check the parameters of the public methods but
can use for the non-public methods. Assert is inappropriate private void setCalculatedRate(int rate) {
because the method guarantees that it will always enforce the assert (rate > 0 && rate < MAX_RATE) : rate;
argument checks. It must check its arguments whether or not //calculate the rate and set it.
assertions are enabled. Further, assert construct does not throw }
an exception of a specified type. It can throw only an
AssertionError. Assertions can be disabled, so programs must not
assume that assert construct will be always executed:
public void setRate(int rate) {
if(rate <= 0 || rate > MAX_RATE){ //Wrong:
throw new IllegalArgumentException(“Invalid rate ” + rate); //if assertion is disabled, “pilotJob” never gets removed
} assert jobsAd.remove(pilotJob);
setCalculatedRate(rate);
} //Correct:
boolean pilotJobRemoved = jobsAd.remove(pilotJob);
assert pilotJobRemoved;
2. Postconditions – This is the part of the contract the called-method agrees to. What must be true after a
method completes successfully. Postconditions can be used with assertions in both public and non-public
methods. The postconditions involve the old system state, the new system state, the method arguments and the
method’s return value. If a postcondition fails then there is a bug in the called-method or called software
component.
public double calcRate(int rate) {
if(rate <= 0 || rate > MAX_RATE){
throw new IllegalArgumentException(“Invalid rate !!! ”);
}
//logic to calculate the rate and set it goes here
assert this.evaluate(result) < 0 : this; //message sent to AssertionError on failure
return result;
}
3. Class invariants - what must be true about each instance of a class? A class invariant as an internal invariant
that can specify the relationships among multiple attributes, and should be true before and after any method
completes. If an invariant fails then there could be a bug in either calling-method or called-method. There is
no particular mechanism for checking invariants but it is convenient to combine all the expressions required for
checking invariants into a single internal method that can be called by assertions. For example if you have a class,
which deals with negative integers then you define the isNegative() convenient internal method:
class NegativeInteger {
Integer value = new Integer (-1); //invariant
//constructor
public NegativeInteger(Integer int) {
//constructor logic goes here
assert isNegative();
}
// rest of the public and non-public methods goes here. public methods should call
// assert isNegative(); prior to its return
// convenient internal method for checking invariants.
// Returns true if the integer value is negative
private boolean isNegative(){
return value.intValue() < 0 ;
}
}
25. 24 Java - Fundamentals
The isNegative() method should be true before and after any method completes, each public method and
constructor should contain the following assert statement immediately prior to its return.
assert isNegative();
Explain the assertion construct? The assertion statements have two forms as shown below:
assert Expression1;
assert Expression1 : Expression2;
Where:
Expression1 is a boolean expression. If the Expression1 evaluates to false, it throws an AssertionError without any
detailed message.
Expression2 if the Expression1 evaluates to false throws an AssertionError with using the value of the Expression2 as
the error’s detailed message.
Note: If you are using assertions (available from JDK1.4 onwards), you should supply the JVM argument to
enable it by package name or class name.
java -ea[:packagename...|:classname] or java -enableassertions[:packagename...|:classname]
java –ea:Account
Q 12: What is the difference between an abstract class and an interface and when should you use them? LF DP DC
FAQ
A 12: In design, you want the base class to present only an interface for its derived classes. This means, you don’t want
anyone to actually instantiate an object of the base class. You only want to upcast to it (implicit upcasting, which
gives you polymorphic behavior), so that its interface can be used. This is accomplished by making that class
abstract using the abstract keyword. If anyone tries to make an object of an abstract class, the compiler prevents
it.
The interface keyword takes this concept of an abstract class a step further by preventing any method or function
implementation at all. You can only declare a method or function but not provide the implementation. The class,
which is implementing the interface, should provide the actual implementation. The interface is a very useful and
commonly used aspect in OO design, as it provides the separation of interface and implementation and
enables you to:
Capture similarities among unrelated classes without artificially forcing a class relationship.
Declare methods that one or more classes are expected to implement.
Reveal an object's programming interface without revealing its actual implementation.
Model multiple interface inheritance in Java, which provides some of the benefits of full on multiple
inheritances, a feature that some object-oriented languages support that allow a class to have more than one
superclass.
Abstract class Interface
Have executable methods and abstract methods. Have no implementation code. All methods are abstract.
Can only subclass one abstract class. A class can implement any number of interfaces.
Diamond problem & use of interface
Shape <<Interface>>
ShapeIF
Circle Square CircleOnSquare
Circle Square
<<Interface>> <<Interface>>
CircleIF SquareIF
CircleOnSquare
Multiple interface inheritance in JAVA
No multiple inheritance in JAVA
26. Java - Fundamentals 25
Q. When to use an abstract class?: In case where you want to use implementation inheritance then it is
usually provided by an abstract base class. Abstract classes are excellent candidates inside of application
frameworks. Abstract classes let you define some default behavior and force subclasses to provide any specific
behavior. Care should be taken not to overuse implementation inheritance as discussed in Q10 in Java section.
Q. When to use an interface?: For polymorphic interface inheritance, where the client wants to only deal with a
type and does not care about the actual implementation use interfaces. If you need to change your design
frequently, you should prefer using interface to abstract. CO Coding to an interface reduces coupling and
interface inheritance can achieve code reuse with the help of object composition. For example: The Spring
framework’s dependency injection promotes code to an interface principle. Another justification for using interfaces
is that they solve the ‘diamond problem’ of traditional multiple inheritance as shown in the figure. Java does not
support multiple inheritance. Java only supports multiple interface inheritance. Interface will solve all the
ambiguities caused by this ‘diamond problem’.
Design pattern: Strategy design pattern lets you swap new algorithms and processes into your program without
altering the objects that use them. Strategy design pattern: Refer Q11 in How would you go about… section.
Q 13: Why there are some interfaces with no defined methods (i.e. marker interfaces) in Java? LF FAQ
A 13: The interfaces with no defined methods act like markers. They just tell the compiler that the objects of the classes
implementing the interfaces with no defined methods need to be treated differently. Example java.io.Serializable
(Refer Q23 in Java section), java.lang.Cloneable, java.util.EventListener etc. Marker interfaces are also known as
“tag” interfaces since they tag all the derived classes into a category based on their purpose.
Q 14: When is a method said to be overloaded and when is a method said to be overridden? LF CO FAQ
A 14:
Method Overloading Method Overriding
Overloading deals with multiple methods in the same class Overriding deals with two methods, one in the parent class and
with the same name but different method signatures. the other one in the child class and has the same name and
signatures.
class MyClass {
public void getInvestAmount(int rate) {…} class BaseClass{
public void getInvestAmount(int rate) {…}
public void getInvestAmount(int rate, long principal) }
{ … }
} class MyClass extends BaseClass {
public void getInvestAmount(int rate) { …}
Both the above methods have the same method names }
but different method signatures, which mean the methods
are overloaded. Both the above methods have the same method names and
the signatures but the method in the subclass MyClass
overrides the method in the superclass BaseClass.
Overloading lets you define the same operation in Overriding lets you define the same operation in different
different ways for different data. ways for different object types.
Q 15: What is the main difference between an ArrayList and a Vector? What is the main difference between HashMap
and Hashtable? What is the difference between a stack and a queue? LF DC PI CI FAQ
A 15:
Vector / Hashtable ArrayList / HashMap
Original classes before the introduction of Collections So if you don’t need a thread safe collection, use the ArrayList or
API. Vector & Hashtable are synchronized. Any HashMap. Why pay the price of synchronization unnecessarily at
method that touches their contents is thread-safe. the expense of performance degradation.
Q. So which is better? As a general rule, prefer ArrayList/HashMap to Vector/Hashtable. If your application is a
multithreaded application and at least one of the threads either adds or deletes an entry into the collection
then use new Java collections API‘s external synchronization facility as shown below to temporarily synchronize
your collections as needed: CO
Map myMap = Collections.synchronizedMap (myMap); // single lock for the entire map
List myList = Collections.synchronizedList (myList); // single lock for the entire list