Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
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; d Fido e obj 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 User- Exceptions Defined Checked Exception Exceptions Classes 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 JVM Java A.java A.class Compiler JVM Network Loader B.class Verifier Linker Bytecode Interpreter 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