Lecture 6: Java for C++ ProgrammersGarbage collection in Java, no explicit delete No multiple...

Preview:

Citation preview

COMP 150-CCPCOMP 150-CCPConcurrent ProgrammingConcurrent Programming

Lecture 6:Java for C++ Programmers

Dr. Richard S. Hallrickhall@cs.tufts.edu

Concurrent programming – February 5, 2008

AgendaAgenda

● High-level description of differences● Hello world comparison● Class source files● Primitive types● Packages● Class path● Compiling and executing● Stack implementation comparison● Interfaces, generics, nested classes● Java Runtime Libraries● Programming tools

Java & C++ SimilaritiesJava & C++ Similarities

● Object-oriented languages Classes and methods Inheritance and overloading

● Similar C-like syntax

Java & C++ DifferencesJava & C++ Differences

● Java programs are not native executables● No header files in Java● No macro preprocessor in Java● No structs in Java● Garbage collection in Java, no explicit delete● No multiple inheritance

Java also defaults to virtual methods● No operator overloading● No global scope in Java● All non-primitive variables must be declared on

the heap (i.e., with new)● No pointers, practically everything is a pointer

C++ Hello World Example (1/2)C++ Hello World Example (1/2)

File helloworld.h:

#ifndef __HELLO_H__#define __HELLO_H__#include <string>

using namespace std;

class HelloWorld {public: void SayHello(string s);}; #endif

C++ Hello World Example (2/2)C++ Hello World Example (2/2)

File helloworld.cpp:

#include <iostream>#include "helloworld.h"

void HelloWorld::SayHello(string s) { cout << "Hello, " << s << "!" << endl;}

int main() { HelloWorld hw; hw.SayHello("Richard"); return 0;}

Output:Hello, Richard!

Java Hello World ExampleJava Hello World Example

File HelloWorld.java:

package helloworld;

public class HelloWorld { public void sayHello(String s) { System.out.println("Hello, " + s + "!"); } public static void main(String[] args) { HelloWorld hw = new HelloWorld(); hw.sayHello("Richard"); }}

Output:Hello, Richard!

Java Class Source FilesJava Class Source Files

● End with .java● Typically contain only one class

Can only have one public class, but may have multiple non-public classes

▴ Best practice is to use one class per file

● Named after the class contained inside e.g., class name = Stack, file name = Stack.java

● Convention is that class names start with a capital letter, method names start with lower case letter and use camel case

e.g., Class.myMethod()● Class source files are compiled into byte code

files with .class extension

Java Primitive TypesJava Primitive Types

● Primitive types include: byte, short, char, boolean, int, long,

float, double, void On the other hand, arrays are not primitive types, they

are special kinds of objects▴ e.g., they have the .length member

● Primitive types are not objects Can only be allocated on the stack Follow pass-by-copy semantics

▴ Arrays follow pass-by-reference semantics

● All primitive types have corresponding class definitions in java.lang

Byte, Short, Character, Boolean,Integer, Long, Float, Double, Void

Java Packages (1/2)Java Packages (1/2)

● Java class files are grouped into packages The package statement at beginning of source file

indicates to which package the class belongs▴ If no package specified, then class is in “default” package

But always specify a package!

Typically, all classes in a package will also be in the same directory on disk

Classes in a package can access each other's protected fields and methods

● Packages can be arranged in a hierarchy, but no special meaning in the parent/child relationship

Typically, packages are represented as hierarchical directories in the file system

Java Packages (2/2)Java Packages (2/2)

● A fully qualified class name is comprised of package and class name separated by periods

e.g., java.lang.String

● You can refer to classes by their full name or can import them to use only the class name

Similar to using namespace in C++ e.g., import foo.MyClass;

▴ Allows you to simply refer to MyClass in your code

e.g., import foo.*;▴ Allows you to refer to all classes in foo by only their name

The java.lang package is imported by default,so all classes in it can be referred to by their name

Java Class PathJava Class Path

● Like most platforms, Java defines a search order for locating class byte code

Similar to PATH and LD_LIBRARY_PATH for Windows and UNIX/Linux

● Nothing special Just a list of library archive files and/or directories to

search for compiled classes

● The default class path includes the built-in libraries

● Used for compiling and executing Java programs● Can be specified as an environment variable or

included on the command line

Compiling Java (1/2)Compiling Java (1/2)

● The javac command compiles Java classes

● Accepts numerous arguments, but the important ones are:

