940 likes | 1.17k Views
Java for C++ Programmers. First Night. Overview. First Night Basics Classes and Objects Second Night Enumerations Exceptions Input/Output Templates vs. Generics STL vs. JavaSE API. First Night Agenda.
E N D
Java for C++ Programmers First Night
Overview • First Night • Basics • Classes and Objects • Second Night • Enumerations • Exceptions • Input/Output • Templates vs. Generics • STL vs. JavaSE API
First Night Agenda • Basics – file structure, compilation & execution differences, standard out/err/in, primitive types, constants, functions, strings, reference types, arrays, passing variables, command line arguments, packages • Discussion • Lab exercises • Break • Classes & Objects – declaration, instantiation, access modifiers, members, methods, common methods, inheritance, interfaces, javadoc • Discussion • Lab exercises
C++ File Structure • We typically have header files (*.h, *.H *.hpp) and a source file (*.c, *.C, *.cpp) • There is no coloration between the name of the file and the classes (if any) defined within
C++ Example – factorial.H #ifndef _FACTORIAL_H_ #define _FACTORIAL_H_ intfactorial(int n); #endif
C++ Example – factorial.C #include"factorial.H" intfactorial(int n) { int result = 1; for(int i = n; i > 0; i--) { result *= i; } return result; }
C++ Example – example1.C #include<iostream> #include"factorial.H" usingnamespace std; intmain(int argc, char** argv) { int n = 4; cout << "factorial(" << n << "): " << factorial(n) << endl; exit(0); }
Java File Structure • No separate header file – all code is in a *.java file • No duplication of method signature in declaration (*.H) and definition (*.C) to keep in sync • No guarding of files to prevent against multiple includes • A file must contain a class of the same name • By convention files/classes start with a capital letter • Enforced consistency • No code lives outside of any class
Java Main Signature • Main signature is a bit different • No return value • Only 1 argument to main – a String array publicstaticvoid main(String[] args)
Java Factorial Example publicclass Factorial { publicstaticvoid main(String[] args) { int n = 4; System.out.print("factorial("); System.out.print(n); System.out.print("): "); System.out.println(factorial(n)); } staticint factorial(int n) { int result = 1; for(int i = n; i > 0; i--) { result *= i; } return result; } }
Compilation in C++ is done by compiling each of the *.C files, to produce *.o files The object files are then linked to create an executable which can be run directly a.out example1.o factorial.o example1.C factorial.H factorial.C C++ Compilation To run: a.out g++ example1.o factorial.o g++ -c example1.C g++ -c factorial.C
Java Compilation • In Java, *.java files are compiled into *.class files • These *.class files contain what is known as “bytecode” • Bytecode does not get run directly • Bytecode is not linked to produce an executable • Instead, this bytecode is interpreted and executed by another program known as the Java Virtual Machine (JVM) • Bytecode can be run on any platform having a JVM
*.java files are compiled using the javac command The class files are then executed using the java command Note no .class specified when running Factorial.class Factorial.java Java Compilation & Execution To run: java Factorial javac Factorial.java
Standard In/Out/Error • Like C++, Java automatically creates streams for stdout, stdin and stderr • cout is equivalent to System.out • cerr is equivalent to System.err • cin is equivalent to System.in • Unlike C++, no imports or includes need to be made to use these streams
Standard Out/Error • Output is easily done using one of the print methods off of these objects • System.out.print(arg) – prints the arg • If you want a newline (what you would get by using endl), use the println variant of this function – System.out.println(arg) • A detailed list of methods available on System.out or System.err can be found at: • http://java.sun.com/javase/6/docs/api/java/io/PrintStream.html#method_summary
Standard In • Like C++, Java automatically creates a stream for stdin • cin is equivalent to System.in • Unfortunately, reading a given type off of System.in is not as easy as using cin in C++ • Typically another class is used in conjunction with System.in to more easily read values off of the stream
Primitive Types • Like C++, Java has a built-in boolean type • C++ uses the keyword bool, whereas Java used the keyword boolean • Both use the values true and false • Unlike C++, you cannot assign non-boolean types into booleans • boolean x = 1 results in a compiler error
Primitive Types • Like C++, Java defines a character type • Just like C++, Java uses the char keyword to declare this type • Character literals are defined using single quotes such as 'a'
Primitive Types • Integer types are pretty much the same, both provide the following types • A C++ short int is a Java short • A C++ int is a Java int • A C++ long int is a Java long • There are no unsigned variants in Java • Unlike C++, if you want to assign a higher precision number into a lower precision container you must explicitly down cast… int i = 1234567; short s = (short)i;
Primitive Types • Like C++, Java has both float and double types • The same down casting rules that applied with integer types applies to doubles and floats also • So if you want to assign a double into a float you must cast it to be a float • Additionally, Java assumes that floating point literals are doubles by default • If you want to create a literal you can tack on an “f” to the literal to declare it of a float type float f = 1234.5678f;
Constants • Constants in C++ are typically done in one of two ways… • A #define • Or, a const declaration #define PI = 3.14159; constdouble PI = 3.14159;
Constants • Java does not have a traditional pre-processor to do substitutions like C/C++ • Thus it uses an approach similar to the const declaration • Constants in Java are typically declared to be public static final • Declared inside a class, outside all methods publicstaticfinaldoublePI = 3.14159;
Functions • C++ allows non-member functions • Java does not allow non-member functions • All functions in Java are actually methods • Methods may be made static, essentially making them equivalent to functions staticint factorial(int n) { int result = 1; for(int i = n; i > 0; i--) { result *= i; } return result; }
Strings • Java provides a String class much like the string class in the C++ STL • Similarities… • Can create by simply using a double quoted string • Concatenation is done using the + operator • Length obtained by calling .length() method • Some notable differences… • No overloaded [i] operator, use the .charAt(i) method instead • Strings in Java are immutable • For more documentation on Java strings see: • http://java.sun.com/javase/6/docs/api/java/lang/String.html
Strings • Since Strings are immutable a new String is created on all operations • Need to be sure to assign result back into variable, otherwise result of operation is lost String s = "foo"; s = s + "bar" + "baz"; s = s.substring(3); System.out.println(s); s = s.replace("b", "B"); System.out.println(s);
Reference Types • The way Java handles reference (non-primitive) types in Java is very different from that of C++ • A reference is kind of like a pointer in C++, but there are some notable differences • All objects are stored in variables are actually references to objects • No direct access to the underlying memory, including no pointer arithmetic • References are strongly typed unlike C++, cannot assign a Date reference into a String reference • Uninitialized references are set to null (lowercase)
Reference Types • In C++ we can statically create an object like so… • Or, dynamically create an object like so (and need to remember to free it like so)… • In Java, we create an object like so… Foof(); Foo * fPtr = new Foo(); delete fPtr; Foo f = new Foo();
Reference Types • If you’re using new, then it’s a reference • One of the biggest perks about Java’s approach to references deals with freeing objects • You don’t! No more delete statements. • Java uses a technique called “Garbage Collection” to automatically free memory which is no longer in use
Arrays • Arrays are allocated using the new keyword • Primitives are initialized to zero • The boolean type is initialized to false • References are initialized to null • Unlike C++, arrays in Java are objects • The length of an array can be determined by looking at the array’s .length member (not a method!) • Like C++, indexing is supported via square brackets – array[i]
Array Allocation // example declarations int[] intArray = newint[10]; boolean[] boolArray = newboolean[10]; // note [] may appear before of after, // before is the more popular Java convention String[] strArray1 = new String[10]; String strArray2[] = new String[10]; // may alternately use curly brace syntax String[] strArray3 = {"foo", "bar", "baz"};
Enhanced For Loop • Java 5 introduced a number of new features to the language – one of those is an enhanced for loop • This style for loop is known as a “foreach” loop • Popular looping construct in many languages: PHP, JavaScript, Perl, Python, Ruby, shell, etc… • C++ does not have a built in equivalent • Typically a foreach loop is used in place of a traditional for loop when we do not care about the index as we are iterating over the collection
Enhanced For Loop • The general format of this loop in Java is as follows… • An example… for(Type item : Collection) { // do something with item } for(int i = 0; i < array.length; i++) { System.out.println(array[i]); } // becomes... for(String s : array) { System.out.println(s); }
Passing Variables • Everything in Java is passed by value • Yes, everything – no goofy & or * notation • Does this mean passing an array of 1,000,000 items creates another huge array? • No! In the case of an array or object, the variable represents a reference, so the reference is being passed by value • So, when dealing with objects, we are always passing references (but by value)
Passing Variables publicclass Test { publicstaticvoid main(String[] args) { int[] array = newint[10]; for(int i = 0; i < array.length; i++) { array[i] = i; } zeroArray(array); // what is in array? } staticvoid zeroArray(int[] array) { for(int i = 0; i < array.length; i++) { array[i] = 0; } } }
Passing Variables publicclass Test { publicstaticvoid main(String[] args) { int[] array = newint[10]; for(int i = 0; i < array.length; i++) { array[i] = i; } zeroArray(array); // what is in array? } staticvoid zeroArray(int[] array) { array = newint[array.length]; } }
Command Line Arguments • Now that we know that how arrays are passed we can go back make use of command line arguments • Remember main takes a String array, so we can access that like any other array… publicstaticvoid main(String[] args) { for(String s : args) { System.out.println(s); } }
Packages • Like C++, Java provides a mechanism to organize code • Packages are similar to namespaces in C++ but have different syntax and conventions • In Java classes need not be explicitly be under a package, in which case the default package will be used • Though, this practice is discouraged
Namespaces in C++ namespace A { classFoo { // minimal class }; } intmain(int argc, char** argv){ A::FooaFoo(); return 0; }
Packages in Java • To package a class… • The first line in the Java file should be a package declaration in the following format… • The class file should be placed in a directory structure matching the package name… • foo/bar/baz/Foo.java package foo.bar.baz;
Packaging Conventions • Typically package names consist of lowercase letters and/or numbers • Multiple words are usually separated by periods • In the real world most projects use something called reverse domain name notation • edu.umbc.dhood2.proj1.ClassName • Use this as another method to group your code into logical chunks
Using a Package • Using a file in a package is very similar to that of C++ • In C++ we might have something like… • In Java, the syntax is different – we use the import keyword, drop the angle brackets, and the file extension #include<sys/socket.h> import java.util.Date;
Exercises Using Java, create, compile and run… • A simple “Hello World” program • A program which takes a single string as a command line argument prints out whether or not the string is a palindrome • Palindrome is a word that reads the same backwards as forwards • A program which creates an array of 20 integers, fills it with the Fibonacci sequence and prints it out • Fibonacci[0] = 1, Fibonacci[1] = 1 • Fibonacci[n] = Fibonacci[n-2] + Fibonacci[n-1]
C++ Class Declaration #ifndef _DATE_H_ #define _DATE_H_ classDate { private: intm_month; intm_day; intm_year; public: Date(int month, int day, int year); intGetMonth() const; intGetDay() const; intGetYear() const; voidSetMonth(int month); voidSetDay(int day); voidSetYear(int year); }; #endif
#include"Date.H" Date::Date(int month, int day, int year) { this->m_month = month; this->m_day = day; this->m_year = year; } intDate::GetMonth() const { returnthis->m_month; } intDate::GetDay() const { returnthis->m_day; } intDate::GetYear() const { returnthis->m_year; } voidDate::SetMonth(int month) { this->m_month = month; } voidDate::SetDay(int day) { this->m_month = day; } voidDate::SetYear(int year) { this->m_year = year; } C++ Class Definition
Java Differences • Since Java doesn’t split the declaration and implementation, all code is inline • No semi-colon at the end of the class declaration • Access explicitly attached to each method • this is not a pointer, but a reference, so we use the this. instead of this-> notation
Java Naming Conventions • Class name are in UpperCamelCase • Member names are lowerCamelCase • Method names are lowerCamelCase
publicclass Date { privateintmonth; privateintday; privateintyear; public Date(int month, int day, int year) { this.month = month; this.day = day; this.year = year; } publicint getMonth() { returnthis.month; } publicint getDay() { returnthis.day; } publicint getYear() { returnthis.year; } publicvoid setMonth(int month) { this.month = month; } publicvoid setDay(int day) { this.day = day; } publicvoid setYear(int year) { this.year = year; } } Java Class Declaration & Definition
C++ Method/Member Access • Private: • Only accessible from within the class or by friends • Protected: • Accessible from within the class, and by derived classes • Public: • Accessible by any anyone
Java Access Modifiers • Java member access is different from that of C++, some notable differences • No friend classes • Addition of 4th type, default (also known as package private)