Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Jaca Docx2

Download as pdf or txt
Download as pdf or txt
You are on page 1of 56

UNIT-I

Syllabus:
Introduction to OOP, procedural programming language and object-oriented language, principles of OOP,
applications of OOP, history of java, java features, JVM, program structure. Variables, primitive data types,
identifiers, literals, operators, expressions, precedence rules and associativity, primitive type conversion and
casting, flow of control.

Objectives:
✓ Fundamentals of object-oriented programming concepts such as data abstraction, encapsulation,
inheritance, polymorphism.
✓ JVM Architecture and its working.
✓ Expressions and Flow of control

Outcomes:
➢ Apply the principles of object oriented concepts on real world problems.
➢ Able to perform type conversions
➢ Understand the flow of control in java programming

UNIT-1 JAVA PROGRAMMING Page 1


Unit wise previous question papers

Unit-1
Small Questions:
1) How to use break and continue statements in java? [Set-1, April –18-R16].
2) Write about the relationship between OOPs, OODesign and OOAnalysis. [Set-2, April–18-R16].
3) What is data abstraction? Differentiate data and procedural abstractions. [Set-3, April–18-R16].
4) What are the components of JAVA platform? Explain. [Set-4, April–18-R16].
5) Support the statement “java byte code gives high performance”. [Set-1, April –18-R13].
6) Support the statement “java is dynamic”. Discuss. [Set-2, April –18-R13].
7) Support the statement “java is Architecture-Neutral” [Set-3, April –18-R13].
8) Support the statement “java is robust”. Discuss. [Set-4, April –18-R13].

Big Questions:
1. How to perform type casting in java? Differentiate it from primitive type conversion with an example
program. [Set-1,April – 2018-R16].
2. Write a java program to illustrate the usage of conditional statements and looping statements. [Set-1,April –
2018-R16].
3. Write about the role of JVM, JAVA API in developing the platform independent java program with suitable
example. [Set-2,April – 2018-R16].
4. What are the two control structures used in java for making decisions? Explain with an example program.
[Set-2,April – 2018-R16].
5. Write a java program that inputs an integer, ‘n’ from the command line and displays the string
“1+2+3+…+n=sum” and also compute the sum. [Set-3, April –18-R13].
6. How to implement precedence rules and associativity in java language? Give an example. [Set-3, April –
18-R13].
7. What are the different primitive data types in java? Give their sizes in bits. How they are different from
reference data types? [Set-4, April –18-R13].
8. Write a java program to illustrate the increment & decrement operators, shift operators and ternary operator.
[Set-4, April –18-R13].

UNIT-1 JAVA PROGRAMMING Page 2


2018 Spectrum
Rankings:

UNIT-1 JAVA PROGRAMMING Page 3


2017 spectrum rankings

2016 spectrum rankings

UNIT-1 JAVA PROGRAMMING Page 4


PROCEDURAL AND OBJECT-ORIENTED LANGUAGES
• Programs are made up of modules, which are parts of a program that can be coded and tested
separately, and then assembled to form a complete program.
• In procedural languages (i.e. C) these modules are procedures, where a procedure is a sequence of
statements.
• The design method used in procedural programming is called Top Down Design.
• The difficulties with this type of programming, is that software maintenance can be difficult and
time consuming. When changes are made to the main procedure (top), those changes can cascade
to the sub procedures of main, and the sub-sub procedures and so on, where the change may impact
all procedures in the pyramid.
• It is very difficult to represent real time problems in procedural languages.
• One alternative to procedural programming is object oriented programming.
• In object oriented programming, the main modules in a program are classes, rather than
procedures. The object-oriented approach lets you create classes and objects that model real world
objects.
• Object-oriented programming is a programming paradigm that uses abstraction (in the form of
classes and objects) to create models based on the real world environment.
• An object-oriented application uses a collection of objects, which communicate by passing
messages to request services.
• Objects are capable of passing messages, receiving messages, and processing data.

Procedural oriented programming Object oriented programming


In POP, program is divided into small parts In OOP, program is divided into parts
called functions. called objects.
In POP, Importance is not given to data but to In OOP, Importance is given to the data rather than
functions as well as sequence of actions to be procedures or functions because it works as a real
done. world.
POP follows Top Down approach. OOP follows Bottom Up approach.
POP does not have any access specifier. OOP has access specifiers named Public, Private,
Protected, etc.
In POP, Data can move freely from function to In OOP, objects can move and communicate with
function in the system. each other through member functions.
In POP, Data can move freely from function to In OOP, objects can move and communicate with
function in the system. each other through member functions.
To add new data and function in POP is not so OOP provides an easy way to add new data and
easy. function.
POP does not have any proper way for hiding data OOP provides Data Hiding so provides more
so it is less secure. security.

UNIT-1 JAVA PROGRAMMING Page 5


Example: C, VB, FORTRAN, Pascal. Example: C++, JAVA, C#

Introduction

This tutorial will help you to understand about Java OOP’S concepts with examples. Let’s discuss what are
the features of Object Oriented Programming. Writing object-oriented programs involves creating classes,
creating objects from those classes, and creating applications, which are stand-alone executable programs
that use those objects.

A class is a template, blueprint, or contract that defines what an object’s data fields and methods will be.
An object is an instance of a class. You can create many instances of a class. A Java class uses variables to
define data fields and methods to define actions. Additionally, a class provides methods of a special type,
known as constructors, which are invoked to create a new object. A constructor can perform any action, but
constructors are designed to perform initializing actions, such as initializing the data fields of objects.

Objects are made up of attributes and methods. Attributes are the characteristics that define an object; the
values contained in attributes differentiate objects of the same class from one another. To understand this
better let’s take the example of Mobile as an object. Mobile has characteristics like a model, manufacturer,
cost, operating system etc. So if we create “Samsung” mobile object and “IPhone” mobile object we can
distinguish them from characteristics. The values of the attributes of an object are also referred to as the
object’s state.

UNIT-1 JAVA PROGRAMMING Page 6


There are three key features of OOPS.
1) Encapsulation
2) Inheritance
3) Polymorphism
Encapsulation
Encapsulation means putting together all the variables (instance variables) and the methods into a single
unit called Class. It also means hiding data and methods within an Object. Encapsulation provides the
security that keeps data and methods safe from inadvertent changes. Programmers sometimes refer to
encapsulation as using a “black box,” or a device that you can use without regard to the internal
mechanisms. A programmer can access and use the methods and data contained in the black box but cannot
change them. Below example shows Mobile class with properties, which can be set once while creating
object using constructor arguments. Properties can be accessed using getXXX() methods which are having
public access modifiers.
package oopsconcept;
public class Mobile {
private String manufacturer;
private String operating_system;
public String model;
private int cost;
//Constructor to set properties/characteristics of object
Mobile(String man, String o,String m, int c){
this.manufacturer = man;
this.operating_system=o;
this.model=m;
this.cost=c;
}
//Method to get access Model property of Object
public String getModel(){
return this.model;
}
// We can add other method to get access to other properties
}
Inheritance
An important feature of object-oriented programs is inheritance—the ability to create classes that share the
attributes and methods of existing classes, but with more specific features. Inheritance is mainly used for
code reusability. So you are making use of already written the classes and further extending on that. That
why we discussed the code reusability the concept. In general one line definition, we can tell that deriving a
new class from existing class, it’s called as Inheritance. You can look into the following example for
inheritance concept. Here we have Mobile class extended by other specific class like Android and
Blackberry.
package oopsconcept;
public class Android extends Mobile{
//Constructor to set properties/characteristics of object
Android(String man, String o,String m, int c){
super(man, o, m, c);
}
//Method to get access Model property of Object
public String getModel(){
return "This is Android Mobile- " + model;
}
}

UNIT-1 JAVA PROGRAMMING Page 7


package oopsconcept;
public class Blackberry extends Mobile{
//Constructor to set properties/characteristics of object
Blackberry(String man, String o,String m, int c){
super(man, o, m, c);
}
public String getModel(){
return "This is Blackberry-"+ model;
}
}
Polymorphism
In Core, Java Polymorphism is one of easy concept to understand. Polymorphism definition is that Poly
means many and morphos means forms. It describes the feature of languages that allows the same word or
symbol to be interpreted correctly in different situations based on the context. There are two types of
Polymorphism available in Java. For example, in English, the verb “run” means different things if you use
it with “a footrace,” a “business,” or “a computer.” You understand the meaning of “run” based on the
other words used with it. Object-oriented programs are written so that the methods having the same name
works differently in different context. Java provides two ways to implement polymorphism.
Static Polymorphism (compile time polymorphism/ Method overloading):
The ability to execute different method implementations by altering the argument used with the method
name is known as method overloading. In below program, we have three print methods each with different
arguments. When you properly overload a method, you can call it providing different argument lists, and
the appropriate version of the method executes.
package oopsconcept;
class Overloadsample {
public void print(String s){
System.out.println("First Method with only String- "+ s);
}
public void print (int i){
System.out.println("Second Method with only int- "+ i);
}
public void print (String s, int i){
System.out.println("Third Method with both- "+ s + "--" + i);
}
}
public class PolymDemo {
public static void main(String[] args) {
Overloadsample obj = new Overloadsample();
obj.print(10);
obj.print("Amit");
obj.print("Hello", 100);
}
}

Output :

UNIT-1 JAVA PROGRAMMING Page 8


Dynamic Polymorphism (run time polymorphism/ Method Overriding)

When you create a subclass by extending an existing class, the new subclass contains data and methods that
were defined in the original superclass. In other words, any child class object has all the attributes of its
parent. Sometimes, however, the superclass data fields and methods are not entirely appropriate for the
subclass objects; in these cases, you want to override the parent class members. Let’s take the example
used in inheritance explanation.

package oopsconcept;
public class OverridingDemo {
public static void main(String[] args) {
//Creating Object of SuperClass and calling getModel Method
Mobile m = new Mobile("Nokia", "Win8", "Lumia",10000);
System.out.println(m.getModel());
//Creating Object of Sublcass and calling getModel Method
Android a = new Android("Samsung", "Android", "Grand",30000);
System.out.println(a.getModel());
//Creating Object of Sublcass and calling getModel Method
Blackberry b = new Blackberry("BlackB", "RIM", "Curve",20000);
System.out.println(b.getModel());
}
}
Abstraction
All programming languages provide abstractions. It can be argued that the complexity of the problems
you’re able to solve is directly related to the kind and quality of abstraction. An essential element of object-
oriented programming is an abstraction. Humans manage complexity through abstraction. When you drive
your car you do not have to be concerned with the exact internal working of your car(unless you are a
mechanic). What you are concerned with is interacting with your car via its interfaces like steering wheel,
brake pedal, accelerator pedal etc. Various manufacturers of car have different implementation of the car
working but its basic interface has not changed (i.e. you still use the steering wheel, brake pedal,
accelerator pedal etc to interact with your car). Hence the knowledge you have of your car is abstract.

