Easy to Learn Java: Programming Articles, Examples and Tips

Start with Java in a few days with Java Lessons or Lectures

Home

Code Examples

Java Tools

More Java Tools!

Java Forum

All Java Tips

Books

Submit News
Search the site here...
Search...
 
Search the JavaFAQ.nu
1000 Java Tips ebook

1000 Java Tips - Click here for the high resolution copy!1000 Java Tips - Click here for the high resolution copy!

Java Screensaver, take it here

Free "1000 Java Tips" eBook is here! It is huge collection of big and small Java programming articles and tips. Please take your copy here.

Take your copy of free "Java Technology Screensaver"!.

Easy Learn Java: Programming Articles, Examples and Tips - Page 294


Previous 1060 Stories (530 Pages, 2 Per Page) Next

The Java Lesson 21

Go to all tips in

static and instance features of a class

Overview

Until now, all that has been said of the static keyword is that it identifies a class feature (a field or a method) that is associated with a class and not an instance of the class. You have seen it coded in the header of the main() method

public static void main(String[] args)

and in the header of other class methods. You have also seen it used in the declaration of a constant field within an instantiable class such as

public static final double MONTHLY_RATE = .015;

which appeared in the Customer class of the previous lesson.

It is now time that you learn the full significance of the static keyword when it appears in the declaration of a field or a method.

