Monday, July 27, 2009

Java nested classes

I usually get confused with nested classes so I'll note some important points here.

Nested classes
- is also a member of enclosing class like variables and methods
- can use all access modifiers like variables and methods

Types of nested classes
1) static
- like a static method, it is not associated to any instance of enclosing class and has access only to all the static members
- syntax: Outer.Inner i = new Outer.Inner();

2) non-static / inner
- has access to other members of enclosing class even if declared private
- like non-static methods, it cannot define any static members as static members only belong to the (outer) class
- syntax: Outer.Inner i = new Outer().new Inner();

3) local inner - declared and known only within the body of method/block

4) anonymous inner - no name and known only within the statement in w/c they are defined

Thursday, July 9, 2009

Java modifiers summary

ModifierClassInterfaceInner ClassInner InterfaceVariableMethodConstructorFree-Floating Block
publicyesyesyesyesyesyesyesno
protectednonoyesyesyesyesyesno
none or package or defaultyesyesyesyesyesyesyesyes
privatenonoyesyesyesyesyesno
finalyesnoyesnoyesyesnono
abstractyesyes/noyesyes/nonoyesnono
staticnonoyesyesyesyesnoyes
nativenononononoyesnono
transientnonononoyesnonono
volatilenonononoyesnonono
synchronizednononononoyesnoyes
strictfpyesyesyesyesnoyesyesno

Points:
  • all access modifiers can be used to classes and members except for protected and private which cannot be used to outer classes and interfaces

  • free-floating block cannot have access modifiers. it can only use static or synchronized

  • constructors can only use access modifiers and strictfp

  • native is only for methods

  • transient and volatile are only for variables. Transient indicates that it is not serializable. Volatile indicates that it can be modified simultaneously by many threads.

  • synchronized can only be used on methods or free-floating blocks

  • strictfp can't be used on variables or free-floating blocks

    Using strictfp ensures that you get the same result of floating-point expressions across multiple platforms. But it may also result to overflow or underflow hence the expression, "Write-Once-Get-Equally-Wrong-Results-Everywhere". If you don't use strictfp, JVM can calculate floating-point expressions however it want and thus could produce more accurate results.

Thursday, July 2, 2009

Getting started with Java

1) download the Java EE Software Development Kit (SDK)
- download link: http://www.oracle.com/technetwork/java/javaee/downloads/index.html

What Java Do I Need?
You must have a copy of the JRE (Java Runtime Environment) on your system to run Java applications and applets. To develop Java applications and applets, you need the JDK (Java Development Kit), which includes the JRE.

What's the difference between J2SE and J2EE?
J2SE has access to all of the SE libraries. However, EE adds a set of libraries for dealing with enterprise applications such as Servlets, JSP and Enterprise
Javabeans.


2) install JDK
- Windows instructions/troubleshooting: http://java.sun.com/javase/6/webnotes/install/jdk/install-windows.html

Why shouldn't I install in "C:\Program Files\Java"?
Some apps (e.g. maven, plugins) uses your Java path without considering potential whitespace on the path causing "C:\Program Files\Java" to become "C:\Program" w/c leads to errors. So either use a path w/out whitespace or set you path to JAVA_HOME=C:\Progra~1\Java not JAVA_HOME=C:\Program Files\Java


3) update environment variables (NOT case-sensitive under Windows)
PATH
- defines the search paths for executable programs (with file extension of ".exe", ".bat" or ".com" for Windows systems) invoked from a command shell ("cmd.exe")
- allows the use of javac and java
- if not set, you need to specify the full path to the executable every time you run it, such as: C:\Program Files\Java\jdk1.6.0\bin\javac MyClass.java
- so add here the JDK binary (bin) directory (e.g., "c:\jdk1.6\bin")
- Note: The JDK binary directory should be listed before "c:\windows\system32" and "c:\windows" in the PATH. This is because some Windows systems provide their own Java runtime (which is often outdated) in these directories (try search for "java.exe" in your computer!).

CLASSPATH
- defines the directories and Java's jar-files for searching for the Java classes referenced in a Java program
- normally, no explicit CLASSPATH setting is required
- if not set, default is current working directory (since JDK 1.3)
- if set, include the current working directory '.'
- link: How Classes are found

JAVA_HOME
- needed for running Tomcat and many Java applications
- set here the JDK installation directory, e.g., "c:\jdk1.6

How to set environment variables in Mac/Unix
1. Set environment variables for your user in ~/.bash_profile (will affect bash shells only).
Create the file if it does not exist:
touch ~/.bash_profile
Open the file:
open ~/.bash_profile
Add environment variables in the file:
export JAVA_HOME=$(/usr/libexec/java_home)
export JRE_HOME=$(/usr/libexec/java_home)
2. Set temporary environment variables for the current bash shell. Just type the same command in 1. to the current bash shell.

Ref: http://www3.ntu.edu.sg/home/ehchua/programming/howto/environment_variables.html