Login | Register   
LinkedIn
Google+
Twitter
RSS Feed
Download our iPhone app
TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
Browse DevX
Sign up for e-mail newsletters from DevX


Tip of the Day
Language: Java Language
Expertise: Beginner
Mar 21, 1997

Is this an Example of a Semantic Gap?

Question:
I posted this question to Java newsgroups, but the response from experts avoids the real issue.

Simple applet:

 
 import java.applet.*;
 import java.awt.*;
 public class FirstApplet extends Applet
 {  public void paint(Graphics g)
    {  g.drawString("Hello world",25,50);
    }
 }
 
Graphics class is abstract, i.e. cannot be instantiated. drawString is a method of Graphics and is also abstract, so has no body, so cannot be called.

The source code states that a variable g of type Graphics is passed to method paint, but it does not say that Graphics is subclassed and instantiated, which is what must happen for g to have something to point at.

That is, there is a semantic gap; something is happening beyond what the code actually tells us!

Can you explain that there is not a semantic gap here? That Java is indeed an unambiguous language? The line "paint(Graphics g)" only says that a variable of type Graphics is passed, which should result in a compile error.

Answer:
Maybe I'll have to join the legions of "experts" who have misunderstood your question, but I'll give it a shot anyway.

It seems to me that the actual graphics context associated with your applet will be an instance of some class that extends the abstract Graphics class, and will provide an implementation for drawString():

   class AppletGraphics extends Graphics {
      public void drawString(...) {...}
      // etc.
   }
 
 
Since Java methods are bound dynamically, like C++ virtual functions, the actual drawString() method called won't be determined until runtime.

Since specialization is implicit, g will automatically be cast as an instance of AppletGraphics, and the call to drawString(...) will be bound to Applet.drawString(...). In other words, the call to drawString() expands into the call:

(AppletGraphics)g.drawString(...);
at runtime.
DevX Pro
 
Comment and Contribute

 

 

 

 

 


(Maximum characters: 1200). You have 1200 characters left.

 

 

Sitemap
Thanks for your registration, follow us on our social networks to keep up-to-date