C++ Vs Java

Detta är en kort genomgång av skillnader i java jämfört med C++. Nästan inget av detta används i kursen men under j-uppiften samt projektarbetet kan man givetvis vilja titta på dessa saker. Texten riktar sig till personer som har programmerat i C++ men övriga får givetvis läsa texten om de vill även om själva poängen aningen försvinner. Du kan ha använt c++ utan att rört många av dessa begrepp alls.

Java är i princip ett nedbantat C++, vilket i princip betyder att allt fungerar som det borde. De ändringar som gjorts handlar oftast om saker som folk ändå brukar göra fel på. Om man kör fast på något man vill göra men inte får i Java är det nästan alltid bäst att tänka efter om man verkligen behöver göra på det sätt som är förbjudet.

Om header filer
Java klasser använder sig inte av header filer. Från en rätt kommenterad klass kan man med programmet Javadoc generera specifikation av vilka metoder klassen presenterar mot omvärlden. Genom detta är det enkelt att skapa dokumentation och sprida hur klassen man programmerat ska användas. Det finns ett par praktiska taggar att använda (@author, @param,@return). Om dessa används och klassen är deklarerad som public kommer Javadoc generera html filer som beskriver klassen. Javadoc kommentarer görs genom att skriva
/**
* Get the value
* @return the stored value
*/

Om överlagring
Java stödjer överlagring av funktioner(att flera metoder har samma namn men skiljer sig i vilka argument som skickas in). Operator överlagring som finns i C++ är inte tillåtet. Det finns dock ett viktigt undantag, String defineras vara ett språkligt undantag som överlagrar '+' och '+=' men själv får man inte göra detta. C++ vana personer kan lämpligen ta en paus nu och säga lämpliga svordommar. Dock så är operator överlagringen endast för att göra koden snyggare så vi kan leva med detta.

Om minnesallokering
Java kontrollerar vilket minne man initierar och om man har en giltig pekare till detta minne. När minnet tar slut eller Java får instruktion om att rensa utförs så kallad Garbage collection, allt minne som det saknas referenser till frigörs. I praktiken innebär detta att man kan initera minne med kommandot new men inte behöver komma ihåg att radera detta när man inte längre behöver det. Garbage collection kan medföra en ganska kännbar paus i programkörningen men är väldigt sällsynt.

Om variabelsorter
De fundamentala typerna är byte, short, int , char, long, float, double och boolean. Till skillnad mot C++ har de fasta storlekar oavsett vilken dator det körs på.

Om pekare
Java har "pekare" men dessa kallas referenser inom Java. Anledningen till detta är att man inte kan göra aritmetik på dem som i C++. Dvs du kan ej skriva referens +i för att flytta dig i en vektor. En referens pekar alltid på en viss sorts klass och man kan endast göra jämförelser och tilldelningar. Alternativt pekar referensen på null (notera att null skrivs med små bokstäver i java).

Om voidpekare
Finns ingen motsvarighet för pekare till void. Voidpekaren används främst i C för att tillåta dynamisk bindning av funktioner under körning. I ett objektorienterat språk jobbar man normalt inte enligt denna modell utan använder just objektorienterad programmering. Man kan ge sig på att dynamiskt ladda klasser som skickas över t.ex. ett nätverk men för alla normala program är det antagligen lättare att hålla sig nere på jorden och använda vanlig objektorientering.

Om vektorer
Vektorer indexeras som vanligt från 0 och uppåt. Den viktigaste skillnaden mot C++ är att man inte kan skriva eller läsa utanför vektorn. Felanvändning genererar ett exception (särfall).

Om templates
Det finns inget stöd för templates. Inom kursen kommer vi behöva använda abstrakta datatyper i vissa situationer. Detta uppnås genom att man använder arv av basklassen Object. Mer detaljer finns i boken. Templates variant av voidpekaren finns inte i java även om nyckelord för att kunna lägga till detta till språket är reserverade.

Om arv av klasser
Arv av klasser fungerar som man väntar sig, man får dock inte använda mutilpelt arv. Det enda luriga skillnaden är att man finner basklassens metoder genom att använda pekaren super. (motsvarande operatorn :: i C++)

Om mutipelt arv
Behöver man mutipelt arv använder man i java interfaces, en sorts "virtuella" klasser. I klassdeklarationen anger man vilka interfaces man vill stödja. Kompilatorn kontrollerar då att man uppfyller specifikationen.

Har ni några frågor eller kommentarer om texten får ni gärna höra av er till Per-Anders Staav