Skip to main content

Final-Reference Variables-Constants in Java. What does it all mean?

So far, my programming journey has been easy riding. Everything in computer science I've come across so far seems so logical and (really) obvious after a moment's thought.
(n.b. The following will contain mistakes, don't copy and paste this for your Comp.Sci.101 Assignment. If any readers can help clarify my thinking, it would be much appreciated.)

Well, except for constants in Java.

In Java, you can define a variable and give it a value:
 (e.g. Year current =1932; creates an variable of type Year and initializes it with the value 1932).

Speaking correctly, the variable current is NOT equal to 1932. Rather, current is a reference to a location in the computer's memory where the data 1932 is stored. A variable name like current can be thought of as a listing in a telephone directory: "To find the current year, go to this address in the memory."

Variable are so called because their values can change during the running of a program. For example, we could change current=1932 to current=2014. The variable current would now refer to a different location in the memory where 2014 is stored. Since current is really a reference to a memory location,  the value of current has now changed  to a different memory location.
The value 1932 would be disposed of by Java's garbage collector because there is no longer any reference to it in the program. (i.e. 1932 was being referred to by current. Now, current  has been re-assigned to 2014, current's link to 1932 has been severed.)

In addition to variables (whose value can change), Java allows constants. Constants are designed to be unchanging.

For example, if you write a program that defines the class zebra, you might include variables like: no_of_legs, no_of_stripes, sex, among others.  Now, sex and no_of_stripes  will be different for different zebras, so we'll define those as variables. However, barring any accidents, zebras will have 4 legs.
Therefore, we'll make no_of_legs an integer constant, like this:

final Leg NO_OF_LEGS =4;
(This creates the constant NO_OF_LEGS of type Leg.  Assume the type Leg has been defined elsewhere in the program)

This tells the program that no matter what happens, all the zebras it ever sees will have 4 legs. Or does it?

NO_OF_LEGS is a reference to a location in the memory. Because it has been declared final, NO_OF_LEGS never refers to a different location. Programmers say it is referring to a specific object in the memory, and that object  cannot change. Seems reasonable.

BUT, the value stored in the object CAN change. In other words, we could re-purpose the program  zebra to deal with both 4-legged and the new breed of 6-legged zebras. We could add code to the program that said:
    NO_OF_LEGS = 6;

How is this different from the current year example above? There, when we re-assigned current the value 2014, a new object was created in the memory with a different address. current  was updated with a reference to the new address.

With the constant NO_OF_LEGS,  we have not created a new object in the memory. So we have not changed the location NO_OF_LEGS is referring to. Instead, we have replaced the 4  in that memory location with a 6.


There's one more question: why, wherefore, what's the reason, and ??




Comments

Popular posts from this blog

Einstein's Logic Puzzle (SPOILER ALERT!)

On Monday I began working through a Discrete Math textbook in preparation for some courses I'll be taking in January. There was a beautiful logic problem in Chapter 1, apparently created by Einstein. This is one version of it: Five men with  different nationalities and with different jobs live in  con secutive houses on a street. These houses are painted  dif ferent colors. The men have different pets and have   dif ferent favorite drinks.  Determine who owns a zebra and  whose favorite drink is mineral water (which is one of the  favorite drinks) given these clues:  The Englishman lives  in the red house.  The Spaniard owns a dog.  The Japanese  man is a painter.  The Italian drinks tea.  The Norwegian  lives in the first house on the left.  The green house is  immediately to the right of the white one. The photogra pher  breeds snails.  The diplomat lives in the yellow house. Milk is drunk in the middle house. The owner of the green  house drinks coffee. The Nor

CodeSchool vs Codecademy(or 'How socket inherits event listening methods and implements asynchronicity')

In this review I'm going to focus on the pedagogy that I see evident in some CodeSchool courses and compare them to  Codecademy. By pedagogy, I mean: 'How does CodeSchool teach?' and ' Does it do a good job of teaching?'. I'm going to argue that despite high quality videos, colourful web pages, and often ssspppeeeeeakkkiiiing...rrrreeally...slowly..., CodeSchool's pedagogy is inferior to that of Codecademy. There are many fantastic resources for learning to code on the web, and CodeSchool is one of them. So far I have completed courses in Ruby, Rails, Javascript, HTML/CSS, Jquery and Git on CodeSchool. The courses have all included high quality videos and colourful, interactive exercises- as well as  massive  pdf files of the slides ( the files take more than a minute to load on my machine .) The question is: does the higher production value mean better educational quality? The 'Try' courses on CodeSchool(such as Try Ruby and Try jQuery) are f

Ruby on Rails -First App

Yesterday I built my first (technically second) Rails app working through Michael Hartl's book . The 3rd edition is free to read online and has been recommended by several self-taught developers; it is also on The Odin Project curriculum. The first tutorial covers the basic installations, including Git, Heroku and Bitbucket (instead of GitHub). The steps are clear, but the language sometimes is not.  Most of the steps worked -except that my app doesn't seem to work when accessed from Heroku.    When running bundle install, I ran into problems with the SQL gems. Apparently this was because Ubuntu14.04 didn't come with the C compiler needed.  I needed to run:                                sudo apt-get install libsqlite3 -dev                                sudo apt-get install libpq -dev             After this the bundle install  went ahead fine.    I also finished CodeSchool's Rails for Zombies which introduced basic Rails. As a review, I'm now worki