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 300


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

The Java Lesson 24: abstract classes and polymorphism

Go to all tips in Java Lessons by Jon Huhtala
All Java Lessons contents page | Java Lesson 1 | Java Lesson 2 | Java Lesson 3 | Java Lesson 4 | Java Lesson 5 | Java Lesson 6 | Java Lesson 7 | Java Lesson 8 | Java Lesson 9 | Java Lesson 10 | Java Lesson 11 | Java Lesson 12 | Java Lesson 13 | Java Lesson 14 | Java Lesson 15 | Java Lesson 16 | Java Lesson 17 | Java Lesson 18 | Java Lesson 19 | Java Lesson 20 | Java Lesson 21 | Java Lesson 22 | Java Lesson 23 | Java Lesson 24 | Java Lesson 25 | Java Lesson 26 | Java Lesson 27 | Java Lesson 28 | Java Lesson 29 | Java Lesson 30 | Java Lesson 31 | Java Lesson 32 | Java Lesson 33 | Java Lesson 34 | Java Lesson 35 | Java Lesson 36 | Java Lesson 37 | Java Lesson 38 | Java Lesson 39 | Java Lesson 40 | Java Lesson 41 | Java Lesson 42 | Java Lesson 43 | Java Lesson 44 | Java Lesson 45 | Java Lesson 46

abstract classes and polymorphism


Introduction

Some classes are designed to be extended but NOT instantiated.

Consider, for example, a dog, a cat, a whale, and a human. Each is a mammal. In object-oriented design, Mammal would be the superclass and Dog, Cat, Whale, and Human would be classes that each extend Mammal. But, since there is no such thing as a generic mammal, there is no reason to instantiate a Mammal object.

The Mammal class is an example of a class that should be declared abstract.

An abstract class

  • Is defined using the abstract keyword. For example, the class header of the Mammal class might be

public abstract class Mammal

which indicates that an object of the class can never be instantiated. The class can, however, be extended by a subclass that would inherit all its features (to be covered shortly). For example,

public class Cat extends Mammal

would be the header of a Cat class that extends the Mammal class.

  • Can have features. Even though the class is abstract it can have instance variables, one or more constructor methods, "set" and "get" methods, and special purpose methods that will be inherited by its descendent classes.

  • Can optionally have one or more abstract methods. An abstract method is defined with the abstract keyword in the method header and has no body. For example,

public abstract double someMethod(double parm1, int parm2);

declares an abstract method named someMethod that requires two parameters (a double and an int) and returns a double value to the caller.

The purpose of an abstract method is to force certain features to exist within a subclass. An extending class must either override the abstract method to define the method body or declare itself to be abstract. If it does not override the abstract method or declare itself to be abstract, a compile error will occur.

  • Example: The following program contains the definition of a Mammal class (which is abstract) and a Cat subclass. The application class is trivial. It simply constructs a Cat object and displays its contents:

public class App {
public static void main(String[] args) {
Cat myCat = new Cat("Fluffy", 10);
System.out.println(myCat.toString());
}
}

abstract class Mammal {
private String name;
public Mammal(String iName) {
setName(iName);
}
public boolean setName(String nName) {
if (nName.length() > 0) {
name = nName;
return true;
}
else {
name = "unknown";
return false;
}
}
public String getName() {
return name;
}
public abstract boolean setAge(int nAge);
public abstract int getAge();
public abstract String toString();
}

class Cat extends Mammal {
private int age;
public static final int MAX_LIFE = 25;
public Cat(String iName, int iAge) {
super(iName);
setAge(iAge);
}
public boolean setAge(int nAge) {
if (nAge >= 0 && nAge <= MAX_LIFE) {
age = nAge;
return true;
}
else
return false;
}
public int getAge() {
return age;
}
public String toString() {
return getName() + " (cat), " + age;
}
}

