**********************
Java Programming Model
**********************
In this module, I listed the essential Java language features to be used in
this course. I will keep updating this document as we go through the course.
.. warning::
This is not a comprehensive Java tutorial. For more details,
please refer to the Java documentation at
https://docs.oracle.com/javase/tutorial/java/index.html or other online
resources.
Free Reference Books
====================
+ Think Java: How to Think Like a Computer Scientist `link `_
+ Think in Java `link `_
+ The Java Tutorials `link `_
Data Types and Expressions
==========================
+ Primitive data types
In Java, primitive data types represent the basic building blocks of data.
They are simple, predefined data types that are not derived from any other
types. Examples of primitive data types include int, double, boolean, char,
and others. These types hold their values directly and have a fixed size in
memory.
+ Reference types
Unlike primitive data types, reference types in Java represent objects rather
than storing the actual data. They store a reference or address that points
to the memory location where the object is stored. Reference types include
class types, which are user-defined classes, as well as arrays and
interfaces.
* Assignment copies the reference, not the object
* Equal comparison checks if two references point to the same object rather
than comparing the values of the objects
* Wrapper types of primitive types
- Integer, Double, Boolean, Character, etc.
- Automatic boxing and unboxing
+ Generics
Generics in Java allow you to create classes, interfaces, and methods that
can operate on different data types. They provide a way to define a class or
method that can work with different types of data, while maintaining type
safety at compile-time. Generics are useful for creating reusable code and
enhancing code flexibility.
.. code-block:: java
public class Box {
private T contents;
public Box(T contents) {
this.contents = contents;
}
public T getContents() {
return contents;
}
public void setContents(T contents) {
this.contents = contents;
}
public static void main(String[] args) {
Box integerBox = new Box<>(10);
System.out.println("Contents of integerBox: " + integerBox.getContents());
Box stringBox = new Box<>("Hello");
System.out.println("Contents of stringBox: " + stringBox.getContents());
}
}
In the above example, we have a generic class called Box which can hold any
type of object. The generic type parameter T allows us to specify the type of
the contents of the box when creating an instance of the class.
Inside the Box class, we have a private field contents of type T which
represents the object stored in the box. We also have getter and setter
methods to access and modify the contents.
In the main method, we create two instances of the Box class: integerBox and
stringBox. We specify the type argument for integerBox and
for stringBox. This ensures that the contents field of each box is of the
specified type.
Finally, we print the contents of each box using the getContents method.
Since we used generics, the compiler ensures type safety, allowing us to use
the getContents method without the need for explicit type casting.
+ Variables
+ Identifiers
* Names for variables, methods, classes, etc.
* Naming rules - start with a letter, $, or _, followed by letters, digits,
$, or _
* Naming conventions
- Upper camel case for class names
- Lower camel case for variable and method names
* Case sensitivity
* Reserved words
+ Literals
+ Expressions
* Operators
* Precedence
* Associativity
* Type conversion
Arrays
======
+ This is a class type stored as references in variables!
+ Declaration
+ Initialization
+ Assignment
Statements
==========
+ Declaration
+ Assignment
+ Method call and return
+ Control flow
* conditional
* loop
* break and continue
+ Shortcut notations
* initialization
* implicit assignment (+=, -=, \*=, /=, %=)
* single-statement block (omit braces)
* for notations (for-each, for-in)
Object-oriented Programming in Java
===================================
Instance Variables
------------------
+ A.k.a. fields or attributes, referred as instance field in our Textbook
+ Implicit ``this`` instance variable
* refers to the current object
* not available in static methods
Methods
-------
+ static vs. non-static
.. list-table::
:widths: 25 37 37
:header-rows: 1
* -
- Static Methods
- Non-Static Methods
* - Invocation
- ClassName.methodName()
- objectReference.methodName()
* - Method Access
- Can access only other static methods within the same class
- Can access both static and non-static methods within the same class
* - Class Dependency
- No dependency on object instances
- Requires an object instance of the class
* - Memory Allocation
- Only one copy of the method exists in memory
- Each object instance has its own copy of non-static methods
* - Use of instance variables
- Cannot directly access or modify instance variables
- Can directly access or modify instance variables
* - Overriding
- Cannot be overridden
- Can be overridden in subclasses
Inheritance
-----------
+ ``extends`` keyword
Interface
---------
+ ``implements`` keyword
Other features
==============
+ Packages
* ``package`` keyword
* ``import`` keyword
* directory structure and dot in the package name