An Overview of Java - Columbus State University

advertisement

An Overview of Java

Based on Concepts in

Programming Languages

By John C. Mitchell

Brief History

• James Gosling at Sun, 1990

• Originally called Oak

• Designed to run on a device called the “set-top box” – (TV controller)

• Programs would be downloaded to the box

• Internet programming language was needed

• Oak started as a reimplementation of C++

• C++ wasn’t reliable enough

Java Language Goals

• Portability – easy to transmit programs over a network

• Reliability – Program crashes avoided as much as possible

• Safety – Receiving environment protected from programming errors and malicious code

• Dynamic Linking – programs distributed in parts, loaded by JRE

Java Language Goals

• Multithreaded Execution – support for concurrent programming

• Simplicity and Familiarity – appealing to

C++ and Web programmers

• Efficiency – important but secondary goal

Design Decisions

• Interpreted – Java bytecode executed on a

Java Virtual Machine (Portability, Safety)

• Type Safety – Three levels:

– Compile time checking of source

– Type checking of bytecode before execution

– Run-time checking (array bounds checking)

• Objects and References – Not everything is an object (Compromise between simplicity and efficiency)

Design Decisions

• Garbage Collection

– Necessary for complete type safety

– Simplifies programming. Avoids memory leaks

– Uses concurrency. GC runs as a background thread

• Dynamic Linking - Classes can be loaded incrementally as needed. Shorter wait times for transmitted programs.

• Concurrency Support – Model based on Threads

– Standard concurrency primitives built into language. Doesn’t rely on OS specific concurrency mechanisms

Design Decisions

• Simplicity – smaller and simpler than most production quality languages. C++ features not included in Java:

– Structures and Unions (Classes take their place)

– Functions ( Java uses Static methods)

– Multiple Inheritance (What was Stroustrup thinking?)

– GoTo (Mama mia! It’s spaghetti!)

– Operator overloading (small bang for the buck)

– Automatic coercions – complex and unsafe

– Pointers – Reference variables are conceptually easier and less prone to programming errors

Java Classes and Objects

• All Java objects are explict heap-dynamic variables (nameless)

• Dog d = new Dog(“Fido”); //inside method

• Fido object is explicit heap-dynamic

• Variable d is stack-dynamic variable

• No destructors – objects are garbage collected when no references are made to them (when GC wakes up)

Java Classes and Objects

• Initialization – Constructors called to create every object

– All variables given initial values

• Instance variable – one for each object

• Static variable – one for entire class

• Static fields initialized once with initialization expressions or static initialization block inside class

• Public static int x = 3;

• public class Dog

{ … static {/* code executed once when class is loaded */}

}

Java Classes and Objects

• Overloading of methods – based on signature of method (method name, number of parms, and parm types)

• Two methods with the same name and different signatures are overloaded

• Overloading resolved at compile time

Java Classes and Objects

• Garbage Collection – Don’t have to explicitly free objects. No dangling references

• Finalize() – Method called by GC just before space is reclaimed. Called by the virtual machine when the virtual machine exits

Java Classes and Objects

• Method main is invoked with the name of the class

• public static void main(String [] args)

• toString() – invoked when a string representation of the object is needed.

(Much easier than C++ operator overloading of <<

Packages and Visibility

• Four visibility distinctions for methods and fields

– public – accessible anywhere the class is visible

– protected accessible to methods of the class and any subclasses, as well as to other classes in the same package

– Private – accessible only in the class itself

– Package –accessible only to code in the same package. Members declared without an access modifier have package visibility

Access Qualifiers

Package

CLASS B

CLASS A public int w;

Protected int x;

Private int y; int z;

CLASS C

Access Qualifiers

Package

CLASS B

CLASS A public int w;

Protected int x;

Private int y; int z;

CLASS C

Packages

• Used to organize classes into logical and physical units

• Set of classes in a shared name space

• Package names match directory structures

• Package names combine with

CLASSPATH names to define paths to classes

Inheritance

}