-d <directory> - where generated classes/packages are stored

-classpath <list> - list of archives and/or directories to be used as the class path

▴ The compiler will search this class path to resolve any dependencies on external class definitions

Compiling Java (2/2)Compiling Java (2/2)

● Assume the following project directory structure:src/ Source folder

stack/ Package folder

Stack.java Source files Main.java

classes/ Output folder

● Compile with:javac -d classes src/stack/*.java

● This will generate:classes/ Output folder

stack/ Package folder

Stack.class Class files Main.class

Executing Java (1/2)Executing Java (1/2)

● The java command starts the Java virtual machine to execute a Java program

Can execute any class with static main method, e.g.,public static void main(String[] args)

Your program can have many main methods, but you choose only one when you want to start

● Accepts numerous arguments, but the important one is:

-classpath or -cp - list of archives and/or directories to be used as the class path

▴ The virtual machine will search this class path to resolve all class definitions

Executing Java (2/2)Executing Java (2/2)

● Assume the following project directory structure:src/ Source folder

stack/ Package folder

Stack.java Source files Main.java

classes/ Output folder

stack/ Package folder

Stack.class Class files Main.class

● Execute with:java -cp classes stack.Main▴ Searches in classes for a class called stack.Main,

which is located in the stack directory and has a staticmain method

C++ Stack Example (1/4)C++ Stack Example (1/4)

File stack.h:

#ifndef __STACK_H__#define __STACK_H__#define INC 2

class Stack{private: void ** stack; int capacity; int used;

public: Stack(); void Push(void *ptr); bool IsEmpty(); void * Pop(); void * Peek();};

#endif

C++ Stack Example (2/4)C++ Stack Example (2/4)

File stack.cpp:

#include <iostream>#include "stack.h"using namespace std;

Stack::Stack() { stack = new void*[INC]; capacity = INC; used = 0;}

void Stack::Push(void *ptr) { if (used == capacity) { void ** newstack = new void *[capacity + INC]; for (int i = 0; i < used; i++) { newstack[i] = stack[i]; } stack = newstack; } stack[used++] = ptr;}

C++ Stack Example (3/4)C++ Stack Example (3/4)

File stack.cpp (con't):

bool Stack::IsEmpty() { return (used == 0);}

void * Stack::Pop() { if (used > 0) { return stack[--used]; } return NULL;}

void * Stack::Peek() { if (used > 0) { return stack[used - 1]; } return NULL;}

C++ Stack Example (4/4)C++ Stack Example (4/4)

File main.cpp:

#include <iostream>#include "stack.h"

using namespace std;

int main() { Stack stack; stack.Push((void *) "a"); stack.Push((void *) "b"); stack.Push((void *) "c"); stack.Push((void *) "d"); stack.Push((void *) "e"); cout << "peek " << *((char *) stack.Peek()) << endl; stack.Pop(); stack.Pop(); stack.Push((void *) "f"); while (!stack.IsEmpty()) { cout << "pop " << *((char *) stack.Pop()) << endl; }}

Java Stack Example (1/3)Java Stack Example (1/3)

File Stack.java:

package stack;

public class Stack { private final static int INC = 2; private Object[] stack; private int size; public Stack() { stack = new Object[INC]; size = 0; } public void push(Object o) { if (size == stack.length) { Object[] newstack = new Object[stack.length + INC]; for (int i = 0; i < size; i++) { newstack[i] = stack[i]; } stack = newstack; } stack[size++] = o; }

Java Stack Example (2/3)Java Stack Example (2/3)

File Stack.java (con't):

public boolean isEmpty() { return (size == 0); } public Object pop() { if (size > 0) { return stack[--size]; } return null; } public Object peek() { if (size > 0) { return stack[size - 1]; } return null; }}

Java Stack Example (3/3)Java Stack Example (3/3)

File Main.java:

package stack;

public class Main { public static void main(String[] args) { Stack stack = new Stack(); stack.push("a"); stack.push("b"); stack.push("c"); stack.push("d"); stack.push("e"); System.out.println("peek " + stack.peek()); stack.pop(); stack.pop(); stack.push("f"); while (!stack.isEmpty()) { System.out.println("pop " + stack.pop()); } }}

Interfaces (1/2)Interfaces (1/2)

● Java does not support multiple inheritance, instead it supports interfaces

Like an abstract class with only abstract public methods

Supports interface-based programming which allows us to decouple from specific implementations

● A class can extend only one base class (i.e., inherit from), but it can implement any number of interfaces

A class can be cast to its base class or to any interface that it implements

Interfaces (2/2)Interfaces (2/2)

public interface Shape { public void draw(Graphics g);}

public class Circle extends Base implements Shape { public void draw(Graphics g) { // Method details... }

// Class details...}

Circle inherits from Base and implements Shape, soit can be cast to either.

Generics (1/3)Generics (1/3)

● Generics are similar to C++ templates Allows you to define classes that are parameterized by

type Useful to ensure type safety Also helps you avoid having cast operations

throughout your code

Generics (2/3)Generics (2/3)

● Linked-list examplepublic class Node<T> { private T value; private Node next; public Node(T v) { value = v; } public T getValue() { return value; } public Node getNext() { return next; } public void setNext(Node n) { node = n; }}

Generics (3/3)Generics (3/3)

● Linked-list example (con't)

public static void main(String args) { Node<String> n = new Node<String>(“Richard”); n.setNext(new Node<String>(“Clement”)); do { // We can use String methods without // having to cast the value. System.out.println(n.getValue().length()); n = n.getNext(); }

while (n.getNext() != null);}

Nested Classes (1/3)Nested Classes (1/3)

● It is possible to define a class within another class

A nested class is a member of the enclosing class and has access to all of its members

● A nested class can be static or non-static Static nested classes are simply called nested

classes Non-static nested classes are called inner classes The difference between static and non-static nested

classes is that static nested classes cannot access instance data, while non-static can

Nested Classes (2/3)Nested Classes (2/3)

● Example of inner class

public class StringArray { private String[] data = { "Richard", "Clement" };

public Iterator getIterator() { return new Iterator(); }

public class Iterator { private int index = 0;

public String getNext() { if (index < data.length) { return data[index++]; } return null; } }}

Nested Classes (3/3)Nested Classes (3/3)

● Example of inner class (con't)

public class Main { public static void main(String[] args) { StringArray main = new StringArray(); Iterator i = main.getIterator();

for (String s = i.getNext(); s != null; s = i.getNext()) { System.out.println(s); } }}

Java Runtime Libraries (1/5)Java Runtime Libraries (1/5)

● Java comes with a large number of standard libraries

Provide platform/OS-neutral ways to handle nearly any task

▴ Console and file I/O▴ Utility data structures▴ Graphical user interface▴ Networking▴ Image creation and manipulation▴ Security▴ XML handling▴ etc.

Java Runtime Libraries (2/5)Java Runtime Libraries (2/5)

● The standard libraries are organized by packages They are automatically included on your class path

● Important standard packages include java.lang

▴ Contains the core class of the Java runtime

java.io▴ Contains the main classes related to I/O for data streams and

file systems

java.util▴ Contains various generic data structure implementations

Java Runtime Libraries (3/5)Java Runtime Libraries (3/5)

● Example of how to print using the static out field from java.lang.System

System.out.println(“Hello ” + name); System.out.print(“Hello ” + name);

▴ Most objects will be properly converted to a meaningful string representation (via Object.toString()) so that you can print them

▴ The + operator is used for string concatenation

Java Runtime Libraries (4/5)Java Runtime Libraries (4/5)

● List data structure ArrayList is an implementation of the List

interface based on an array as backing storage Example usage (assume that we have imported

java.util.List and java.util.ArrayList):

...List<String> list = new ArrayList<String>();list.add(“Richard”);list.add(“Clement”);for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i).length());}...

Java Runtime Libraries (5/5)Java Runtime Libraries (5/5)

● Map data structure HashMap is an implementation of the Map interface

based on a hashing function Example usage (assume that we have imported

java.util.Map and java.util.HashMap):

...Map<String,String> map = new HashMap<String,String>();map.put(“Richard”, “Hall”);map.put(“Clement”, “Escoffier”);System.out.println(map.get(“Richard”).length());System.out.println(map.get(“Clement”).length());...

Programming Tools (1/3)Programming Tools (1/3)

● Need to download Java JDK Provides command-line tools Typically you will use the version available from Sun

Microsystems, but there are others

● Sufficient to start with JDK and a text editor Advanced programmer tools are freely available Whether you work from the command line or using an

IDE is up to you

Programming Tools (2/3)Programming Tools (2/3)

● NetBeans

Programming Tools (3/3)Programming Tools (3/3)

● Eclipse

Recommended