A powerful way to manage abstraction is through the use of hierarchical classifications. This allows you to
layer the semantics of complex systems, breaking them into more manageable pieces. From the outside, a
car is a single object. Once inside, you see that the car consists of several subsystems: steering, brakes,
sound system, seat belts, heating, cellular phone, and so on. In turn, each of these subsystems is made up of
more specialized units. For instance, the sound system consists of a radio, a CD player, and/or a tape
player. The point is that you manage the complexity of the car (or any other complex system)through the
use of hierarchical abstractions.

An abstract class is something which is incomplete and you can not create an instance of the abstract class.
If you want to use it you need to make it complete or concrete by extending it. A class is called concrete if
it does not contain any abstract method and implements all abstract method inherited from abstract class or

UNIT-1 JAVA PROGRAMMING Page 9


interface it has implemented or extended. By the way, Java has a concept of abstract classes, abstract
method but a variable can not be abstract in Java.

Let's take an example of Java Abstract Class called Vehicle. When I am creating a class called Vehicle, I
know there should be methods like start() and Stop() but don't know start and stop mechanism of every
vehicle since they could have different start and stop mechanism e.g some can be started by a kick or some
can be by pressing buttons.

The advantage of Abstraction is if there is a new type of vehicle introduced we might just need to add one
class which extends Vehicle Abstract class and implement specific methods. The interface of start and stop
method would be same.

package oopsconcept;
public abstract class VehicleAbstract {
public abstract void start();
public void stop(){
System.out.println("Stopping Vehicle in abstract class");
}
}
class TwoWheeler extends VehicleAbstract{
@Override
public void start() {
System.out.println("Starting Two Wheeler");
}
}
class FourWheeler extends VehicleAbstract{
@Override
public void start() {
System.out.println("Starting Four Wheeler");
}
}
package oopsconcept;
public class VehicleTesting {
public static void main(String[] args) {
VehicleAbstract my2Wheeler = new TwoWheeler();
VehicleAbstract my4Wheeler = new FourWheeler();
my2Wheeler.start();
my2Wheeler.stop();
my4Wheeler.start();
my4Wheeler.stop();
}
}

Output :

UNIT-1 JAVA PROGRAMMING Page 10


Summary

• An object is an instance of a class.


• Encapsulation provides the security that keeps data and methods safe from inadvertent changes.
• Inheritance is a parent-child relationship of a class which is mainly used for code reusability.
• Polymorphism definition is that Poly means many and morphos means forms.
• Using abstraction, one can simulate real world objects.
• Abstraction provides advantage of code reuse
• Abstraction enables program open for extension

Applications of OOP:
The promising areas includes the followings,

1. Real Time Systems Design


2. Simulation and Modeling System
3. Object Oriented Database
4. Object Oriented Distributed Database
5. Client-Server System
6. Hypertext, Hypermedia
7. Neural Networking and Parallel Programming
8. Decision Support and Office Automation Systems
9. CIM/CAD/CAM Systems
10. AI and Expert Systems

The History of Java


Java was conceived by James Gosling, Patrick Naughton, Chris Warth, Ed Frank, and Mike Sheridan at
Sun Microsystems, in 1991. It took 18 months to develop the first working version.

This language was initially called “Oak”, (Oak is a tree name). By default the name “Oak” is registered by
some other company, so it is renamed as “Java” in 1995.

The primary motivation was the need for a platform-independent (that is, architecture-neutral) language
that could be used to create software to be embedded in various consumer electronic devices, such as
microwave ovens and remote controls.

The trouble with C and C++ (and most other languages) is that they are designed to be compiled for a
specific target. Although it is possible to compile a C++ program for just about any type of CPU, to do so
requires a full C++ compiler targeted for that CPU. The problem is that compilers are expensive and time-
consuming to create.

An easier—and more cost-efficient—solution was needed. In an attempt to find such a solution, Gosling
and others began work on a portable, platform-independent language that could be used to produce code
that would run on a variety of CPUs under differing environments. This effort ultimately led to the creation
of Java.

Java’s importance to the Internet


Java is the language which is very important for internet. Java has a profound effect on the Internet.
The reason for its importance is: Java expands objects that can move about freely in cyberspace. In a

UNIT-1 JAVA PROGRAMMING Page 11


network, two very broad categories of objects are transmitted between the server and the personal
computer: passive information and dynamic, active programs.
For example, JAVA LANGUAGE
• Reading an e-mail, is viewing passive data. Even when the program is downloaded, the program’s
code is still only passive data until it is executed.
• However, a second type of object can be transmitted is a dynamic, self-executing program. Such a
program is an active agent on the client computer, yet is initiated by the server. For example, a
program might be provided by the server to display properly the data that the server is sending.
Dynamic programs which are transmitted over the internet are suffering from two challenges: Security
and portability.

Java Applets and Applications


Java can be used to create two types of programs:
• Applications and
• Applets.

An application is a program that runs on your computer, under the operating system of that
computer. That is, an application created by Java is more or less like one created using C or C++. The
ability to create applets makes java as an important language.

An applet is an application designed to be transmitted over the Internet and executed by a Java-
compatible Web browser. An applet is actually a tiny Java program, dynamically downloaded across the
network, just like an image, sound file, or video clip. In other words, an applet is a program that can react
to user input and dynamically change.

Security:
➢ Security is the main problem when program is transmitted over internet. When a program is
downloaded there is chance of a viral infection.
➢ Prior to Java, most users did not download executable programs frequently, and those who
downloaded, scanned them for viruses prior to execution.
➢ In addition to viruses, another type of malicious program, that can gather private information, such
as credit card numbers, bank account balances, and passwords, by searching the contents of your
computer’s local file system.
➢ Java answers both of these concerns. When a Java-compatible Web browser is used, one can freely
download Java applets without fear of viral infection or malicious intent.
➢ Java achieves this protection by confining a Java program to the Java execution environment and
not allowing it access to other parts of the computer.

Portability
As discussed earlier, many types of computers and operating systems are in use throughout the
world—and many are connected to the Internet. For programs to be dynamically downloaded to all the
various types of platforms connected to the Internet, some means of generating portable executable code is
needed. Java is also a portable language.
Indeed, Java’s solution to these two problems is both elegant and efficient with the use of java byte code
and JVM.

UNIT-1 JAVA PROGRAMMING Page 12


Servlets:
Servlets are small programs that execute automatically at the server. Servlets dynamically extend
the functionality of a Web server. Servlets extend a server’s functionality by allowing the server to generate
dynamic content.

Typical Java Development Environment


Java programs normally go through five phases—
• Edit(create)
• compile,
• load,
• verify and
• execute.

Phase 1: Creating a Program


Phase 1 consists of editing a file with an editor. Type a Java program (typically referred to as
source code) using the editor, make any necessary corrections and save the program with the .java
extension, indicates that the file contains Java source code.

Phase 2: Compiling a Java Program into Bytecodes


In Phase 2, use the command javac to compile a program. For example, to compile a program
called Welcome.java, type
➢ javac Welcome.java
in the command window of your system. If the program compiles, the compiler produces a .class file called
Welcome.class that contains the compiled version of the program. The Java compiler translates Java source
code into bytecodes.

UNIT-1 JAVA PROGRAMMING Page 13


Phase 3: Loading a Program into Memory
In Phase 3, the program must be placed in memory to execute. This is known as loading. The class
loader takes the .class files containing the program’s bytecodes and transfers them to primary memory.
The class loader also loads any of the .class files provided by Java that the program uses.

Phase 4: Bytecode Verification


In Phase 4, as the classes are loaded, the bytecode verifier examines their bytecodes to ensure that
they are valid and do not violate Java’s security restrictions. Java enforces strong security, to make sure
that Java programs arriving over the network do not damage other files on the system (as computer viruses
and worms might).

Phase 5: Execution
In Phase 5, the JVM executes the program’s bytecodes, thus performing the actions specified by the
program. The JVM is invoked by the java command. For example, to execute a Java application called
Welcome, type the command
➔ java Welcome
in a command window to invoke the JVM, which would then initiate the steps necessary to execute the
application.

Java Virtual Machine and byte code:


Byte code:

Byte code is nothing but the intermediate representation of Java source code which is produced by the Java
compiler by compiling that source code.

This byte code is an machine independent code. It is not completely a compiled code but it is an
intermediate code which is later interpreted and executed by JVM.

Byte code is a machine code for JVM. But the machine code is platform specific whereas bytecode is
platform independent that is the main difference between them. It is stored in .class file which is created
after compiling the source code.

JVM Architecture Diagram

UNIT-1 JAVA PROGRAMMING Page 14


How JVM works in Java ?
As shown in the above architecture diagram JVM is divided into three main subsystems
1. Class Loader Subsystem
2. Runtime Data Area
3. Execution Engine
1. Class Loader Subsystem
Java’s dynamic class loading functionality is handled by the class loader subsystem. It loads, links and
initializes the class when it refers to a class for the first time at runtime, not at compile-time. It performs
three major functionality such as Loading, Linking, and Initialization.
1.1 Loading
Classes will be loaded by this component. BootStrap ClassLoader, Extension ClassLoader, Application
ClassLoader are the three-class loader which will help in achieving it.
1. BootStrap ClassLoader – Responsible for loading classes from the bootstrap classpath, nothing
but rt.jar. Highest priority will be given to this loader.
2. Extension ClassLoader – Responsible for loading classes which are inside extfolder (jre\lib)
3. Application ClassLoader –Responsible for loading Application Level Classpath, path mentioned
Environment Variable etc.
The above Class Loaders will follow Delegation Hierarchy Algorithm while loading the class files.

UNIT-1 JAVA PROGRAMMING Page 15


