http://proglit.com/. the java language by sa introduced in 1995 by sun microsystems
TRANSCRIPT
http://proglit.com/
the javalanguage
BY
SA
introduced in 1995 by Sun Microsystems
• imperative, object-oriented• C-style syntax• statically-typed (mostly)• no pointers• JVM (Java Virtual Machine)• garbage collection• exceptions
big standard library• SE (standard edition)• EE (enterprise edition)• ME (micro edition)
Java 6 (2006) Java 7 (2010?)
class (data type definition)• field (data member)• method (function member)
object / instance (piece of data)
class Moose {Rat r;Hamster h;
void foo() {…}}
encapsulation(methods act as “interface” to object’s fields)
object.fieldobject.method(args)
apple.bananaapple.banana.orangenadine.ed()nadine.ed().lauranadine.ed().laura.dale()
object.fieldobject.method(args)
apple.banana(apple.banana).orangenadine.ed()(nadine.ed()).laura((nadine.ed()).laura).dale()
type name;new type(args)
Moose m; // nullm = new Moose();
Moose m = new Moose();
class Moose {Rat r;Hamster h;
Moose() {…} // constructor
void foo() {…}}
Moose() { this.r = new Rat();this.h = new Hamster();
}
Moose(Hamster h, Rat r) {this.r = r;this.h = h;
}
new Moose(new Hamster(), new Rat())
inheritanceAnimal A C
Mammal D E
Cat F G
B
D E
CBA
CBA
Ted
Kate
Milton
illegal
Object
Jack Samantha
BradTed
Kate
LisaMilton
Oliver
class Terry {…} // extends Object
class John extends Ben {…}
Jack
Ted
Kate
Milton
illegal
is-avs.
has-a
Think before using inheritance.
Object
Jack
Ted
Kate
Lisa
Mike
Hugh
Olivia
Uri
Amber
(probably) bad
Hamster h = new Hamster();Mammal m = h;
h.runOnWheel(); // OKm.runOnWheel(); // illegal
void bar(Mammal m) {…}
x.bar(new Mammal())x.bar(new Hamster())
Mammal foo() {if (…) {
return new Mammal();} else {
return new Hamster();}
}
(type) expression
Mammal m = (Mammal) new Hamster(); // upcast
(type) expression
Mammal m = new Hamster(); // implicit upcast
Hamster h = (Hamster) m; // downcastHamster h = m; // illegal
Lamp l = (Lamp) new Duck (); // illegal
Object
Jack
Ted
Kate
Lisa
Mike
Ted t;…t.foo();
Kate k;…k.foo();
void foo()
void foo()
overriding(redefining an
inherited method)
? x;if (…) {
x = new Nick();} else {
x = new Diane();}x.foo();
Nick Diane
Object
void foo()
void foo()
Object x;if (…) {
x = new Nick();} else {
x = new Diane();}x.foo(); // illegal Nick Diane
void foo()
void foo()
Object
interface Philip {void foo();
}
class Diane implements Philip {…}class Nick implements Philip {…}
Philip x;if (…) {
x = new Nick();} else {
x = new Diane();}x.foo(); // legal
Nick Diane
Object
void foo()
void foo()
Philip x = new Ian();
Nick Diane
Object
Ian
void foo()
void foo()
1. Compiler checks compile time type.2. Method invoked depends upon runtime type…3. …except this always invokes version of own class.
void bar() {this.foo();
}Mary
void foo()
Leo
void foo()void bar()
Leo l = new Leo();l.bar();
1. Compiler checks compile time type.2. Method invoked depends upon runtime type…3. …except this always invokes own class’s version…4. …and super always invokes inherited version.
void ack() {super.foo();
}Ryan
void foo()void ack()
Heather
void foo()
Heather h = new Heather();h.ack();
void foo() {super.foo();…
}
Ryan
void foo()void ack()
Heather
void foo()
void foo(Rat r) {r.bar(this);
}
void foo(Rat r) {r.bar(super); //
illegal}
primitive typesbyte 1-byte signed integershort 2-byte signed integerint 4-byte signed integerlong 8-byte signed integer
char 2-byte unsigned integer
boolean true and false
float single-precision floating-pointdouble double-precision floating-point
BigInteger
BigDecimal
(arbitrary-precision integer)
(arbitrary-precision decimal)
primitive types:• variable holds a value• == tests equality • cast produces a new value
reference types:• variable holds a reference• == tests identity • cast appeases compiler
int i = 60;float f = 5.4;
i = (int)f;f = (float)i;
int i = 5;byte b = 3;
b = (byte)i;i = b; // implicit cast
static member(a member which is not a member)
class Ian {static Fran f; // Ian.fstatic void foo() {…} //
Ian.foo()…
}
class Ian {static Fran f; // Ian.fstatic void foo() {…} //
Ian.foo()…
}Ian i = new Ian();i.foo(); i.f = new Fran();
1. Compiler checks compile-time type.2. Method invoked depends upon runtime type…3. …except this always invokes own class’s version…4. …and super always invokes inherited version…5. …and static determined solely by compile-time type.
package name;
package shark;package pig.tiger;
package pig.tiger;
shark.Ant h = new shark.Ant();
package shark;
Ant h = new Ant();pig.tiger.Cow h = new pig.tiger.Cow();
package shark;import pig.tiger.Cow;import pig.tiger.Lemur;
Lemur l = new Lemur();Cow c = new Cow();
java.lang
java.lang.Object
java.lang.StringString s = “hello”;int l = s.length(); // 5s = s.toUpperCase(); // “HELLO”
“Hello, ” + “Ron” “Hello, Ron”5 + “ golden rings” “5 golden rings”
public (everywhere)protected * (same package + subclasses)default (same package)private * (same class)
* applicable only to members
visibility
overloading(same name, different method)
void foo()void foo(Mammal m, Lamp l)byte foo(int a)void foo(Lamp l, Mammal m)
Sean s = new Sean();s.foo(new Lamp(), new Mammal());s.foo(35);
Sean
overloading(same name, different method)
void foo()void foo(Mammal m, Lamp l)byte foo(int a) // conflictvoid foo(Lamp l, Mammal m)float foo(int b) // conflict
Sean s = new Sean();s.foo(35); // ambiguous
Sean
overloading(same name, different method)
void foo()void foo(Mammal m, Lamp l)byte foo(int a)void foo(Lamp l, Mammal m)char foo(Lamp l, Animal m)
Sean s = new Sean();s.foo(new Lamp(), new Hamster());
Sean
overloading(same name, different method)
void foo()void foo(Mammal m, Lamp l)byte foo(int a)void foo(Lamp l, Mammal m)char foo(Lamp l, Animal m)
Sean s = new Sean();s.foo(new Lamp(), (Animal) new Hamster());
Sean
1. Compiler checks compile-time type and picks overload.2. Method invoked depends upon runtime type…3. …except this always invokes own class’s version…4. …and super always invokes inherited version…5. …and static determined solely by compile-time type.
void foo(int a) (overload)void foo() (override)
void foo()Jill
Donald
Jill
void foo(int a) (overload)char foo() (illegal)
Donald
void foo()
Moose(Hamster h, Rat r) {this.r = r;this.h = h;}
Moose() { this.r = new Rat();this.h = new Hamster();}
new Moose(new Hamster(), new Rat())
Moose(Hamster h, Rat r) {this.r = r;this.h = h;
}
Moose() {this(new Hamster(), new Rat());
}
Moose(Hamster h, Rat r) {this.r = r;this.h = h;
}
Moose() {// not what we wantnew Moose(new Hamster(), new Rat());
}
Moose(Hamster h, Rat r) {this.r = r;this.h = h;
}
Moose() {// sensical, but not legal JavaMoose(new Hamster(), new Rat());
}
Moose(Hamster h, Rat r) {this.r = r;this.h = h;
}
Moose() {this(new Hamster(), new Rat());
}
Moose(Hamster h, Rat r) {super(); // invoke constructor of Moose’s parentthis.r = r;this.h = h;}
Moose() {this(new Hamster(), new Rat());}
Object
Jack
Ted
Kate
new Kate()
1. Constructors invoked only via new, this(), or super().
2. Calls to this() and super() only can be first line.3. The first line is always this() or super().4. Default first line is super() with no arguments.
constructor rules
// infinite recursion
Moose(Hamster h, Rat r) {this();
}
Moose() {this(new Hamster(), new Rat());
}
1. Constructors invoked only via new, this(), or super().2. The first line is always this() or super().3. Calls to this() and super() only go in first line.4. Default first line is super() with no arguments. 5. A this() call cannot be recursive.6. To return, always just use return;
constructor rules
Object
Throwable
Exception
RuntimeException
Error
exceptions
Cat c;…c.meow(); // exception if c is
null
Cat c;…try {c.meow(); // exception if c is null} catch (NullPointerException e) {…}
Object
Throwable
Exception
RuntimeException*
Error*
*unchecked
// illegalvoid bar() {
if (…) {throw new Leo(); // checked
exception}
}
// OKvoid bar() throws Leo {
if (…) {throw new Leo(); // checked
exception}
}
// OKvoid bar() {
try {if (…) {
throw new Leo(); // checked exception
}} catch (Leo e) {
…}
}
void bar() throws FooException, AckException {…}
void bar() throws Exception {…}
arrays(fixed-sized, homogenous collection)
Apple ref
Apple ref
Apple ref
Apple ref
Apple[]
Apple object
Apple object
Fuji object
Mammal[] m;m = new Mammal[3];m[2] = new Mammal();m[0] = new Cat();int i =
m.length; // 3
Object
Lisa
Jerry
Natalie
Wyatt
Object[]
Lisa[]
Jerry[]
Natalie[]
Wyatt[]
Cat[] c = new Cat[3];Mammal[] m = c;Object[] o1 = c;Object o2 = c;
Cat[] c = new Cat[3];Mammal[] m = (Mammal []) c;Object[] o1 = (Object [])
c;Object o2 = (Object) c;c = (Cat[]) o2;
Mammal[] m = new Cat[4];m[0] = new Mammal(); //
exception
Mammal[] m = new Cat[4];m[0] = new Cat();Cat mittens = m[0]; // compile
error
Mammal[] m = new Cat[4];m[0] = new Cat();Cat mittens = (Cat) m[0]; //
OK
Object
Lisa
Jerry
Natalie
Wyatt
Object[][]
Lisa[][]
Jerry[][]
Natalie[][]
Wyatt[][]
Apple[] ref
Apple[] ref
Apple[] ref
Apple[] ref
Apple[][]
Apple[] object
Fuji[] object
Cat[][] c = new Cat[3][];c[1] = new Cat[5];c[1][0] = new Cat();
Cat[][] c = new Cat[3][];c[1] = new Cat[5];(c[1])[0] = new Cat();
Object
Lisa
Jerry
Natalie
Wyatt
Object[][][]
Lisa[][][]
Jerry[][][]
Natalie[][][]
Wyatt[][][]
Apple[][] ref
Apple[][] ref
Apple[][] ref
Apple[][] ref
Apple[][][]
Apple[][] object
Fuji[][] object
Object
Object[][][]Object[][]Object[] Object[][][][]
int
int
int
int
int[]
int[] ref
int[] ref
int[] ref
int[] ref
int[][]
int[] object
int[] object
Object
char[][][]byte[][]int[] float[]
public class HelloWorld {public static void main(String[] args)
{System.out.println(“Hello,
world!”);}
}
Hello, world!
• inner classes• generics• abstract classes• wrapper classes• enumerations• annotations• assert• final
http://proglit.com/