static fields

  • Are usually constants but can be variables.

  • Do not require an object in order to be used. They can be referenced by their class name. For example, you can access the constant Math.PI without instantiating a Math object (which is good, because the Math class isn't instantiable).

  • Only occur once in memory. If declared within an instantiable class, only one incarnation of a static field will exist that is automatically shared by all instances of the class.

Sharing an immutable constant isn't a problem. Sharing a variable, however, can lead to confusion if the programmer isn't careful about how he or she references the variable. Consider the following program:

public class App {
public static void main(String[] args) {
Number x = new Number();
Number y = new Number();
x.theOneAndOnlyNumber = 3;
y.theOneAndOnlyNumber = 7;
System.out.println("Value is " + x.theOneAndOnlyNumber);
}
}
class Number {
public static int theOneAndOnlyNumber;
}

The Java compiler permits a static feature of an instantiable class to be accessed by either an object reference or the class name. The above sample uses an object reference to access theOneAndOnlyNumber. As a static variable of the Number class, it is shared by the two Number objects (x and y). Any change made by one object will be seen by the other object. When this code is run, "Value is 7" will display.

The following code is even worse:

public class App {
public static void main(String[] args) {
Number x = new Number();
Number y = new Number();
x.theOneAndOnlyNumber = 3;
y.theOneAndOnlyNumber = 7;
System.out.println("Value is " + Number.theOneAndOnlyNumber);
}
}
class Number {
public static int theOneAndOnlyNumber;
}

In the above sample, theOneAndOnlyNumber is referenced three different ways! To avoid confusion, always reference a static variable by using its class name. For example,

public class App {
public static void main(String[] args) {
Number x = new Number();
Number y = new Number();
Number.theOneAndOnlyNumber = 3;
Number.theOneAndOnlyNumber = 7;
System.out.println("Value is " + Number.theOneAndOnlyNumber);
}
}
class Number {
public static int theOneAndOnlyNumber;
}

Objects x and y are really irrelevant to the setting of theOneAndOnlyNumber because it is associated with the class and not a particular object of the class. The above code makes this clear.

  • Are automatically initialized by the JVM when the class is first loaded into memory. Unless otherwise specified, boolean variables will be false, numeric variables will be zero, char variables will be 'u0000', and object references will be null. For example,

public class App {
public static void main(String[] args) {
System.out.println("Part number: " + Part.number);
System.out.println("Description: " + Part.description);
}
}
class Part {
public static int number;
public static String description;
}

will display

Part number: 0
Description: null

when run because number is automatically initialized to zero and description is a null object reference. If initial values are specified as follows

public class App {
public static void main(String[] args) {
System.out.println("Part number: " + Part.number);
System.out.println("Description: " + Part.description);
}
}
class Part {
public static int number = 17;
public static String description = "Left-handed widget";
}

the program's output will be

Part number: 17
Description: Left-handed widget

  • Can be initialized with a "static initializer". The general syntax is as follows:

static {
statements
;
}

where statements assign initial values to previously declared static fields within the class. For example,

public class App {
public static void main(String[] args) {
System.out.println("Part number: " + Part.number);
System.out.println("Description: " + Part.description);
}
}
class Part {
public static int number;
public static String description;
static {
number = 4;
description = "Widget extender";
}

}

has a static initializer in the Part class that initializes the static class variables. Static initializers are similar constructors but they do not accept parameters, cannot be called, and do not instantiate an object. They are automatically executed when the JVM first loads the class into memory.


static (class) methods

  • Do not require an object in order to be called. They can be referenced by their class name. For example, you have called my Keyboard.readInt() method without instantiating a Keyboard object.

  • Can only access other static features of their class. For example, consider this program

public class App {
String msg = "Hello World!";
public static void main(String[] args) {
System.out.println(msg);
}
}

Note that msg is a non-static, instance variable within the App class that references a string. The main() method, however, is static. Attempting to compile and execute this program will result in a compile error that says

"non-static variable msg cannot be referenced from a static context"

This is a VERY common mistake. One solution is to simply make the variable static as shown by

public class App {
static String msg = "Hello World!";
public static void main(String[] args) {
System.out.println(msg);
}
}

Another solution is to construct an App object and use it to reference the instance variable as shown by

public class App {
String msg = "Hello World!";
public static void main(String[] args) {
App myApp = new App();
System.out.println(
myApp.msg);
}
}

This may seem strange at first glance, but Java allows a class to instantiate and use an object of itself. The technique, in fact, is frequently used.

Summary of method access

  • An instance method is associated with both a class and an object. It can access the the static features of its class as well as the instance features of its object.

  • A static method is associated with a class but not an object. It can access the the static features of its class but requires an object in order to access that object's instance features.

The following table summarizes these points:

Method type How indicated Class features accessible? Instance features accessible?
instance method

static NOT coded in method header

YES

YES

class method

static coded in method header

YES

NO

Lab exercise for Ferris students

E-mail your answers to this assignment no later than the due date listed in the class schedule.

Review questions

  1. Which variable name can legally be coded in place of the XXXXX in line 8 the following program. (choose three)

1
2
3
4
5
6
7
8
9
10
public class App {
static char a = 'a';
boolean b = true;
double c =5.2;
static short d = 33;
public static void main(String[] args) {
byte e = 2;
System.out.println("Value is " + XXXXX);
}
}
  1. a

  2. b

  3. c

  4. d

  5. e

  1. What will result from attempting to compile and execute the following program? The line numbers are for reference purposes only.

1
2
3
4
5
6
7
8
9
10
11
public class App {
static int x = 12;
int y = 24;
public static void main(String[] args) {
App myApp = new App();
myApp.show();
}
public void show() {
System.out.println("Value is " + (x + y));
}
}
  1. Compilation will fail at line 3

  2. Compilation will fail at line 5

  3. Compilation will fail at line 6

  4. Compilation is successful but a runtime error will occur

  5. Compiles and runs to display "Value is 36"

  1. What will result from attempting to compile and execute the following program? The line numbers are for reference purposes only.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class App {
static int z;
static {
z = 1;
}
public static void main(String[] args) {
App app1 = new App();
app1.bump();
App app2 = new App();
app2.bump();
z++;
System.out.println("Result: " + z);
}
public void bump() {
z++;
}
}
  1. Compilation will fail at line 3

  2. Compilation will fail at line 15

  3. The program will compile but a runtime exception will occur

  4. The program will compile and run to display "Result: 4"

  5. The program will compile and run to display "Result: 3"

  1. What will result from attempting to compile and execute the following program? The line numbers are for reference purposes only.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class App {
public static void main(String[] args) {
SomeClass aClass = new SomeClass();
System.out.println("x: " + aClass.x);
System.out.println("y: " + aClass.y);
}
}
class SomeClass {
public static int x;
public int y;
static {
x = 6;
}
public SomeClass() {
x = 3;
y = 2;
}
}
  1. Compilation will fail at line 3

  2. Compilation will fail at line 15

  3. Compilation is successful but a runtime error will occur

  4. Compiles and runs to display

x: 6
y: 2

  1. Compiles and runs to display

    x: 3
    y: 2


13263 bytes more | 5 comments | Printer Friendly Page  Send to a Friend | Score: 5
Posted by jalex on Thursday, January 27, 2005 (00:00:00) (2060 reads)

Exam Directory: New website for IT Certification Exam Information Launched

Go to all tips in Good To Know
Exam Directory.com (27 Dec, 2004). A new web site for providing relevant and reliable information for IT professionals, who aspire for different certification exams, has been launched today.

Exam Directory is a search directory, where a user can find all the information regarding IT Certification Exams of every leading vendor. The list of vendors includes Microsoft, Oracle, Sun, Cisco, CompTIA, IBM and other leading vendors. The information regarding the type of certifications offered, the pre-requisites, the syllabus for the exam, how to enroll for a specific exam and host of other information has been categorized according to specific vendors.

Exam Directory is a result of continuous research by a team of experts, whose aim is to collect and provide even the minutest detail about certification exams, so the user should not have to make much effort, searching for resources. The team has worked continuously for a year and gathered as much information as one can find on the Internet.

This Directory is vital to users preparing for certification exams, as it provides every possible resource for the preparations. The Directory provides links to exam preparation tools like Practice tests, Study material, Online tests, Quizzes, Articles etc at a centralized location for the benefit of the users.

Exam Directory also provides users to add useful links related to certification exams. Users are invited to share any information that can be useful to others, planning to take the certification exams. Suggestions on how to improve and make the directory more useful are always welcome.

For more information, please visit the website at http://www.examdirectory.com

Sunita Singh,
Exam Directory.com

6 comments | Printer Friendly Page  Send to a Friend | Score: 4

Posted by Anonymous on Tuesday, January 25, 2005 (00:00:00) (2630 reads)

Previous 1060 Stories (530 Pages, 2 Per Page) Next

530| 529| 528| 527| 526| 525| 524| 523| 522| 521| 520| 519| 518| 517| 516| 515| 514| 513| 512| 511| 510| 509| 508| 507| 506| 505| 504| 503| 502| 501| 500| 499| 498| 497| 496| 495| 494| 493| 492| 491| 490| 489| 488| 487| 486| 485| 484| 483| 482| 481| 480| 479| 478| 477| 476| 475| 474| 473| 472| 471| 470| 469| 468| 467| 466| 465| 464| 463| 462| 461| 460| 459| 458| 457| 456| 455| 454| 453| 452| 451| 450| 449| 448| 447| 446| 445| 444| 443| 442| 441| 440| 439| 438| 437| 436| 435| 434| 433| 432| 431| 430| 429| 428| 427| 426| 425| 424| 423| 422| 421| 420| 419| 418| 417| 416| 415| 414| 413| 412| 411| 410| 409| 408| 407| 406| 405| 404| 403| 402| 401| 400| 399| 398| 397| 396| 395| 394| 393| 392| 391| 390| 389| 388| 387| 386| 385| 384| 383| 382| 381| 380| 379| 378| 377| 376| 375| 374| 373| 372| 371| 370| 369| 368| 367| 366| 365| 364| 363| 362| 361| 360| 359| 358| 357| 356| 355| 354| 353| 352| 351| 350| 349| 348| 347| 346| 345| 344| 343| 342| 341| 340| 339| 338| 337| 336| 335| 334| 333| 332| 331| 330| 329| 328| 327| 326| 325| 324| 323| 322| 321| 320| 319| 318| 317| 316| 315| 314| 313| 312| 311| 310| 309| 308| 307| 306| 305| 304| 303| 302| 301| 300| 299| 298| 297| 296| 295|
294
| 293| 292| 291| 290| 289| 288| 287| 286| 285| 284| 283| 282| 281| 280| 279| 278| 277| 276| 275| 274| 273| 272| 271| 270| 269| 268| 267| 266| 265| 264| 263| 262| 261| 260| 259| 258| 257| 256| 255| 254| 253| 252| 251| 250| 249| 248| 247| 246| 245| 244| 243| 242| 241| 240| 239| 238| 237| 236| 235| 234| 233| 232| 231| 230| 229| 228| 227| 226| 225| 224| 223| 222| 221| 220| 219| 218| 217| 216| 215| 214| 213| 212| 211| 210| 209| 208| 207| 206| 205| 204| 203| 202| 201| 200| 199| 198| 197| 196| 195| 194| 193| 192| 191| 190| 189| 188| 187| 186| 185| 184| 183| 182| 181| 180| 179| 178| 177| 176| 175| 174| 173| 172| 171| 170| 169| 168| 167| 166| 165| 164| 163| 162| 161| 160| 159| 158| 157| 156| 155| 154| 153| 152| 151| 150| 149| 148| 147| 146| 145| 144| 143| 142| 141| 140| 139| 138| 137| 136| 135| 134| 133| 132| 131| 130| 129| 128| 127| 126| 125| 124| 123| 122| 121| 120| 119| 118| 117| 116| 115| 114| 113| 112| 111| 110| 109| 108| 107| 106| 105| 104| 103| 102| 101| 100| 99| 98| 97| 96| 95| 94| 93| 92| 91| 90| 89| 88| 87| 86| 85| 84| 83| 82| 81| 80| 79| 78| 77| 76| 75| 74| 73| 72| 71| 70| 69| 68| 67| 66| 65| 64| 63| 62| 61| 60| 59| 58| 57| 56| 55| 54| 53| 52| 51| 50| 49| 48| 47| 46| 45| 44| 43| 42| 41| 40| 39| 38| 37| 36| 35| 34| 33| 32| 31| 30| 29| 28| 27| 26| 25| 24| 23| 22| 21| 20| 19| 18| 17| 16| 15| 14| 13| 12| 11| 10| 9| 8| 7| 6| 5| 4| 3| 2| 1|


Home Code Examples Java Forum All Java Tips Books Submit News, Code... Search... Offshore Software Tech Doodling

RSS feed Java FAQ RSS feed Java FAQ News     

    RSS feed Java Forums RSS feed Java Forums

All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest 1999-2006 by Java FAQs Daily Tips.

Interactive software released under GNU GPL, Code Credits, Privacy Policy