1.2 Linking
1. Verify – Bytecode verifier will verify whether the generated bytecode is proper or not if
verification fails, we will get verification error.
2. Prepare – For all static variable’s memory will be allocated and assigned with default values.
3. Resolve –All symbolic memory references are replaced with the original
references from Method Area.
1.3 Initialization
This is the final phase of Class Loading, here all static variable will be assigned with the original values
and static block will be executed.
2. Runtime Data Area
Runtime Data Area is divided into 5 major components
1. Method Area – All the Class level data will be stored here including static variables. Method
Area is one per JVM and it is a shared resource.
2. Heap Area – All the Objects and its corresponding instance variables and arrays will be stored
here. Heap Area is also one per JVM since Method area and Heap area shares memory for
multiple threads the data stored is not thread safe.
3. Stack Area – For every thread, a separate runtime stack will be created. For every method call,
one entry will be made in the stack memory which is called as Stack Frame. All local variables will
be created in the stack memory. Stack area is thread safe since it is not a shared resource. Stack
Frame is divided into three sub-entities such as
1. Local Variable Array – Related to the method how many local variables are involved and
the corresponding values will be stored here.
2. Operand stack – If any intermediate operation is required to perform, operand stack act as
runtime workspace to perform the operation.
3. Frame data – All symbols corresponding to the method is stored here. In the case of
any exception, the catch block information will be maintained in the frame data.
4. PC Registers – Each thread will have separate PC Registers, to hold address of current executing
instruction once the instruction is executed the PC register will be updated with the next instruction
5. Native Method stacks – Native Method Stack holds native method information. For every
thread, separate native method stack will be created.
3. Execution Engine
The bytecode which is assigned to the Runtime Data Area will be executed by the Execution Engine. The
Execution Engine reads the byte code and executes one by one.
1. Interpreter – Reads the bytecode, interprets it and executes it one by one. The interpreter interprets
the bytecode faster but executes slowly. The disadvantage of the interpreter is that when one method
called multiple times, every time interpretation is required.
2. JIT Compiler – JIT Compiler neutralizes the disadvantage of the Interpreter ( a single method
called multiple times, each time interpretation is required ), The Execution Engine will be using the
help of Interpreter in converting but when it found repeated code it uses JIT compiler which
compiles the entire bytecode and changes it to native code. This native code will be used directly for
repeated method calls which improve the performance of the system.
1. Intermediate Code generator – produces intermediate code
2. Code Optimizer – Code Optimizer is responsible for optimizing the intermediate code
generated above
3. Target Code Generator – Target Code Generator is responsible for Generating Machine
Code/ Native Code

UNIT-1 JAVA PROGRAMMING Page 16


4. Profiler – Profiler is a special component, it is responsible for finding the hotspots (i.e)
Used to identify whether the method is called multiple time or not.
3. Garbage Collector: Garbage Collector is a part of Execution Engine, it collects/removes the
unreferenced objects. Garbage Collection can be triggered by calling “System.gc()”, but the
execution is not guaranteed. Garbage collector of JVM collects only those objects that are created
by new keyword. So, if you have created any object without new, you can use finalize method to
perform cleanup.
Java Native Interface (JNI): JNI will be interacting with the Native Method Libraries and provides the
Native Libraries required for the Execution Engine.
Native Method Libraries: It is a Collection of the Native Libraries which is required for the Execution
Engine.
(Or)

JVM :
JVM (Java Virtual Machine) is an abstract machine. It is a specification that provides runtime environment
in which java bytecode can be executed.

JVMs are available for many hardware and software platforms. JVM and JRE are platform dependent
because configuration of each OS differs. But, Java is platform independent.
The JVM performs following main tasks:

• Loads code
• Verifies code
• Executes code
• Provides runtime environment

Features of Java (java buzzwords)


Following are the important features of java:

1. Simple
2. Secure
3. Portable

UNIT-1 JAVA PROGRAMMING Page 17


4. Object-oriented
5. Robust
6. Multithreaded
7. Architecture-neutral
8. Interpreted
9. High performance
10. Distributed
11. Dynamic

Simple

➢ Java is a simple programming language. Java was designed to be easy for the programmer to learn
and use effectively.
➢ Java is very easy to understand because Java inherits the C/C++ syntax and many of the object-
oriented features of C++.
➢ Some of the more confusing concepts from C++ like pointers and multiple inheritance are
eliminated from Java.
Object-Oriented

➢ Java is a pure object oriented programming language. In java “everything is an object”.


➢ An object is any thing that really exists can be different from others. Examples are book, student,
account e.t.c.
➢ Each object has properties and behaviors that are implemented inside class.
➢ The object model in Java is simple and easy to extend, while simple types, such as integers, are kept
as high-performance non-objects.
Robust

➢ Java programs are robust (strong) because they don’t crash easily like C or C++.
➢ Two of the main reasons for program failure are: memory management mistakes and mishandled
exceptional conditions (that is, run-time errors).
Java programs are robust because of two reasons:
1. Excellent exception handling
2. Proper memory management

An Exception is a run time error such as “divide by zero”, “file not found” e.t.c. Due to exceptions
data will be lost. Java helps in this area by providing object-oriented exception handling to handle all run-
time errors.
Memory management can be a difficult, tedious task in traditional programming environments like
C/C++. In C/C++, the programmer must manually allocate and free all dynamic memory. Java virtually
eliminates memory management problems by managing memory allocation and deallocation . (In fact,
deallocation is completely automatic, because Java provides garbage collection for unused objects.)
Architecture-Neutral

UNIT-1 JAVA PROGRAMMING Page 18


➢ A language or technology is said to be architecture neutral when it can be execute on any available
processor irrespective of their architecture.
➢ A central issue for the Java designers was that of code longevity and portability.
➢ One of the main problems facing programmers is that if a program written today may not work
tomorrow on the same machine.
➢ Operating system upgrades, processor upgrades, and changes in core system resources can all
combine to make a program malfunction. Java Virtual Machine altered this situation.
➢ The concept of java is, “write once; run anywhere, any time, forever.”
Interpreted and High Performance

Java enables the creation of cross-platform programs by compiling into an intermediate code called
Java byte-code. This byte code can be interpreted on any system that provides a Java Virtual Machine.
Other interpreted systems, such as BASIC, Tcl, and PERL, suffer from performance deficits. Java is
designed to perform well on very low-power CPUs.
The Java bytecode was carefully designed so that it would be easy to translate directly into native
machine code for very high performance by using a just-in-time compiler. So java is a “High-performance
cross-platform” language.
Distributed

➢ On internet information is distributed between various computers. Java is designed for the distributed
environment of the Internet, because it handles TCP/IP protocols.
➢ In java objects from two different computers allows to access methods remotely. Java supports
Remote Method Invocation (RMI) which enables a program to invoke methods across the network.
➢ This feature brings an unparalleled level of abstraction to client/ server programming.
Dynamic
Java programs carry with them substantial amounts of run-time type information that is used to
verify and resolve accesses to objects at run time. This makes it possible to dynamically link code in a safe
manner. This is crucial to the robustness of the applet environment, in which small fragments of bytecode
may be dynamically updated on a running system.

Multithreaded
➢ Multithreading is the ability of an application to perform more than one task at a time.
➢ A multi-threaded program is one in which there exists multiple flows of control called threads.
➢ A thread represents an individual process to execute a group of statements.
➢ Whenever we write a java program there exists by default two threads.
1. Foreground / child thread
2. Background / main(parent) thread
➢ A fore ground thread is one which always executes user defined subprograms. In a java program
there is a possibility of existing ‘n’ number of foreground threads.
➢ A background thread is one which always monitors the status of foreground threads. In each and
every java program there exists only one background thread.
➢ First background thread will be created, and later foreground threads will be created.
Portable:

UNIT-1 JAVA PROGRAMMING Page 19


➢ A portable language is one which can run on all operating systems and on all processors
irrespective of their architectures.
➢ Portable means platform independent and architecture neutral. Java is a portable language, where as
C/C++ are treated as non-portable languages.
Secure:
➢ Security is the main problem when program is transmitted over internet. When a program is
downloaded there is chance of a viral infection.
➢ Prior to Java, most users did not download executable programs frequently, and those who
downloaded, scanned them for viruses prior to execution.
➢ In addition to viruses, another type of malicious program, that can gather private information, such
as credit card numbers, bank account balances, and passwords, by searching the contents of your
computer’s local file system.
➢ Java answers both of these concerns. When a Java-compatible Web browser is used, one can freely
download Java applets without fear of viral infection or malicious intent.
➢ Java achieves this protection by confining a Java program to the Java execution environment and
not allowing it access to other parts of the computer
Java.lang package in Java
Provides classes that are fundamental to the design of the Java programming language. The most important
classes are Object, which is the root of the class hierarchy, and Class, instances of which represent classes
at run time.
Following are the some of the important Classes in Java.lang package :

S.No Class Description


1 Boolean The Boolean class wraps a value of the primitive type boolean in an object.
2 Byte The Byte class wraps a value of primitive type byte in an object.
3 Character The Character class wraps a value of the primitive type char in an object.
4 Compiler The Compiler class is provided to support Java-to-native-code compilers and
related services.
5 Double The Double class wraps a value of the primitive type double in an object.
6 Enum This is the common base class of all Java language enumeration types.
7 Float The Float class wraps a value of primitive type float in an object.
8 Integer The Integer class wraps a value of the primitive type int in an object.
9 Long The Long class wraps a value of the primitive type long in an object.
10 Math The class Math contains methods for performing basic numeric operations such
as the elementary exponential, logarithm, square root, and trigonometric
functions.
11 Number The abstract class Number is the superclass of classes BigDecimal, BigInteger,
Byte, Double, Float, Integer, Long, and Short.
12 Object Class Object is the root of the class hierarchy.
13 Package Package objects contain version information about the implementation and
specification of a Java package.
14 Process The ProcessBuilder.start() and Runtime.exec methods create a native process
and return an instance of a subclass of Process that can be used to control the
process and obtain information about it.
15 Runtime Every Java application has a single instance of class Runtime that allows the

UNIT-1 JAVA PROGRAMMING Page 20


application to interface with the environment in which the application is
running.
16 Short The Short class wraps a value of primitive type short in an object.
17 String The String class represents character strings.
18 StringBuffer A thread-safe, mutable sequence of characters.
19 StringBuilder A mutable sequence of characters.
20 System The System class contains several useful class fields and methods.
21 Thread A thread is a thread of execution in a program.
22 Void The Void class is an un-instantiable placeholder class to hold a reference to the
Class object representing the Java keyword void.