{ public class Rectangle private int length, width; public Rectangle(int length, int width)

{ this.length = length; this.width = width; }

{ public setLength(int l) length = l;

{

} public int getLength() return length; }

Inheritance

public class Box extends Rectangle

{ private int height; public Box(int length, int width, int height)

{ super(length,height);

{ this.height = height; } public setHeight(int h) height = h;

{

} public int getHeight() return height; }

}

Method Overridng

• Class B extends A

• B is the Subclass

• A is the Superclass

• Class B inherits all fields and methods of A

• If A and B have a method with the same name, the B method overrides the A method

• If A and B have duplicate field names, the name in B hides the name in A

Constructors

• Constructors are called to create objects

• Box b = new Box(3,4,5);

• For derived classes, superclass constructors are called at the beginning

• Rectangle(3,4)

• Default constructors pass no parms

Final Methods

• Methods or classes can be declared final

• public final void myMethod( )

• public final Class A …

• Final methods can’t be overriden

• Final classes can’t be subclassed

Class Object

• All classes in Java are subclasses of Object

• Subclassing Object occurs by default

• Object methods:

– getClass()

– toString()

– Equals()

– hashCode()

– Clone()

– Wait(), notify(), notifyAll()

– Finalize()

Abstract Classes and Methods

• A class that does not implement all of its methods

• Can’t be used to instantiate objects abstract class Shape { abstract int getSize(); abstract void doNothing();

}

Interfaces

• A Java interface is a “pure abstract” class

• All interface members must be constants or abstract methods

• No direct implementation

• Classes “implement” the interface by agreeing to code every method in the interface

Interfaces

• public interface Speakable { public void speak();

}

• public class Dog implements Speakable …

• Classes can implement several interfaces. This takes the place of multiple inheritance used in other languages

• Interfaces can be used as the type argument for methods public void makeSpeak(Speakable s) …

Java Types: Classification

• Java types fall into two categories:

– Primitive – values:true,false and numbers

• boolean

• byte, short, int, long, char, float, double

– Reference – values refer to objects

• Class

• Inteface

• Array

Pointers

• There are no explicit pointer types in Java

• Java does have implicit pointers

• Every reference variable is a pointer that can refer to an object

• Dog d = new Dog(“Fido”); d

Fido

Reference Manipulation

• Dog d = new Dog(“Fido”);

Dog e; e = d;

Object obj = d; obj d e

Fido

Subtyping for Classes and

Interfaces

• If class B extends class A, then the type of

B objects is a subtype of the type of A objects

• A class can implement one or more interfaces

• (Multiple) interface subtyping allows objects to support (multiple) common behaviors without sharing a common implementation

Array Covariance

• Type rule in Java: If B is a subclass of A, B[ ] is a subtype of A[ ]

• A <: B implies A[ ] <: B[ ]

• This causes a problem called the array covariance problem

Class A { …}

Class B{ …}

B[ ] bArray = new B[6];

A[ ] aArray = bArray; //Ok since A[ ] <: B[ ] aArray[0] = new A( ); //allowed but causes

// run-time error - ArrayStoreException

Exceptions

• Exceptions are objects

– can indicate errors

– can indicate unusual events that deserve special attention

• Four categories of exceptions

– Code or data errors – bad array index

– Standard method exception – substring() can generate StringIndexOutOfBoundsException

– Programmer generated exceptions – build your own

– Java errors – JVM can generate exceptions

Exceptions

• Java forces programmers to deal with certain errors

• Certain exceptions don’t need to be caught – nothing to be done

• Provide a structured form of jump for exiting a block or function

• Data can be passed when the exit occurs

• Return is made to a point in the program that was set up to continue the computation

Exceptions

• Two mechanisms for supporting exceptions:

– throw - a statement or expression for raising

(throwing) an exception – aborts current computation and causes a jump

– try-catch - a handler that allows some code to respond to an exception (catching)

Exceptions

• In Java, exceptions are represented as objects of some subclass of class

Throwable

• The exception object carries information from the point the exception was thrown to the handler that catches it

• Designed to work well in multithreaded programs

Exceptions

• Exceptions are thrown and caught inside a try-catch block try { … some statements that might cause an exception…} catch(excp1 e) { …response statements } catch(excp2 e) { … response statements } finally { …statements}

Java Exception Classes

Throwable

Error

Exception

Runtime

Exception

Unchecked

Exceptions

User-

Defined

Exception

Classes

Checked

Exceptions

Exceptions

• Compiler checks that a handler exists for each checked exception

• Checked exception that might occur must be named in a throws clause public void foo() throws IOException

• Error and RuntimeExceptions are usually thrown by the operating system and are exempt from being listed in the throws clause

Subtype Polymorphism

• With Java subtyping, if any method m will accept any argument of Type A, then m will accept any argument from any subtype of A

• (Every subtype of A “is-an” A object)

• Subtype polymorphism provides a means for writing generic programs

Subtype Polymorphism

Stack myStack = new Stack()

Dog d1 = new Dog(“Fido”); myStack.push(d1);

Dog d2 = (Dog) myStack.pop();

Generics

• Java supports Generic types

Stack<Dog> myStack = new Stack<Dog>( )

Dog d1 = new Dog(“Fido”); myStack.push(d1);

Dog d2 = myStack.pop();

Java Virtual Machine

• Java compiler produces “bytecode” in a .class file

• Class file contains bytecode and symbol table – constant pool

• Class loader reads the class file and arranges the bytecode in memory

• Class Verifier checks that the bytecode is type correct

• Linker resolves interfile references

• Bytecode interpreter “executes” the bytecode

A.java

B.class

Network

JVM

Java

Compiler

JVM

Loader

Verifier

Linker

Bytecode Interpreter

A.class

Loader

• Classes are loaded incrementally when needed

• Classes are objects

• Customized ClassLoader objects can be defined

Verifier

• Makes sure of the following:

– Every instruction has a valid op-code

– Every branch instruction branches to the start of an instruction

– Every method has a structurally correct signature

– Every instruction obeys the Java type discipline

Interpreter

• Executes Java bytecode

• Performs run-time tests like index checking on arrays

• Run-time architecture includes program counter, instruction area, stack and heap

• Stack contains activation records containing local variables, parms, return values, and intermediate calculations for method invocations

Interpreter

• JVM has no registers. Intermediate values left on stack

• Objects stored on the heap

• All threads running of the same JVM share the same heap

• New threads are given a program counter and their own stack

Interpreter

• Activation records have three parts

– Local variable area – for local method variables

– Operand stack (within a stack) – for intermediate calculations and passing parms to other methods. Instructions are shorter since they implicitly reference the stack

– Data area – constant pool resolution, normal method return, exception dispatch

Interpreter: Constant Pool

• Bytecode contains a data structure called the “Constant Pool”

• Symbolic names – fields, classes, methods

• Each entry is numbered

• Bytecode instructions reference constant pool numbers

Interpreter

• Performs run-time tests:

– All casts are checked to make sure they are type safe: Dog d = (Dog) e;

– All arrary references are checked to insure the index is within bounds: x[i] = x[j] + x[k];

– References are checked to make sure they are not null before a method is invoked: d.toString( );

– Garbage collection and absence of pointer arithmetic contributes to type-safe execution

Interpreter: Bottleneck

• Bytecode references to a field or method cause table lookups for addresses that can be a bottleneck for concurrent programs getfield #5 <Field Obj var>

• Bytecode references are modified dynamically during execution with instructions that have direct addresses getfield … quick 6

• Reuse of the instruction is more efficient

Method Invocation in JVM

• Two types of methods

– Instance

• Require and instance of the class before they can be invoked and use dynamic (late) binding

• Person myself = new Person(“David”); mySelf.speak();

– Class

• Do not require an instance of the class and use static (early) binding

• Integer.parseInt(x);

Method Invocation in JVM

• JVM selects the Class method to invoke based on the type of Object reference.

This is known at compile time (static)

• JVM selects the Object method to invoke based on the actual class of the object at run time (dynamic)

Invoking a Method in JVM

• There are four bytecodes for invoking methods

– Invokevirtual - used when the superclass of an object is known at compile time

– Invokeinterface – used when only the interface of the object is known at compile time

– Invokestatic – used to invoke static methods

– Invokespecial – special cases

Invokevirtual

• Assume Person is a class that overrides toString() in Object

• Person p = new Person(“David”);

Object obj = p; obj.toString(); //invokes toString() in

Person

• Invokevirtual is used to call the toString() method in Person b

Bytecode Rewriting

• Invokevirtual causes a method to be selected from subclass method tables based on the runtime type of the object

• This requires a lookup in the constant pool

• After the first lookup, the bytecode is modified to avoid table lookup by inserting an offset to the method in the bytecode

Invokeinterface

• Similar to Invokevirtual except the methods being invoked on an object declared with an interface name may be in different classes and positions within the class

• Information that was determined during table look-up is preserved, but will not be correct if the next invocation occurs on an object of a different class

Security

• Java was designed to support mobile code

• Two main mechanisms for dealing with mobile code risks:

– Sandboxing –running the code in a restricted execution environment

– Code signing – verifying that the digital signature of the file producer is trusted

Buffer Overflow Attack

• Attackers send messages that cause a program to read data into a buffer memory

• The buffer memory is overwritten, leaving different return addresses or completely new code on the machine

• The sandbox consists of four Java mechanisms: class loader, verifier, runtime checks of the JVM, and the security manager

Class Loader

• Loader separates trusted class libraries from untrusted packages by using different class loaders

• Class loader places code into categories that let the security manager restrict the actions the code will be allowed to take

• Separate name spaces for classes loaded by different loaders

Security manager

• The manager is a single Java object

• Keeps track of which code can do which dangerous operations

• Each JVM has only one security manager at a time

• Security manager can’t be uninstalled

• Security manager answers questions about access permissions

Security Manager

• When Java makes an API call, the associated API code asks the security manager whether the operation is allowed

• Security manager uses the code signer and URL to determine if the operation is valid

• Security manager throws a

SecurityException if the operation is not allowed

Security and Type Safety

• By enforcing type safety, Java helps maintain security

• Security problems arise if the same storage area can be associated with two different types

Download