Basic Building Blocks of Java
Components of Java Programs
Java source code files
The Java compiler imposes some specific rules on the naming of source
code files.
- A Java source code file has a base name, along with the file extension
.java
- A source file can contain one or more classes (and/or interfaces, to
be discussed later in the course)
- If there are multiple classes in a code file, one and only one
of them should be declared to be public
- The base name for the filename must match the name of the class
that is declared to be public in the file.
- If there's only one class in the file, the filename must match that
class name
- class names in Java are case sensitive
- Be careful -- in Windows, for example, filenames are not case
sensitive, but in Unix, they are
- Example: This class goes in the file Yadda.Java
class Yadda
{
public static void main(String[] args)
{
System.out.println("Yadda yadda yadda");
}
}
- Example: This file must be named Daffy.java
class Bugs
{
public static void main(String[] args)
{
System.out.println("What's up, doc?");
}
}
public class Daffy
{
public static void main(String[] args)
{
System.out.println("You're dethpicable.");
}
}
Statements
Statements in Java are made up of:
- reserved words - words that have pre-defined meanings in the
Java language
- identifiers - words that are created by programmers for names
of variables, functions, classes, etc.
- literals - literal values written in code, like strings or
numbers
- integer literal - an actual integer number written in code (4,
-10, 18)
- float literal - an actual decimal number written in code (4.5,
-12.9, 5.0)
- character literal - a character in single quotes: ('F', 'a',
'\n')
-
string literal - a string in double quotes: ("Hello", "Bye",
"Wow!\n")
- operators - special symbols that perform certain actions on
their operands
- A unary operator has one operand
- A binary operator has two operands
- A ternary operator has three operands (there's only one
of these)
- Calls to methods (functions)
Escape Sequences
String and character literals can contain special escape sequences
that represent single characters that cannot be represented with a single
character in code.
Escape Sequence |
Meaning |
\n |
newline |
\t |
tab |
\b |
backspace |
\r |
carriage return |
\" |
double quote |
\' |
single quote |
\\ |
backslash |
Comments
Comments are used to improve the readability of code. Comments are
ignored by the compiler. There are two styles of comments in Java:
Variables
Variables are used to store data. Every Java variable has a:
- Name -- chosen by the programmer (aka identifier)
- Type -- specified in the declaration of the variable
- Size -- determined by the type
- Value -- the data stored in the variable's memory location
Identifiers
Identifiers are the names for things (variables, functions, etc) in
the language. Some identifiers are built-in, and others can be created by
the programmer.
- User-defined identifiers can consist of letters, digits,
underscores, and the dollar-sign $
- Must start with a non-digit
- Identifiers are case sensitive (count and
Count are different variables)
- Reserved words (keywords) cannot be used as identifiers
- an identifier can be any length
Style-conventions (for indentifiers)
Primitive Data Types
Java has a small set of what are known as primitives. These are
basic data types that are predefined for the language.
- char - used for storing single characters (letters,
digits, special symbols, etc)
- 16 bits, unicode character set.
- boolean - has two possible values, true or
false
- integer types - for storage of integer values
- byte - 8 bits
- short - 16 bits
- int - 32 bits
- long - 64 bits
- floating point types - for storage of decimal numbers (i.e. a
fractional part after the decimal)
- float - 32 bits
- double - 64 bits
Declaring Variables
- Inside a block, variables must be declared before they can
be used in later statements in the block
- Declaration format:
typeName variableName1, variableName2, ...;
int numStudents; // variable of type integer
double weight; // variable of type double
char letter; // variable of type character
boolean flag; // variable of type boolean
// Examples of multiple variables of the same type in single
// declaration statements
int test1, test2, finalExam;
double average, gpa;
Initializing Variables
- To declare a variable is to tell the compiler it exists, and to
reserve memory for it
- To initialize a variable is to load a value into it for the
first time
- One common way to initialize variables is with an assignment
statement. Examples:
int numStudents;
double weight;
char letter;
numStudents = 10;
weight = 160.35;
letter = 'A';
- Variables of built-in types can be declared and initialized on the
same line, as well
int numStudents = 10;
double weight = 160.35;
char letter = 'A';
int test1 = 96, test2 = 83, finalExam = 91;
double x = 1.2, y = 2.4, z = 12.9;
Constant Variables
(Woohoo! An oxymoron!)
A variable can be declared constant by using the keyword final
final double PI = 3.14159;
After this, PI cannot be changed. The following would not work:
PI = 15;
Operators
- Special built-in symbols that have functionality, and work on
operands
- operand -- an input to an operator
- Arity - how many operands an operator takes
- unary operator -- has one operand
- binary operator -- has two operands
- ternary operator -- has three operands
- Examples:
int x, y = 5, z;
z = 10; // assignment operator (binary)
x = y + z; // addition (binary operator)
x = -y; // -y is a unary operation (negation)
x++; // unary (increment)
- cascading - linking of multiple operators, especially of
related categories, together in a single statement:
x = a + b + c - d + e; // cascading arithmetic operators
x = y = z = 3; // cascading assignment operators
This works because the result of one operation sends back the
answer (i.e. a return value) in its place, to be used in the
next piece of the statement.
In the above, (a + b) happens first, then the answer becomes the
first operand in the next + operation.
- Precedence - rules specifying which operators come first in a
statement containing multiple operators
x = a + b * c; // b * c happens first, since * has higher
// precedence than +
- Associativity - rules specifying which operators are evaluated
first when they have the same level of precedence.
- Most (but not all) operators associate from left to
right.
Assignment Operator
- Value on the right side (R-value) is assigned to (i.e. stored in) the
location (variable) on the left side (L-value)
- The assignment operator returns the L-value (which now stores the
new value)
- Examples
x = 5;
y = 10.3;
z = x + y; // right side can be an expression
a + 3 = b; // ILLEGAL! Left side must be a storage location
- Associates right-to-left
x = y = z = 5; // z = 5 evaluated first, returns z
- Use appropriate types when assigning values to variables:
int x, y;
x = 5843;
y = -1234; // assigning integers to int variables
double a, b;
a = 12.98;
b = -345.8; // can assign decimal numbers to type double
float c, d;
c = 12.98f;
d = -345.8f; // put a small 'f' after a literal value to indicate float, instead of double
char letter, symb;
letter = 'Z';
symb = '$'; // can assign character literals to char types
boolean flag;
flag = true;
flag = false; // can assign true or false to boolean variables
- Be careful to not confuse assignment = with comparison
==
Arithmetic Operators
Name |
Symbol |
Arity |
Usage |
Add |
+ |
binary |
x + y |
Subtract |
- |
binary |
x - y |
Multiply |
* |
binary |
x * y |
Divide |
/ |
binary |
x / y |
Modulus |
% |
binary |
x % y |
Minus |
- |
unary |
-x |
Operator precedence
Some short-cut assignment operators (with arithmetic)
v += e; means v = v + e;
v -= e; means v = v - e;
v *= e; means v = v * e;
v /= e; means v = v / e;
v %= e; means v = v % e;
Increment and Decrement Operators
++x; // pre-increment (returns reference to new x)
x++; // post-increment (returns value of old x)
// shortcuts for x = x + 1
--x; // pre-decrement
x--; // post-decrement
// shortcuts for x = x - 1
- Pre-increment: incrementing is done before the
value of x is used in the rest of the expression
- Post-increment: incrementing is done after the
value of x is used in the rest of the expression
- Note - this only matters if the variable is actually
used in another expression. These two statements by themselves
have the same effect:
x++;
++x;
- Examples
int x = 5, count = 7;
result = x * ++count; // result = 40, count = 8
int x = 5, count = 7;
result = x * count++; // result = 35, count = 8
Type Conversions
When working with mixed primitive types, conversions can take one of two
forms:
- Automatic type conversion: when appropriate, the complier will
automatically convert a smaller numeric type to a larger one (where the
floating point types are always considered "larger" than the integer
types).
- Explicit cast operations: for all other conversions, the
programmer must specify with a cast operation. To cast, put the type in
parintheses before the expression whose value you are casting.
int i1 = 5, i2;
short s1 = 3;
double d1 = 23.5, d2;
float f1 = 12.3f;
byte b1 = 10;
d2 = i1; // automatically allowed
i1 = b1; // automatically allowed
s1 = (short)i1; // requires cast operation (some data may be lost)
i2 = (int)d1; // requires cast operation (decimal data may be lost)
d2 = f1 + d1; // automatically allowed
i2 = b1 + s1; // automatically allowed