First Simple Program


Entering the Program
Java is a case sensitive language. The name you give to a source file is very important. For this
example, the name of the source file should be Example.java. The Java compiler requires that a source file
use the .java filename extension.

/* simple java program */


import java.lang.*;
class Example
{
public static void main (String args[])
{
System.out.println("Welcome to java");
}
}

The name of the class defined by the program is also Example. In Java, all code must reside inside a class.
By convention, the name of that class should match the name of the file that holds the program.

Comments
The contents of a comment are ignored by the compiler.
Java supports three styles of comments.
• Single line comment: //
• Multiline comment: /* ………….. */
• Documentation comment: /** ……….. */. This type of comment is used to produce an HTML file
that documents your program. This type of comment is readable to both, computer and human.

Defining a class
This line uses the keyword class to declare that a new class is being defined. Example is an
identifier that is the name of the class. The entire class definition, including all of its members, will be
between the opening curly brace and the closing curly brace ({, }).
public static void main(String args[])
This is the line at which the program will begin executing. All Java applications begin execution by
calling main( ).

UNIT-1 JAVA PROGRAMMING Page 21


The public keyword is an access specifier. When a class member is preceded by public, then that
member may be accessed by code outside the class in which it is declared. (private and protected are other
access specifiers).

The function main( ) must be declared as public, since it must be called by code outside of its class when
the program is started.

The keyword static allows main( ) to be called without having to instantiate a particular instance of the
class. This is necessary since main( ) is called by the Java interpreter before any objects are made.

Java compiler will compile classes that do not contain a main( ) method. But the Java interpreter has no
way to run these classes. In applets you won’t use main( ).

The keyword void simply tells the compiler that main( ) does not return a value.

In main( ), there is only one parameter. String args[ ] declares a parameter named args, which is an array
of instances of the class String. (Arrays are collections of similar objects.) Objects of type String store
character strings. In this case, args receives any command-line arguments present when the program is
executed.

To display output
System.out.println("Welcome to Java");
This line outputs the string “Welcolme to java” followed by a new line on the screen. Output is actually
accomplished by the built-in println( ) method. In this case, println( ) displays the string which is passed
to it. The line begins with System.out. in which System is a predefined class that provides access to the
system, and out is the output stream that is connected to the console.

Note:
➢ Every statement in Java ends with a semicolon.
➢ Java is a case sensitive language.

System.out.println()
num = 100;
System.out.println("This is num: " + num);
The first line declares an integer variable called num assigns to num the value 100. The next line of code
outputs the value of num preceded by the string “This is num:”.

