Accessibility and Visibility
With Examples in Java |
Prof. David Bernstein |
Computer Science Department |
bernstdh@jmu.edu |
Block | Entity is accessible within a block of code |
Subprogram | Entity is accessible within a subprogram |
Class/Private | Entity is accessible by all entities within a class |
Generalized/Protected | Entity is accessible in its class and all extensions |
Complete/Public | Entity is accessible everywhere |
There are other types of accessibility/visibility as well, some of which we will encounter later.
+
#
-
public int length
public void paint(Graphics g)
public class String
private int size
private void recalculate()
protected String title
protected void layout()
/** * A class that contains a static method that * (incorrectly) uses a non-static attribute */ public class StaticMethods1 { private String error; /** * An example method * * What Happens and Why? */ public static void main(String[] args) { error = "Too small!"; System.out.println(error); } }
/** * A class that illustrates block accessibilty */ public class BlockAccessibility1 { /** * An example method * * What Happens and Why? */ public void example() { int a; a = 5; for (int b=0; b < 10; b++) { System.out.println(b); } System.out.println(a); System.out.println(b); } }
/** * A class that illustrates block accessibilty */ public class BlockAccessibility2 { /** * An example method * * What Happens and Why? */ public void example() { int a; a = 5; if (a <= 5) { String error; error = "Too small!"; } else { error = "Too big"; } System.out.println(error); } }
try-catch
Statements:
try-catch
statements
can often cause difficulties
try { String token; StringTokenizer st; token = "Default"; st = new StringTokenizer(line); token = st.nextToken(); System.out.println(token); } catch (NoSuchElementException nsee) { System.out.println(token); // Compile-Time Error: // // cannot find symbol }
String token; try { StringTokenizer st; token = "Default"; st = new StringTokenizer(line); token = st.nextToken(); System.out.println(token); } catch (NoSuchElementException nsee) { System.out.println(token); // Compile-Time Error: // // variable token might not have been initialized }
/** * A class that illustrates subprogram accessibilty * * What Happens and Why? */ public class SubprogramAccessibility1 { public void buildMessage() { String errorMessage; errorMessage = new String("It exploded!"); } public void useMessage() { System.out.println(errorMessage); } }
/** * Explicit Value Constructor (for non-negative weights) * * @param pounds The number of pounds (must be positive) * @param ounces The number of ounces (must be positive) */ public Weight(int pounds, int ounces) { Weight aWeight; aWeight = new Weight(pounds, ounces, true); } /** * Explicit Value Constructor * * @param pounds The number of pounds (must be positive) * @param ounces The number of ounces (must be positive) * @param positive true for a postive Weight, false for negative */ public Weight(int pounds, int ounces, boolean positive) { this.pounds = Math.abs(pounds); this.ounces = Math.abs(ounces); this.sign = 1; if (!positive) this.sign = -1; }
Suppose that the Signature
class contains the following
declaration:
private String email, name, saying, url;
What happens in the following application and why?
/** * An application that illustrates class/private accessibilty */ public class PrivateAccessibility1 { /** * The entry point of the application * * @param args The command line arguments */ public static void main(String[] args) { Signature adamses, bernstdh; adamses = new Signature("Prof. Elizabeth Adams", "adamses@jmu.edu", "www.cs.jmu.edu/users/adamses/", "The search for truth is more "+ "precious than its possession"); bernstdh= new Signature("Prof. David Bernstein", "bernstdh@jmu.edu", "www.cs.jmu.edu/users/bernstdh/", "Everything should be made as simple "+ "as possible, but not simpler."); bernstdh.saying = "I'm a little teapot, short and stout."; } }
/** * An encapsulation of a signature at the end of * an email message * * @author Somebody at James Madison University * @version 1.0 */ public class Signature { private String email, name, saying, url; /** * Explicit Value Constructor */ public Signature(String name, String email, String url, String saying) { this.name = name; this.email = email; this.url = url; this.saying = saying; } /** * Compare the email address in this Signature * with the email address in another Signature * * @param other The other Signature * @return true if equal, false otherwise */ public boolean hasSameEmailAddressAs(Signature other) { boolean same; same = false; // Note that other.email is "visible" if (this.email.equals(other.email)) same = true; if (other.email.equals("bernstdh@jmu.edu")) { other.saying = "I'm a little teapot, short and stout."; } return same; } /** * Get the String to append to the end of the * email message * * @return The String */ public String toString() { String s; s = "-----" + "\n" + name + "\n" + email + ", " + url + "\n\n" + saying; return s; } }
/** * An application that illustrates class/private accessibilty */ public class PrivateAccessibility2 { /** * The entry point of the application * * @param args The command line arguments */ public static void main(String[] args) { Signature adamses, bernstdh; adamses = new Signature("Prof. Elizabeth Adams", "adamses@jmu.edu", "www.cs.jmu.edu/users/adamses/", "The search for truth is more "+ "precious than its possession"); bernstdh= new Signature("Prof. David Bernstein", "bernstdh@jmu.edu", "www.cs.jmu.edu/users/bernstdh/", "Everything should be made as simple "+ "as possible, but not simpler."); if (adamses.hasSameEmailAddressAs(bernstdh)) { System.out.println("They have the same email address."); } else { System.out.println("They have different email address."); } System.out.println("\n\n"); System.out.println(adamses.toString()); System.out.println("\n\n"); System.out.println(bernstdh.toString()); } }
import java.util.*; /** * A missive in an instant messaging system * * @author Prof. David Bernstein * @version 2.0 */ public class Chirp { protected String delimiters; // Delimiters between words protected String text; // The text of the message /** * Explicit Value Constructor * * @param typed What was typed by the user */ public Chirp(String typed) { text = typed; delimiters = " ,.;!?-\n\r"; } /** * Get the number of words in this Chirp * * @return The number of words */ public int getNumberOfWords() { int numberOfWords; StringTokenizer tokenizer; tokenizer = new StringTokenizer(text, delimiters); numberOfWords = tokenizer.countTokens(); return numberOfWords; } /** * Get the text of this Chirp * * @return The text */ protected String getText() { return text; } }
import java.io.*; import java.util.*; /** * A missive in an instant messaging system * * Unlike a normal Chirp, an ExpandedChirp does not * contain abbreviations -- they are all expanded * * @author Prof. David Bernstein * @version 2.0 */ public class ExpandedChirp extends Chirp { private Properties abbreviations; /** * Explicit Value Constructor * * @param typed What was typed by the user */ public ExpandedChirp(String typed) { super(typed); InputStream is; abbreviations = new Properties(); try { is = new FileInputStream("abbreviations.txt"); abbreviations.load(is); } catch (IOException ioe) { // There was a problem opening the file // containing the abbreviations } } /** * Get the text of this Chirp with all of the * abbreviations expanded * * @return The text */ public String getText() { String tempText; // Use the protected attribute in the parent tempText = replaceAbbreviations(text); return tempText; } /** * Replace the abbreviations in a message * * @param msg The original message */ private String replaceAbbreviations(String msg) { String replaced, token, word; StringTokenizer tokenizer; replaced = ""; // Use the protected attribute in the parent tokenizer = new StringTokenizer(msg, delimiters, true); while (tokenizer.hasMoreTokens()) { token = tokenizer.nextToken(); word = abbreviations.getProperty(token); if (word == null) replaced += token; else replaced += word; } return replaced; } }