Notes:

  1. The Mammal class encapsulates a mammal's name and supports the "setting" and "getting" of its name. The first two abstract methods will force subclasses to implement methods to "set" and "get" the mammal's age. The third abstract method will force subclasses to implement a meaningful toString() method.

  2. The Cat class subclasses Mammal to encapsulate information about a cat's age. It defines the setAge() and getAge() methods to store and retrieve the age of the cat. It also defines the toString() method to return a meaningful String of information about the cat.


Polymorphism

  • "the quality or state of being able to assume different forms"

- Webster's Collegiate Dictionary

  • Is implemented by the fact that an object reference can reference an object of its own class or any descendent class. In other words, if Cat descends from Mammal (as defined above), the following code is perfectly valid:

Mammal x = new Cat("Fluffy", 10);
System.out.println(x.toString());

This works because the object being constructed is a Cat and a Cat is a Mammal. Regardless of how we reference the object, however, it will always remain a Cat and have the features of a Cat.

Because an object reference can reference different kinds of objects, we can write some powerful code. For example, assume that Cat, Mouse, Sheep, and Wolf are subclasses of Mammal with each having its own implementation of the toString() method. If someMammal is a Mammal object reference that currently references either a Cat, a Mouse, a Sheep, or a Wolf, the expression

someMammal.toString()

will call the toString() method of the correct class. The object reference, someMammal, is polymorphic because it has the ability to take on different forms. It will "act like" an object of the class it currently references.

  • Example: The following program constructs an array of Mammal object references and loads the array with a mix of Cat and Mouse objects. It then uses polymorphism to display information about each object.

public class App {
public static void main(String[] args) {

// Declare an array of superclass object references.

Mammal[] pets = new Mammal[5];

// Load the array with objects that descend from the superclass.

pets[0] =
new Cat("Fluffy", 10);
pets[1] =
new Mouse("Speedy", 1);
pets[2] =
new Mouse("Mickey", 2);
pets[3] =
new Cat("Tiger", 3);
pets[4] =
new Cat("Garfield", 15);

// Use polymorphism to display the contents of the array.

Utility.skip();
for (int i = 0; i < pets.length; i++) {
System.out.println(" " +
pets[i].toString());
}
}
}

abstract class Mammal {
private String name;
public Mammal(String iName) {
setName(iName);
}
public boolean setName(String nName) {
if (nName.length() > 0) {
name = nName;
return true;
}
else {
name = "unknown";
return false;
}
}
public String getName() {
return name;
}
public abstract boolean setAge(int nAge);
public abstract int getAge();
public abstract String toString();
}

class Cat extends Mammal {
private int age;
public static final int MAX_LIFE = 25;
public Cat(String iName, int iAge) {
super(iName);
setAge(iAge);
}
public boolean setAge(int nAge) {
if (nAge >= 0 && nAge <= MAX_LIFE) {
age = nAge;
return true;
}
else
return false;
}
public int getAge() {
return age;
}
public String toString() {
return getName() + " (cat), " + age;
}
}

class Mouse extends Mammal {
private int age;
public static final int MAX_LIFE = 5;
public Mouse(String iName, int iAge) {
super(iName);
setAge(iAge);
}
public boolean setAge(int nAge) {
if (nAge >= 0 && nAge <= MAX_LIFE) {
age = nAge;
return true;
}
else
return false;
}
public int getAge() {
return age;
}
public String toString() {
return this.getName() + " (mouse), " + age;
}
}

More information

Java ranch has an excellent "campfire story" relating to this lesson. Be sure to read How my Dog learned Polymorphism.

Looking ahead

When using polymorphism, it is sometimes necessary to determine the class of an object being referenced. It is also sometimes necessary to convert (cast) one object as another. These topics, and more, will be covered in the next lesson.

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. True or False: An abstract class must contain at least one abstract method.

  1. True

  2. False

  1. True or False: An abstract class can have one or more constructors, instance variables, and instance methods.

  1. True

  2. False

  1. What will happen when an attempt is made to compile and execute the following program? 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) {
Base x = new Sub();
System.out.println(x.toString());
x.hello();
}
}
abstract class Base {
public String toString() {
return "I am a Base";
}
public abstract void hello();
}
class Sub extends Base {
public String toString() {
return "I am a Sub";
}
}
  1. A compile error will occur at line 3

  2. A compile error will occur at line 14

  3. Compiles successfully but a runtime error will occur at line 5

  4. Compiles and runs to display: "I am a Base"

  5. Compiles and runs to display: "I am a Sub"

  1. What will happen when an attempt is made to compile and execute the following program? 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