In this statement, the plus sign causes the value of num to be appended to the string that precedes it, and
then the resulting string is output. (Actually, num is first converted from an integer into its string
equivalent and then concatenated with the string that precedes it.

Using the + operator, you can string together as many items as you want within a single println( )
statement.
The built-in method print( ) is just like println( ), except that it does not output a newline character
System.out.print("Example to display output ");

UNIT-1 JAVA PROGRAMMING Page 22


Note
Both print( ) and println( ) can be used to output values of any of Java’s built-in types.
Compiling and executing the Program
To compile the Example program, execute the following command at command prompt:
C:\>javac Example.java
The javac compiler creates a file called Example.class that contains the bytecode version of the program.
The Java bytecode is the intermediate representation of a program that contains instructions the Java
interpreter will execute. The output of javac is not code that can be directly executed.
To actually run the program, use the Java interpreter, called java. To do so, pass the class name Example
as a command-line argument, as shown here:

C:\>java Example
When the program is run, the following output is displayed:
Welcome to java
Data types
Java is a Strongly Typed Language.
1. Every variable has a type, every expression has a type, and every type is strictly defined.
2. All assignments, whether explicit or via parameter passing in method calls, are checked for type
compatibility.

Java defines eight primitive types of data: byte, short, int, long, char, float, double, and Boolean.
These can be put in four groups:
■ Integers: This group includes byte, short, int, and long, which are for whole valued signed numbers.
■ Floating-point numbers: This group includes float and double, which represent numbers with
fractional precision.
■ Characters: This group includes char, which represents symbols in a character set, like letters and
numbers.
■ Boolean: This group includes boolean, which is a special type for representing true/false values.

In C and C++ allow the size of an integer to vary based upon the execution environment. Because of Java’s
portability requirement, all data types have a strictly defined range. For example, an int is always 32 bits,
regardless of the particular platform

a. Integers:
Java defines four integer types: byte, short, int, and long. All of these are signed, positive and
negative values. Bytes and shorts are 32-bit values to improve performance, The width and ranges
of these integer types vary widely, as shown in this table:

Name width Range


Long 64 –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
Int 32 –2,147,483,648 to 2,147,483,647
byte 8 –128 to 127
short 16 –32,768 to 32,767
Byte

UNIT-1 JAVA PROGRAMMING Page 23


The smallest integer type is byte. This is a signed 8-bit type that has a range from –128 to 127. Variables of
type byte are useful when working with a stream of data from a network or file Byte variables are declared
by use of the byte keyword.
Example: byte b, c;
short
short is a signed 16-bit type. It has a range from –32,768 to 32,767. It is probably the least-used Java type,
since it is defined as having its high byte first (called big-endian format).

Example: short s;
short t;
int
The most commonly used integer type is int. It is a signed 32-bit type that has a range from –
2,147,483,648 to 2,147,483,647. Variables of type int are commonly employed to control loops and to
index arrays. The int type is the most versatile and efficient type.
Long:
long is a signed 64-bit type and is useful for those occasions where an int type is not large enough to
hold the desired value. The range of a long is quite large.
b. Floating-Point Types

Floating-point numbers, also known as real numbers, are used when evaluating expressions that
require fractional precision. For example: square root of a value. There are two kinds of floating-point
types, float and double, which represent single- and double-precision numbers, respectively.
Name Width Range
Double 64 4.9e–324 to 1.8e+308
Float 32 1.4e−045 to 3.4e+038

float
The type float specifies a single-precision value that uses 32 bits of storage. Variables of type float are
useful when you need a fractional component, but don’t require a large degree of precision.
Example: float hightemp, lowtemp;
double
Double precision, as denoted by the double keyword, uses 64 bits to store a value. All transcendental math
functions, such as sin( ), cos( ), and sqrt( ), return double values. When you need to maintain accuracy
over many iterative calculations double is the best choice.

Example: A java program to find area of a circle

class Area{
public static void main(String args[]) {
double pi, r, a;
r = 10.8;
pi = 3.1416;
a = pi * r * r;
System.out.println("Area of circle is " + a);
}
}

UNIT-1 JAVA PROGRAMMING Page 24


c. character types
In Java, the data type used to store characters is char. In C/C++, char is an integer type that is 8 bits wide.
Instead, Java uses Unicode to represent characters. In Java char is a 16-bit type. The range of a char is 0 to
65,536. There are no negative chars.
Example:
class CharDemo {
public static void main(String args[]){
char ch1, ch2;
ch1 = 88; // code for X
ch2 = 'Y';
System.out.print("ch1 and ch2: ");
System.out.println(ch1 + " " + ch2);
}
}
This program displays the output: ch1 and ch2: X Y
d. Booleans
Java has a simple type, called boolean, for logical values. It can have only one of two possible values, true
or false. This is the type returned by all relational operators, such as a < b.

Example: Boolean result= true;

// Demonstrate boolean values.


class BoolTest {
public static void main(String args[]) {
boolean b;
b = false;
System.out.println("b is " + b);
b = true;
System.out.println("b is " + b);
// a boolean value can control the if statement
if(b)
System.out.println("This is executed.");
b = false;
if(b)
System.out.println("This is not executed.");
// outcome of a relational operator is a boolean value
System.out.println("10 > 9 is " + (10 > 9));
}
}
The output generated by this program is shown here:
b is false
b is true
This is executed.
10 > 9 is true

Variables

UNIT-1 JAVA PROGRAMMING Page 25


The variable is the basic unit of storage in a Java program. A variable is defined by the combination
of an identifier, a type, and an optional initializer. In addition, all variables have a scope, which defines
their visibility, and a lifetime.

Declaring a Variable
A variable must be declared before it is used.
The basic form of a variable declaration is:
type identifier [ = value][, identifier [= value] ...] ;
➢ The type is one of Java’s atomic types, or the name of a class or interface.
➢ The identifier is the name of the variable.
➢ The variable can be initialized by specifying an equal sign and a value.
➢ Keep in mind that the initialization expression must result in a value of the same type as that
specified for the variable.
➢ To declare more than one variable of the specified type, use a comma-separated list.

Example:

int a, b, c;
int d = 3, e, f = 5; // declares three more ints, initializing
byte z = 22; // initializes z.
double pi = 3.14159; // declares an approximation of pi.
char x = 'x'; // the variable x has the value 'x'.

Dynamic Initialization
Java allows variables to be initialized dynamically, using any expression valid at the time the
variable is declared.
A short program that computes the length of the hypotenuse of a right triangle given the lengths of its two
opposing sides:
class DynInit {
public static void main(String args[]) {
double a = 3.0, b = 4.0;

// c is dynamically initialized
double c = Math.sqrt(a * a + b * b);

System.out.println("Hypotenuse is " + c);


}
}
Here, three local variables—a, b,and c—are declared. The first two, a and b, are initialized by constants.
However, c is initialized dynamically.
The Scope and Lifetime of Variables

➢ Java allows variables to be declared within any block. A block is begun with an opening curly brace
and ended by a closing curly brace.

UNIT-1 JAVA PROGRAMMING Page 26


➢ A block defines a scope. Thus, each time you start a new block, you are creating a new scope. A
scope determines what objects are visible to other parts of your program. It also determines the
lifetime of those objects.
➢ In Java, the two major scopes are those defined by a class and those defined by a method.
➢ As a general rule, variables declared inside a scope are not visible (that is, accessible) to code that is
defined outside that scope. Thus, when you declare a variable within a scope, you are localizing
that variable and protecting it from unauthorized access and/or modification. Indeed, the scope rules
provide the foundation for encapsulation.
➢ Scopes can be nested by adding a block with in another block. Variables or objects declared in the
outer scope will be visible to code within the inner scope. However, the reverse is not true.
Variables or objects declared within the inner scope will not be visible outside it.
Example:
class Scope {
public static void main(String args[]) {
int x; // known to all code within main
x = 10;
if(x == 10)
{ // start new scope
THE JAVA LA int y = 20; // known only to this block, x and y both known here.
System.out.println("x and y: " + x + " " + y);
x = y * 2;
}
// y = 100; // Error! y not known here
System.out.println("x is " + x); // x is still known here.
}
}

Here is another important point to remember:


Variables are created when their scope is entered, and destroyed when their scope is left. This
means that a variable will not hold its value once it has gone out of scope. Therefore, variables declared
within a method will not hold their values between calls to that method. Also, a variable declared within a
block will lose its value when the block is left. Thus, the lifetime of a variable is confined to its scope.

class LifeTime {
public static void main(String args[]) {
int x;
for(x = 0; x < 3; x++) {
int y = -1; // y is initialized each time block is entered
System.out.println("y is: " + y); // this always prints -1
y = 100;
System.out.println("y is now: " + y);
}
}
}
The output generated by this program is shown here:
y is: -1
y is now: 100
y is: -1
y is now: 100
UNIT-1 JAVA PROGRAMMING Page 27
y is: -1
y is now: 100
As you can see, y is reinitialized to –1 each time the inner for loop is entered. Even though it
is subsequently assigned the value 100, this value is lost.
Operators :
Most of its operators can be divided into the following four groups: arithmetic, bitwise, relational, and
logical. Java also defines some additional operators that handle certain special situations.

Arithmetic Operators
Arithmetic operators are used in mathematical expressions in the same way that they are used in algebra.
The following table lists the arithmetic operators:

The operands of the arithmetic operators must be of a numeric type. You cannot use them on boolean
types, but you can use them on char types, since the char type in Java is a subset of int.

The Basic Arithmetic Operators


➢ The basic arithmetic operations—addition, subtraction, multiplication, and division— all behave as
you would expect for all numeric types.
➢ The minus operator also has a unary form that negates its single operand.
➢ Remember that when the division operator is applied to an integer type, there will be no fractional
component attached to the result.

The following simple example program demonstrates the arithmetic operators. It also illustrates the
difference between floating-point division and integer division.

// Demonstrate the basic arithmetic operators.

class BasicMath {
public static void main(String args[]) {
// arithmetic using integers
System.out.println("Integer Arithmetic");
int a = 1 + 1;
int b = a * 3;

UNIT-1 JAVA PROGRAMMING Page 28


int c = b / 4;
int d = c - a;
int e = -d;
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("c = " + c);
System.out.println("d = " + d);
System.out.println("e = " + e);
}
}

When you run this program, you will see the following output:

Integer Arithmetic
a=2
b=6
c=1
d = -1
e=1

The Modulus Operator


The modulus operator, %, returns the remainder of a division operation. It can be applied to floating-point
types as well as integer types.

// Demonstrate the % operator.


class Modulus
{
public static void main(String args[])
{
int x = 42;
double y = 42.25;
System.out.println("x mod 10 = " + x % 10);
System.out.println("y mod 10 = " + y % 10);
}
}
output:
x mod 10 = 2
y mod 10 = 2.25

Arithmetic Compound Assignment Operators


Java provides special operators that can be used to combine an arithmetic operation with an assignment are
called compound assignment operators.
a = a + 4;
In Java, you can rewrite this statement as shown here:
a += 4;

This version uses the += compound assignment operator. Both statements perform the same action: they
increase the value of a by 4.

There are compound assignment operators for all of the arithmetic, binary operators.
UNIT-1 JAVA PROGRAMMING Page 29
Thus, any statement of the form
var = var op expression;
can be rewritten as
var op= expression;

The compound assignment operators provide two benefits. First, they save you a bit of typing, because they
are “shorthand” for their equivalent long forms. Second, they are implemented more efficiently by the Java
run-time system than are their equivalent long forms.

class OpEquals {
public static void main(String args[]) {
int a = 1;
int b = 2;
int c = 3;
a += 5;
b *= 4;
c += a * b;
c %= 6;
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("c = " + c);
}
}
output:
a=6
b=8
c=3
Increment and Decrement
The ++ and the – – are Java’s increment and decrement operators.
The increment operator increases its operand by one. The decrement operator decreases its operand by one.
For example, this statement:

x = x + 1;
can be rewritten like this by use of the increment operator: x++;

Similarly, this statement:


x = x - 1; is equivalent to x--;
These operators are unique in that they can appear both in postfix form, where they follow the operand as
just shown, and prefix form, where they precede the operand.

Difference between these two forms:


In the prefix form, the operand is incremented or decremented before the value is obtained for use in the
expression.
In postfix form, the previous value is obtained for use in the expression, and then the operand
is modified.
class IncDec {

UNIT-1 JAVA PROGRAMMING Page 30


public static void main(String args[]) {
int a = 1;
int b = 2;
int c;
int d;
c = ++b;
d = a++;
c++;
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("c = " + c);
System.out.println("d = " + d);
}
}
The output of this program follows:
a=2
b=3
c=4
d=1
The Bitwise Operators

Java defines several bitwise operators that can be applied to the integer types, long, int, short, char, and
byte. These operators act upon the individual bits of their operands.

The Bitwise Logical Operators


The bitwise logical operators are &, |, ^, and ~. The following table shows the outcome of
each operation.

The Bitwise NOT


Also called the bitwise complement, the unary NOT operator, ~, inverts all of the bits of its operand. For
example, the number 42, which has the following bit pattern:

UNIT-1 JAVA PROGRAMMING Page 31


00101010
becomes
11010101 after the NOT operator is applied.

The Bitwise AND


The AND operator, &, produces a 1 bit if both operands are also 1. A zero is produced in all other cases.
Here is an example

00101010 42
& 00001111 15
00001010 10
The Bitwise OR
The OR operator, |, combines bits such that if either of the bits in the operands is a 1, then the resultant bit
is a 1, as shown here:

00101010 42
| 00001111 15
00101111 47

The Bitwise XOR


The XOR operator, ^, combines bits such that if exactly one operand is 1, then the result is 1. Otherwise,
the result is zero.
00101010 42
^ 00001111 15
00100101 37
The Left Shift

The left shift operator, <<, shifts all of the bits in a value to the left a specified number of times.

It has this general form:


value << num
Here, num specifies the number of positions to left-shift the value in value. That is, the << moves all of the
bits in the specified value to the left by the number of bit positions specified by num.

For each shift left, the high-order bit is shifted out (and lost), and a zero is brought in on the right. This
means that when a left shift is applied to an int operand, bits are lost once they are shifted past bit position
31. If the operand is a long, then bits are lost after bit position 63.

Since each left shift has the effect of doubling the original value, programmers frequently use this fact as an
efficient alternative to multiplying by 2.

// Left shifting as a quick way to multiply by 2.


class MultByTwo {
public static void main(String args[]) {
int i;
int num = 0xFFFFFFE;
for(i=0; i<4; i++) {
num = num << 1;
System.out.println(num);

UNIT-1 JAVA PROGRAMMING Page 32


}
}
}
The program generates the following output:
536870908
1073741816
2147483632
-32
The Right Shift

The right shift operator, >>, shifts all of the bits in a value to the right a specified number of times. Its
general form is shown here:
value >> num
Here, num specifies the number of positions to right-shift the value in value. That is, the >> moves all of
the bits in the specified value to the right the number of bit positions specified by num.
When a value has bits that are “shifted off,” those bits are lost. For example, the next code fragment shifts
the value 35 to the right two positions, which causes the two low-order bits to be lost, resulting again in a
being set to 8.

int a = 35;
a = a >> 2; // a still contains 8

Looking at the same operation in binary shows more clearly how this happens:
00100011 35
>> 2
00001000 8
Each time you shift a value to the right, it divides that value by two—and discards any remainder. the
previous contents of the top bit. This is called sign extension and serves to preserve the sign of negative
numbers when you shift them right. For example, –8 >> 1 is –4, which, in binary, is
11111000 –8
>> 1
11111100 –4
It is interesting to note that if you shift –1 right, the result always remains –1, since sign extension keeps
bringing in more ones in the high-order bits.

The Unsigned Right Shift


As you have just seen, the >> operator automatically fills the high-order bit with its previous contents each
time a shift occurs. This preserves the sign of the value. However, sometimes this is undesirable.
For example, if you are shifting something that does not represent a numeric value, you may not want sign
extension to take place. This situation is common when you are working with pixel-based values and
graphics. In these cases, you will generally want to shift a zero into the high-order bit no matter what its
initial value was. This is known as an unsigned shift.

To accomplish this, you will use Java’s unsigned, shift-right operator, >>>, which always shifts zeros into
the high-order bit.

The following code fragment demonstrates the >>>. Here, a is set to –1, which sets all 32 bits to 1 in
binary. This value is then shifted right 24 bits, filling the top 24 bits with zeros, ignoring normal sign
extension. This sets a to 255.

UNIT-1 JAVA PROGRAMMING Page 33


int a = -1;
a = a >>> 24;
Here is the same operation in binary form to further illustrate what is happening:
11111111 11111111 11111111 11111111 –1 in binary as an int
>>>24
00000000 00000000 00000000 11111111 255 in binary as an int
Relational Operators
The relational operators determine the relationship that one operand has to the other.

The outcome of these operations is a boolean value. The relational operators are most frequently used in
the expressions that control the if statement and the various loop statements.

Boolean Logical Operators


The Boolean logical operators shown here operate only on boolean operands. All of the binary logical
operators combine two boolean values to form a resultant boolean value.

The following table shows the effect of each logical operation:

// Demonstrate the boolean logical operators.


class BoolLogic {
public static void main(String args[]) {
boolean a = true;
boolean b = false;
boolean c = a | b;

UNIT-1 JAVA PROGRAMMING Page 34


boolean d = a & b;
boolean e = a ^ b;
boolean f = (!a & b) | (a & !b);
boolean g = !a;
System.out.println(" a = " + a);
System.out.println(" b = " + b);
System.out.println(" a|b = " + c);
System.out.println(" a&b = " + d);
System.out.println(" a^b = " + e);
System.out.println("!a&b|a&!b = " + f);
System.out.println(" !a = " + g);
}
}
Output:
a = true
b = false
a|b = true
a&b = false
a^b = true
a&b|a&!b = true
!a = false

Short-Circuit Logical Operators

Java provides two interesting Boolean operators not found in many other computer languages. These are
secondary versions of the Boolean AND and OR operators, and are known as short-circuit logical
operators.

If you use the || and && forms, Java will not bother to evaluate the right-hand operand when the outcome
of the expression can be determined by the left operand alone. This is very useful when the right-hand
operand depends on the value of the left one in order to function properly.

For example, the following code fragment shows how you can take advantage of short-circuit logical
evaluation to be sure that a division operation will be valid before evaluating it:

if (denom != 0 && num / denom > 10)

Since the short-circuit form of AND (&&) is used, there is no risk of causing a run-time exception when
denom is zero. If this line of code were written using the single & version of AND, both sides would be
evaluated, causing a run-time exception when denom is zero.

The Assignment Operator

The assignment operator is used to assign a value to variable.The assignment operator is the single equal
sign, =.
It has this general form:
var = expression;
Here, the type of var must be compatible with the type of expression.

it allows you to create a chain of assignments. For example

UNIT-1 JAVA PROGRAMMING Page 35


int x, y, z;
x = y = z = 100; // set x, y, and z to 100

Using a “chain of assignment” is an easy way to set a group of variables to a common value.

The ? Operator

Java includes a special ternary (three-way) operator that can replace certain types of if-then-else
statements. This operator is the ?.

The ? has this general form:


expression1 ? expression2 : expression3

Here, expression1 can be any expression that evaluates to a boolean value. If expression1 is true, then
expression2 is evaluated; otherwise, expression3 is evaluated.

class Ternary {
public static void main(String args[]) {
int i, k;
i = 10;
k = i < 0 ? -i : i; // get absolute value of i
System.out.print("Absolute value of ");
System.out.println(i + " is " + k);
}
}
Output:
Absolute value of 10 is 10

Java has well-defined rules for specifying the order in which the operators in an expression are evaluated
when the expression has several operators. For example, multiplication and division have a higher
precedence than addition and subtraction. Precedence rules can be overridden by explicit parentheses.

Precedence order.

When two operators share an operand the operator with the higher precedence goes first. For example, 1 +
2 * 3 is treated as 1 + (2 * 3), whereas 1 * 2 + 3 is treated as (1 * 2) + 3 since multiplication has a higher
precedence than addition.

Associativity.

When an expression has two operators with the same precedence, the expression is evaluated according to
its associativity. For example x = y = z = 17 is treated as x = (y = (z = 17)), leaving all three variables with
the value 17, since the = operator has right-to-left associativity (and an assignment statement evaluates to
the value on the right hand side). On the other hand, 72 / 2 / 3 is treated as (72 / 2) / 3 since the / operator
has left-to-right associativity. Some operators are not associative: for example, the expressions (x <= y <=
z) and x++-- are invalid.

Precedence and associativity of Java operators.

UNIT-1 JAVA PROGRAMMING Page 36


The table below shows all Java operators from highest to lowest precedence, along with their associativity.
Most programmers do not memorize them all, and even those that do still use parentheses for clarity.

Level Operator Description Associativity


[] access array element
16 . access object member left to right
() parentheses
++ unary post-increment
15 not associative
-- unary post-decrement
++ unary pre-increment
-- unary pre-decrement
+ unary plus
14 right to left
- unary minus
! unary logical NOT
~ unary bitwise NOT
() cast
13 right to left
new object creation
12 */% multiplicative left to right
+- additive
11 left to right
+ string concatenation
<< >>
10 shift left to right
>>>
< <=
9 > >= relational not associative
instanceof
==
8 equality left to right
!=
7 & bitwise AND left to right
6 ^ bitwise XOR left to right
5 | bitwise OR left to right
4 && logical AND left to right
3 || logical OR left to right
2 ?: ternary right to left
= += -=
*= /= %=
1 assignment right to left
&= ^= |=
<<= >>= >>>=

There is no explicit operator precedence table in the Java Language Specification. Different tables on the
web and in textbooks disagree in some minor ways.

Order of evaluation of subexpressions.

UNIT-1 JAVA PROGRAMMING Page 37


Associativity and precedence determine in which order Java applies operators to subexpressions but they
do not determine in which order the subexpressions are evaluated. In Java, subexpressions are evaluated
from left to right (when there is a choice). So, for example in the expression A() + B() * C(D(), E()), the
subexpressions are evaluated in the order A(), B(), D(), E(), and C(). Although, C() appears to the left of
both D() and E(), we need the results of both D() and E() to evaluate C(). It is considered poor style to write
code that relies upon this behavior (and different programming languages may use different rules).

Short circuiting. When using the conditional and and or operators (&& and ||), Java does not evaluate the
second operand unless it is necessary to resolve the result. This allows statements like if (s != null &&
s.length() < 10) to work reliably. Programmers rarely use the non short-circuiting versions (& and |) with
boolean expressions.

Precedence order gone awry Sometimes the precedence order defined in a language do not conform with
mathematical norms. For example, in Microsoft Excel, -a^b is interpreted as (-a)^b instead of -(a^b). So -
1^2 is equal to 1 instead of -1, which is the values most mathematicians would expect. Microsoft
acknowledges this quirk as a “design choice.” One wonders whether the programmer was relying on the C
precedence order in which unary operators have higher precedence than binary operators. This rule agrees
with mathematical conventions for all C operators, but fails with the addition of the exponentiation
operator. Once the order was established in Microsoft Excel 2.0, it could not easily be changed without
breaking backward compatibility.

Type Conversion and Casting:


Java’s Automatic Conversions

When one type of data is assigned to another type of variable, an automatic type conversion will take place
if the following two conditions are met:
1. The two types are compatible.
2. The destination type is larger than the source type.
When these two conditions are met, a widening conversion takes place. For example, the int type is always
large enough to hold all valid byte values, so no explicit cast statement is required.

For widening conversions, the numeric types, including integer and floating-point types,
are compatible with each other.

However, there are no automatic conversions from the numeric types to char or boolean. Also, char and
boolean are not compatible with each other.

As mentioned earlier, Java also performs an automatic type conversion when storing a literal integer
constant into variables of type byte, short, long, or char.

Casting Incompatible Types

Although the automatic type conversions are helpful, they will not fulfill all needs. For example, what if
you want to assign an int value to a byte variable? This conversion will not be performed automatically,
because a byte is smaller than an int. This kind of conversion is sometimes called a narrowing conversion,
since you are explicitly making the value narrower so that it will fit into the target type.

To create a conversion between two incompatible types, you must use a cast. A cast is simply an explicit
type conversion.

UNIT-1 JAVA PROGRAMMING Page 38


It has this general form: (target-type) value

Here, target-type specifies the desired type to convert the specified value to. For example, the following
fragment casts an int to a byte. If the integer’s value is larger than the range of a byte, it will be reduced
modulo (the remainder of an integer division by the) byte’s range.

int a;
byte b;
// ...
b = (byte) a;

A different type of conversion will occur when a floating-point value is assigned to an integer type:
truncation. As you know, integers do not have fractional components. Thus, when a floating-point value is
assigned to an integer type, the fractional component is lost.

For example, if the value 1.23 is assigned to an integer, the resulting value will simply be 1.
The 0.23 will have been truncated. Of course, if the size of the whole number component is too large to fit
into the target integer type, then that value will be reduced modulo the target type’s range.

The following program demonstrates some type conversions that require casts:

// Demonstrate casts.
class Conversion {
public static void main(String args[]) {
byte b;
int i = 257;
double d = 323.142;

System.out.println("\nConversion of int to byte.");


b = (byte) i;
System.out.println("i and b " + i + " " + b);

System.out.println("\nConversion of double to int.");


i = (int) d;
System.out.println("d and i " + d + " " + i);

System.out.println("\nConversion of double to byte.");


b = (byte) d;
System.out.println("d and b " + d + " " + b);
}
}

output:
Conversion of int to byte.
i and b 257 1
Conversion of double to int.
d and i 323.142 323
Conversion of double to byte.
d and b 323.142 67

UNIT-1 JAVA PROGRAMMING Page 39


Let’s look at each conversion. When the value 257 is cast into a byte variable, the result is the remainder of
the division of 257 by 256 (the range of a byte), which is 1 in this case.

When the d is converted to an int, its fractional component is lost. When d is converted to a byte, its
fractional component is lost, and the value is reduced modulo 256, which in this case is 67.

Control Statements:
Control statements can be put into the following categories: selection, iteration, and jump.

➢ Selection statements allow your program to choose different paths of execution based upon the
outcome of an expression or the state of a variable.
➢ Iteration statements enable program execution to repeat one or more statements (that is, iteration
statements form loops).
➢ Jump statements allow your program to execute in a nonlinear fashion.
Java’s Selection Statements
Java supports two selection statements: if and switch. These statements allow you to control the
flow of your program’s execution based upon conditions known only during run time.
If:

The if statement is Java’s conditional branch statement. It can be used to route program execution through
two different paths.

Here is the general form of the if statement:

if (condition) statement1;
else statement2;
Here, each statement may be a single statement or a compound statement enclosed in curly braces (that is, a
block). The condition is any expression that returns a boolean value. The else clause is optional.

The if works like this: If the condition is true, then statement1 is executed. Otherwise, statement2 (if it
exists) is executed. In no case will both statements be executed. For example, consider the following:

int a, b;
// ...
if(a < b) a = 0;
else b = 0;

Here, if a is less than b, then a is set to zero. Otherwise, b is set to zero. In no case are they both set to zero.
Most often, the expression used to control the if will involve the relational operators.
However, this is not technically necessary. It is possible to control the if using a single boolean variable.

class BoolIf {
public static void main(String args[]) {
boolean b;
b = false;
System.out.println("b is " + b);
b = true;

UNIT-1 JAVA PROGRAMMING Page 40


System.out.println("b is " + b);
// a boolean value can control the if statement
if(b)
System.out.println("This is executed.");
b = false;
if(b)
System.out.println("This is not executed.");
// outcome of a relational operator is a boolean value
System.out.println("10 > 9 is " + (10 > 9));
}
}
The output generated by this program is shown here:
b is false
b is true
This is executed.
10 > 9 is true

Nested ifs
Anested if is an if statement that is the target of another if or else. Nested ifs are very common in
programming. When you nest ifs, the main thing to remember is that an else statement always refers to the
nearest if statement that is within the same block as the else and that is not already associated with an else.
Here is an example:

if(i = = 10) {
if(j < 20) a = b;
if(k > 100) c = d; // this if is
else a = c; // associated with this else
}
else a = d; // this else refers to if(i == 10)

As the comments indicate, the final else is not associated with if(j<20) because it is not in the same block
(even though it is the nearest if without an else). Rather, the final elseis associated with if(i==10). The
inner else refers to if(k>100) because it is the closest if within the same block.

The if-else-if Ladder


A common programming construct that is based upon a sequence of nested ifs is the if-else-if ladder. It
looks like this:

if(condition)
statement;
else if(condition)
statement;
else if(condition)
statement;
...

else
statement;

The if statements are executed from the top down. As soon as one of the conditions controlling the if is
true, the statement associated with that if is executed, and the rest of the ladder is bypassed.

UNIT-1 JAVA PROGRAMMING Page 41


If none of the conditions is true, then the final else statement will be executed. The final else acts as a
default condition; that is, if all other conditional tests fail, then the last else statement is performed. If there
is no final else and all other conditions are false, then no action will take place.

class Test {
public static void main(String args[]) {
int x = 30;
if( x == 0 ) {
System.out.print("Value of X is 0");
}
else if( x >0 ) {
System.out.print("Value of X is Positive");
}
else if( x < 0 ) {
System.out.print("Value of X is Negative");
}
}
}
// Demonstrate if-else-if statements.
class IfElse {
public static void main(String args[]) {
int month = 4; // April
String season;
if(month == 12 || month == 1 || month == 2)
season = "Winter";
else if(month == 3 || month == 4 || month == 5)
season = "Spring";
else if(month == 6 || month == 7 || month == 8)
season = "Summer";
else if(month == 9 || month == 10 || month == 11)
season = "Autumn";
else
season = "Bogus Month";
System.out.println("April is in the " + season + ".");
}
}
Here is the output produced by the program:
April is in the Spring.
switch

The switch statement is Java’s multiway branch statement. It provides an easy way to dispatch execution to
different parts of your code based on the value of an expression. As such, it often provides a better
alternative than a large series of if-else-if statements.

Here is the general form of a switch statement:

switch (expression) {
case value1:
// statement sequence

UNIT-1 JAVA PROGRAMMING Page 42


break;
case value2:
// statement sequence
break;
...
case valueN:
// statement sequence
break;
default:
// default statement sequence
}

The expression must be of type byte, short, int, or char; each of the values specified in the case statements
must be of a type compatible with the expression.

Each case value must be a unique literal (that is, it must be a constant, not a variable). Duplicate case
values are not allowed.

The switch statement works like this:


The value of the expression is compared with each of the literal values in the case statements. If a
match is found, the code sequence following that case statement is executed. If none of the constants
matches the value of the expression, then the default statement is executed. However, the default
statement is optional. If no case matches and no default is present, then no further action is taken.

The break statement is used inside the switch to terminate a statement sequence. When a break statement
is encountered, execution branches to the first line of code that follows the entire switch statement. This
has the effect of “jumping out” of the switch.

// A simple example of the switch.


class SampleSwitch {
public static void main(String args[]) {
for(int i=0; i<6; i++)
switch(i) {
case 0: System.out.println("i is zero."); break;
case 1: System.out.println("i is one."); break;
case 2: System.out.println("i is two."); break;
case 3: System.out.println("i is three."); break;
default: System.out.println("i is greater than 3.");
}
}
}
The output produced by this program is shown here:
i is zero.
i is one.
i is two.
i is three.
i is greater than 3.
i is greater than 3.

// An improved version of the season program.

UNIT-1 JAVA PROGRAMMING Page 43


class Switch {
public static void main(String args[]) {
int month = 4;
String season;
switch (month) {
case 12:
case 1:
case 2: season = "Winter";
break;
case 3:
case 4:
case 5: season = "Spring";
break;
case 6:
case 7:
case 8: season = "Summer";
break;
case 9:
case 10:
case 11: season = "Autumn";
break;
default: season = "Bogus Month";
}
System.out.println("April is in the " + season + ".");
}
}

Nested switch Statements

You can use a switch as part of the statement sequence of an outer switch. This is called a nested switch.
Since a switch statement defines its own block, no conflicts arise between the case constants in the inner
switch and those in the outer switch.

switch(count) {
case 1:
switch(target) { // nested switch
case 0:
System.out.println("target is zero");
break;
case 1: // no conflicts with outer switch
System.out.println("target is one");
break;
}
break;
case 2: // ...

Here, the case 1: statement in the inner switch does not conflict with the case 1: statement in the outer
switch. The count variable is only compared with the list of cases at the outer level. If count is 1, then
target is compared with the inner list cases.

UNIT-1 JAVA PROGRAMMING Page 44


In summary, there are three important features of the switch statement to note:
➢ The switch differs from the if, that is switch can only test for equality, whereas if can evaluate any
type of Boolean expression. That is, the switch looks only for a match between the value of the
expression and one of its case constants.
➢ No two case constants in the same switch can have identical values. Of course, a switch statement and
an enclosing outer switch can have case constants in common.
➢ Aswitch statement is usually more efficient than a set of nested ifs.

public class NestedSwitch {


public static void main(String[] args) {
int i = 0;
int j = 1;
switch(i) {
case 0:
switch(j) {
case 0: System.out.println("i is 0, j is 0"); break;
case 1: System.out.println("i is 0, j is 1"); break;
default : System.out.println("nested default case!!");
}
break;
default: System.out.println("No matching case found!!");
}
}
}

Output:
i is 0, j is 1

Iteration Statements
Java’s iteration statements are for, while, and do-while. These statements create loops. A loop repeatedly
executes the same set of instructions until a termination condition is met.

while
The while loop is Java’s most fundamental loop statement. It repeats a statement or block while its
controlling expression is true.
Here is its general form:
while(condition) {
// body of loop
}

The condition can be any Boolean expression. The body of the loop will be executed as long as the
conditional expression is true. When condition becomes false, control passes to the next line of code
immediately following the loop. The curly braces are unnecessary if only a single statement is being
repeated.

class WhileDemo {
public static void main(String args[]) {
int n = 5;
while(n > 0) {
System.out.println("Value = " + n);

UNIT-1 JAVA PROGRAMMING Page 45


n--;
}
}
}
Output:
Value=1
Value=2
Value=3
Value=4
Value=5

do-while
Since the while loop evaluates its conditional expression at the top of the loop, the body of the loop will
not execute even once if the condition is initially false (the body of the loop will not be executed at all).

However, sometimes it is desirable to execute the body of a loop at least once, even if the conditional
expression is false initially. In other words, there are times when you would like to test the termination
expression at the end of the loop rather than at the beginning. To serve this purpose java supplies do-while
loop.

The do-while loop always executes its body at least once, because its conditional expression is at the
bottom of the loop.

Its general form is


do {
// body of loop
} while (condition);

Each iteration of the do-while loop first executes the body of the loop and then evaluates the conditional
expression. If this expression is true, the loop will repeat. Otherwise, the loop terminates.

class DoWhile {
public static void main(String args[]) {
int n = 5;
do {
System.out.println("Value = " + n);
n--;
} while(n > 0);
}
}
The do-while loop is especially useful when you process a menu selection, because you will usually want
the body of a menu loop to execute at least once.

Import java.util.scanner;
public class ConsoleMenuDemo {
public static void main(String[] args) {
// Local variable
int choice,a,b;
Scanner s=new Scanner(System.in);

UNIT-1 JAVA PROGRAMMING Page 46


do{
System.out.println(" MENU SELECTION DEMO ");
System.out.println("============================");
System.out.println(" 1.addition ");
System.out.println(" 2.subtraction ");
System.out.println(" 3.multiplication");
System.out.println("============================");
choice = s.nextInt();
}while(choice<1 || choice >3);

switch (choice) {
case 1: System.out.println(" enter value of a and b");
a = s.nextInt();
b = s.nextInt();
System.out.println(“a+b =”+(a+b));
break;

case 2: System.out.println(" enter value of a and b");


a = s.nextInt();
b = s.nextInt();
System.out.println(“a-b =”+(a-b));
break;

case 3: System.out.println(" enter value of a and b");


a = s.nextInt();
b = s.nextInt();
System.out.println(“a*b =”+(a*b));
break;

default:
System.out.println("Invalid selection");
break; // This break is not really necessary
}
}
}

// Notice that characters are read from the keyboard


by calling System.in.read( ). This is one of Java’s console input functions.

for:
There are two forms of the for loop. The first is the traditional form that has been in use since the original
version of Java. The second is the new “for-each” form.

the general form of the traditional for statement:

for(initialization; condition; iteration) {


// body
}
If only one statement is being repeated, there is no need for the curly braces.

UNIT-1 JAVA PROGRAMMING Page 47


The for loop operates as follows.

When the loop first starts, the initialization portion of the loop is executed. Generally, this is an expression
that sets the value of the loop control variable, which acts as a counter that controls the loop. It is important
to understand that the initialization expression is only executed once.

Next, condition is evaluated. This must be a Boolean expression. It usually tests the loop control variable
against a target value. If this expression is true, then the body of the loop is executed. If it is false, the loop
terminates.

Next, the iteration portion of the loop is executed. This is usually an expression that increments
or decrements the loop control variable.

The loop then iterates, first evaluating the conditional expression, then executing the body of the loop, and
then executing the iteration expression with each pass. This process repeats until the controlling expression
is false.

class ForTick {
public static void main(String args[]) {
int n;
for(n=5; n>0; n--)
System.out.println("tick = " + n);
}
}
Output:
tick = 5
tick = 4
tick = 3
tick = 2
tick = 1

Declaring Loop Control Variables Inside the for Loop

Some times, the variable that controls a for loop is only needed for the purposes of the loop and is not used
elsewhere. When this is the case, it is possible to declare the variable inside the initialization portion of the
for.

// Declare a loop control variable inside the for.


class ForTick {
public static void main(String args[]) {
// here, n is declared inside of the for loop
for(int n=5; n>0; n--)
System.out.println("tick = " + n);
}
}
Output:
tick = 5
tick = 4
tick = 3
tick = 2
tick = 1

UNIT-1 JAVA PROGRAMMING Page 48


When you declare a variable inside a for loop, there is one important point to remember:
The scope of that variable ends when the for statement does. (That is, the scope of the variable is
limited to the for loop.) Outside the for loop, the variable will cease to exist. If you need to use the loop
control variable elsewhere in your program, you will not be able to declare it inside the for loop.

The For-Each Version of the for Loop:

A foreach style loop is designed to cycle through a collection of objects, such as an array, in strictly
sequential fashion, from start to finish. The for-each style of for is also referred to as the enhanced for
loop.

The general form of the for-each version of the for is shown here:

for(type itr-var : collection) statement-block

Here, type specifies the type and itr-var specifies the name of an iteration variable that will receive the
elements from a collection, one at a time, from beginning to end. There are various types of collections that
can be used with the for.

Example:

// Use a for-each style for loop.


class ForEach {
public static void main(String args[]) {
int nums[] = { 1, 2, 3, 4, 5 };
int sum = 0;
// use for-each style for to display and sum the values
for(int x : nums) {
System.out.println("Value is: " + x);
sum += x;
}
System.out.println("Summation: " + sum);
}
}
The output from the program is shown here.
Value is: 1
Value is: 2
Value is: 3
Value is: 4
Value is: 5
Summation: 55

As this output shows, the for-each style for automatically cycles through an array in sequence from the
lowest index to the highest.

With each pass through the loop, x is automatically given a value equal to the next element in nums. Thus,
on the first iteration, x contains 1; on the second iteration, x contains 2; and so on.
Not only is the syntax streamlined, but it also prevents boundary errors.

Although the for-each for loop iterates until all elements in an array have been examined, it is possible to
terminate the loop early by using a break statement.

UNIT-1 JAVA PROGRAMMING Page 49


For example, this program sums only the first five elements of nums:

// Use break with a for-each style for.


class ForEach2 {
public static void main(String args[]) {
int sum = 0;
int nums[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// use for to display and sum the values
for(int x : nums) {
System.out.println("Value is: " + x);
sum += x;
if(x == 5) break; // stop the loop when 5 is obtained
}
System.out.println("Summation of first 5 elements: " + sum);
}
}
This is the output produced:
Value is: 1
Value is: 2
Value is: 3
Value is: 4
Value is: 5
Summation of first 5 elements: 15

There is one important point to understand about the for-each style loop.
Its iteration variable is “read-only” as it relates to the underlying array. An assignment to the
iteration variable has no effect on the underlying array. In other words, you can’t change the contents of the
array by assigning the iteration variable a new value.

Example:

// The for-each loop is essentially read-only.


class NoChange {
public static void main(String args[]) {
int nums[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for(int x : nums) {
System.out.print(x + " ");
x = x * 10; // no effect on nums
}
System.out.println();
for(int x : nums)
System.out.print(x + " ");
System.out.println();
}
}
The first for loop increases the value of the iteration variable by a factor of 10. However, this assignment
has no effect on the underlying array nums, as the second for loop illustrates.

The output, shown here, proves this point:


1 2 3 4 5 6 7 8 9 10

UNIT-1 JAVA PROGRAMMING Page 50


1 2 3 4 5 6 7 8 9 10

Iterating Over Multidimensional Arrays

The enhanced version of the for also works on multidimensional arrays. Remember, multidimensional
arrays consist of arrays of arrays. (For example, a two-dimensional array is an array of one-dimensional
arrays.)

This is important when iterating over a multidimensional array, because each iteration obtains the next
array, not an individual element. Furthermore, the iteration variable in the for loop must be compatible
with the type of array being obtained.

For example, in the case of a two-dimensional array, the iteration variable must be a reference to a one-
dimensional array. In general, when using the for-each for to iterate over an array of N dimensions, the
objects obtained will be arrays of N–1 dimensions. To understand the implications of this, consider the
following program. It uses nested for loops to obtain the elements of a two-dimensional array in roworder,
from first to last.

// Use for-each style for on a two-dimensional array.


class ForEach3 {
public static void main(String args[]) {
int sum = 0,k=0;
int nums[][] = new int[3][5];
// give nums some values
for(int i = 0; i < 2; i++)
for(int j=0; j < 3; j++)
nums[i][j] = k++;
// use for-each for to display and sum the values
for(int x[] : nums) {
for(int y : x) {
System.out.println("Value is: " + y);
sum += y;
}
}
System.out.println("Summation: " + sum);
}
}
The output from this program is shown here:
Value is: 0
Value is: 1
Value is: 2
Value is: 3
Value is: 4
Value is: 5
Summation: 15

In the program, pay special attention to this line: for(int x[] : nums)

UNIT-1 JAVA PROGRAMMING Page 51


Notice how x is declared. It is a reference to a one-dimensional array of integers. This is necessary because
each iteration of the for obtains the next array in nums, beginning with the array specified by nums[0].
The inner for loop then cycles through each of these arrays, displaying the values of each element.

// Search an array using for-each style for.


class Search {
public static void main(String args[]) {
int nums[] = { 6, 8, 3, 7, 5, 6, 1, 4 };
int val = 5;
boolean found = false;
// use for-each style for to search nums for val
for(int x : nums) {
if(x == val) {
found = true;
break;
}
}
if(found)
System.out.println("Value found!");
}
}
Jump Statements
Java supports three jump statements: break, continue, and return. These statements transfer control to
another part of your program.

break

In Java, the break statement has three uses.


1. It terminates a statement sequence in a switch statement.
2. It can be used to exit a loop.
3. break can be used as a “civilized” form of goto. The last two uses are explained here.

Using break to Exit a Loop:

➢ By using break, you can force immediate termination of a loop, bypassing the conditional
expression and any remaining code in the body of the loop.

➢ When a break statement is encountered inside a loop, the loop is terminated and program control
resumes at the next statement following the loop.

// Using break to exit a loop.

class BreakLoop {
public static void main(String args[]) {
for(int i=0; i<100; i++)
{
if(i == 5) break; // terminate loop if i is 10
System.out.println("i = " + i);
}
System.out.println("Loop complete.");

UNIT-1 JAVA PROGRAMMING Page 52


}
}
This program generates the following output:
i=0
i=1
i=2
i=3
i=4
Loop complete.
Using break as a Form of goto:

Java does not have a goto statement, but there are a few places where the goto is a valuable and legitimate
construct for flow control. For example, the goto can be useful when you are exiting from a deeply nested
set of loops.

To handle such situations, Java defines an expanded form of the break statement. By using this form of
break, you can break out of one or more blocks of code. These blocks need not be part of a loop or a
switch.

They can be any block. Further, you can specify precisely where execution will resume, because this form
of break works with a label. As you will see, break gives you the benefits of a goto without its problems.

The general form of the labeled break statement is shown here:

break label;

Most often, label is the name of a label that identifies a block of code. This can be a stand-alone
block of code but it can also be a block that is the target of another statement.

When this form of break executes, control is transferred out of the named block. The labeled block must
enclose the break statement, but it does not need to be the immediately enclosing block.

To name a block, put a label at the start of it. A label is any valid Java identifier followed by a colon. Once
you have labeled a block, you can then use this label as the target of a break statement. Doing so causes
execution to resume at the end of the labeled block.

For example, the following program shows three nested blocks, each with its own label. The break
statement causes execution to jump forward, past the end of the block labeled second, skipping the two
println( ) statements.

// Using break as a civilized form of goto.


class Break {
public static void main(String args[]) {
boolean t = true;
first: {
second: {
third: {
System.out.println("Before the break.");
if(t)
break second; // break out of second block

UNIT-1 JAVA PROGRAMMING Page 53


System.out.println("This won't execute");
}
System.out.println("This won't execute");
}
System.out.println("This is after second block.");
}
}
}

Output:

Before the break.


This is after second block.

One of the most common uses for a labelled break statement is to exit from nested loops.
For example, in the following program, the outer loop executes only once:

// Using break to exit from nested loops


class BreakLoop4 {
public static void main(String args[]) {
outer: for(int i=0; i<3; i++) {
System.out.print("Pass " + i + ": ");
for(int j=0; j<100; j++) {
if(j == 10) break outer; // exit both loops
System.out.print(j + " ");
}
System.out.println("This will not print");
}
System.out.println("Loops complete.");
}
}

This program generates the following output:


Pass 0: 0 1 2 3 4 5 6 7 8 9 Loops complete.

Continue:

Sometimes it is useful to force an early iteration of a loop. That is, you might want to continue running the
loop but stop processing the remainder of the code in its body for this particular iteration. The continue
statement performs such an action.

In while and do-while loops, a continue statement causes control to be transferred directly to the
conditional expression that controls the loop.

In a for loop, control goes first to the iteration portion of the for statement and then to the conditional
expression. For all three loops, any intermediate code is bypassed.

class Continue {
public static void main(String args[]) {
for(int i=0; i<10; i++) {

UNIT-1 JAVA PROGRAMMING Page 54


if (i%2 == 0) continue;
System.out.println(i + " ");
}
}
}

This code uses the % operator to check if i is even. If it is, the loop continues without printing
a newline. Here is the output from this program:
1
3
5
7
9
As with the break statement, continue may specify a label to describe which enclosing loop to continue.
Here is an example program that uses continue to print a triangular multiplication table for 0 through 9.

// Using continue with a label.

class ContinueLabel {
public static void main(String args[]) {
outer: for (int i=0; i<=5; i++) {
for(int j=0; j<=5; j++) {
if(j = = i) {
System.out.println();
continue outer;
}
System.out.print(" " + j);
}
}
System.out.println();
}
}

Output:
0
01
012
0123
01234

Return:
The return statement is used to explicitly return from a method. That is, it causes program control to
transfer back to the caller of the method.

At any time in a method the return statement can be used to cause execution to branch back to the caller of
the method. Thus, the return statement immediately terminates the method in which it is executed.

The following example illustrates this point. Here, return causes execution to return to the Java run-time
system, since it is the run-time system that calls main().

UNIT-1 JAVA PROGRAMMING Page 55


// Demonstrate return.

class Return {
public static void main(String args[]) {
boolean t = true;
System.out.println("Before the return.");
if(t) return; // return to caller
System.out.println("This won't execute.");
}
}

output:
Before the return.

As you can see, the final println( ) statement is not executed. As soon as return is executed,
control passes back to the caller.

One last point: In the preceding program, the if(t) statement is necessary. Without it, the Java compiler
would flag an “unreachable code” error because the compiler would know that the last println( ) statement
would never be executed. To prevent this error, the if statement is used here to trick the compiler for the
sake of this demonstration.

UNIT-1 JAVA PROGRAMMING Page 56

You might also like