Saturday, February 23, 2008

Brushing up with Java

It's been quite an interest of mine to brush up with Java and Perl for awhile now but time has never really allowed me to do so.


Java for me is a language to which a lot of knowledge is stored away in the ol'brain but little wisdom so to speak. Java was maybe my 3rd language but I've also done a pretty good job of writing almost no Java code over the years hehe. I'm used to the syntax though. One day the Library had a sale of old books and one was the Java Sourcebook by Ed Anuff.

This was maybe 2006 and the book was so old that some where in the interface I think it said that JDK 1.0 Beta would be released by the time people were buying the book. Until more recent aspects involving Python and C++ with Qt3 / Qt4 its introduction (unwritten) to Javas Abstract Window Toolkit (AWT) was the closest I ever got to GUI work.


It is a very good book IMHO but of course very dated, I don't know how much java.lang.applet and whatnot has changed over the years, I never really cared much for Java applets! But I am pretty sure that a lot is different with AWT and the newer Swing toolkit. One thing that I actually find interesting, the Java Sourcebook is maybe the only book I've seen that uses the same brace style I tend to use in C. Hmm, maybe it was an influence on my ways of doing things :\


Not to long ago I checked out a nice O'Reilly book on Java because I wanted to see how much the language had changed in the past ten years or so. Java indeed changed quite a lot, it is way more fatter then I remember but it is still just as sweet.


One thing I like about C, the syntax is small enough to cram in ones head easy and follow it up with a reference of the standard library for stuff you don't use often. Java OTOH is probably a few orders of magnitude larger then that for most people. With the things I noted, inner classes, generics, etc I was a little suprised that they were there but the language seems to have grown naturally. As I read though parts of the book I was constantly like "Oh, that works just like I expected" when comparing the detailed explanations of how things work along side the code listings.


C++ was my first language aye but I think I'm more comfortable with Java. Because in the fields where C++ differs from C, I tend to get a little more lost, while with Java most of it is already there.


Perl, my second language but probably the weakest in my skill set. I quickly got board and skipped a lot which gradually filtered through over the years. I respect Perl for its power and flexibility but I think it has gotten a little to big for its own good IMHO, although I wait to see what Perl 6 will bring us.


I remember in the Java Sourcebook there were several examples, such as an implementation for Lamp and LightBulb classes that interacted and various cat related ones that used a speak() method to examine how overloading methods and inheritance worked.

This is a reworking of it from memory, same basic idea though:


Jeez now that I think of it, those examples remind me of stuff from an UnrealScript tutorial I looked at a couple years back too. Who knows with how much UnrealScript feels like a customized Java they probably read the same book hehe.


/**
 * Feline.java, abstract representation of felines
 */
abstract class Feline {
    abstract void speak();
}


/**
 * HouseCat.java, implements a feline that meows
 */
class HouseCat extends Feline {
    HouseCat() {
    }
    HouseCat(String call) {
        this.speak(call);
    }
    void
    speak() {
        System.out.println("Meeeooowww!!!");
    }
    private void
    speak(String call) {
        System.out.println(call);
    }
    public static void
    main(String[] args) {
        HouseCat theCat,newCat;
        theCat = new HouseCat();    /* use default constructor */
        newCat = new HouseCat("I am a cat!");

        theCat.speak();
    }
}


The HouseCat class implements a Feline (abstract meaning you can subclass it but you can't create it directly). There is a simple constructor made to behave like a default constructor and one that invokes a private version of the speak() method using a supplied string.


I have the Java Development Kit and Run Time Environment installed from the packages on the FreeBSD Foundation website. Compiles fine with javac and gcj42, that is the GNU Compiler for Java ;-).


What I do like about Java, its fairly portable between systems running the same implementation (e.g. Suns JRE) as far as language features go. It also follows a largely logical behavior for many things from what I have seen.


And to top it all off, GCJ can compile to native machine code rather then Java Bytecode -- for me a huge plus. I do have Qt4 bindings for Java installed on my desktop so I am interested to see where that goes, as far as my laptop is concerned I would probably need to use Suns compiler for AWT/Swing apps though. Not sure if Qt Jambi is in FreeBSD ports yet either.


As much as I love C, there are just some things that I don't really want to have to implement in it. And as productive as I am in Python and Ruby I really need to cuddle up with some thing a bit closer to C's end of the spectrum. I don't really care a lot for C++, I can use it fine but don't see much point for it over C besides templates and exceptions. Java lacks pointers in the same light as C/C++ uses but the references should be fine enough for my general needs.

C++ is multiple inheritance and Java is single, I'm not really partial to either concept as long as nether takes to biting me often. I have long enjoyed the design of Java's classes and interfaces though, I love the interface thing in Java.


I don't exactly care much for Suns compiler though but hey, if it works (y).

No comments:

Post a Comment