19
20
21
public class App {
public static void main(String[] args) {
Base[] subs = new Base[2];
subs[0] = new Sub();
subs[1] = new SubSub();
subs[1].hello();
}
}
abstract class Base {
public abstract void hello();
}
class Sub extends Base {
public void hello() {
System.out.println("I am a Sub");
}
}
class SubSub extends Sub {
public void hello() {
System.out.println("I am a SubSub");
}
}
  1. A compile error will occur at line 3

  2. A compile error will occur at line 4

  3. Compiles successfully but a runtime error will occur at line 5

  4. Compiles and runs to display: "I am a Sub"

  5. Compiles and runs to display: "I am a SubSub"


13236 bytes more | 1 comment | Printer Friendly Page  Send to a Friend | Score: 4
Posted by jalex on Thursday, February 03, 2005 (00:00:00) (14122 reads)

Java Virtual Machine

Go to all tips in General Java

Java: Java Virtual Machine

After you read this section, you should be able to understand how it's possible for a Java applet/application to run on many different machines. The key to Java's portability and security is the Java Virtual Machine.

The Java Virtual Machine

Most compilers translate from the source language (eg, C or Pascal) into machine language for one specific type of machine (eg, Pentium or Sun). The machine language for a Sun computer is not the same as for a Macintosh, or a Windows machine. You cannot use the same machine code program on different kinds of machines.

Most compilers produce code for a real machine

The Java compiler produces code for a virtual machine.

Java compilers translate applets in two steps. The first part of the translation is from Java source to Java Virtual Machine (JVM) machine code. This may seem strange because there isn't any real machine that can use JVM instructions yet!

JVM code is designed so that it is easy to translate it into machine instructions for real machines, so the second part of the translation to real machine instructions is done in the browser on the user's machine. The browser takes the applet JVM code that it gets from the server and translates from JVM code to the machine code the browser is using, eg, a Pentium. This compiler in the browser is often called a "JIT compiler". JIT stands for "Just In Time", and it means that the last part of the compilation is done just before running the program. The diagram below shows how the same applet JVM code is used by browsers on different machines.


Click on the picture to see full size image.

Two step compilation allows Java applets to run on many kinds of machines.

Other languages can use the JVM

See www.robert-tolksdorf.de/vmlanguages.html for a list of languages that generate code for the Java Virtual Machine.

Java portability

So applets are really JVM code that is translated into the correct machine code by the browser. That's why applets can run on any machine, and C and C++ programs cannot.

This same two step translation can be used for Java applications as well as applets. If a program is in JVM code, then it is portable, and can be run on any machine that has a JIT compiler on it.

C and C++ object programs are not portable because they are always translated into the machine language for a specific machine. If you are very careful when you write your C programs, you may be able to compile and run the source program on many machines, but there are often big problems. For example, how big is a C int? On some machines it is 16 bits, on some machines it is 32 bits, and some it is 64 bits. Java has defined the basic types very exactly (eg, ints are always 32 bits). Another big problem is that lack of standard library functions in C/C++. There are some standard library functions for C/C++, but they are very small compared to Java, and don't do many of the things that programmers need to do (eg build a graphical user interface).

Portability is extremely important to many companies, since large companies usually have many kinds of computers. If a company can "write once and run everywhere" they can save an enormous amount of money. If a developer can do this, they will have a much larger market for their software.



15 comments | Printer Friendly Page  Send to a Friend | Score: 0
Posted by jalex on Thursday, February 03, 2005 (00:00:00) (3884 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