![Page 1: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/1.jpg)
cs3180 (Prasad) L8Packages 1
Packages
Organizing large programs =>
From monolithic programs to partitioning class name space
Access control of names =>
Enforcing encapsulation
![Page 2: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/2.jpg)
cs3180 (Prasad) L8Packages 2
Organization of a Java Program
• Java Program– Forest of packages
• E.g., $PWD, java, javax, etc.
• Package (Tree)– Directory of sub-packages and compilation units
• E.g., java.io, java.util, java.lang.Thread, java.applet.Applet;
• Compilation Unit (Leaf)– File containing class and interface definitions with at
most one public class
• CLASSPATH environment variable– Set to full-path names of roots of trees in the
forest
![Page 3: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/3.jpg)
cs3180 (Prasad) L8Packages 3
CLASSPATH
= (Sub-)Package
= Compilation Unit
![Page 4: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/4.jpg)
cs3180 (Prasad) L8Packages 4
package statement
– Omitted : anonymous package
• For *.class byte code files to be accessible to
the JVM, ensure “.” ($PWD) is contained in
the environment variable CLASSPATH.
– package Pk;
• If a class is declared inside package Pk (or
subpackage Pk.Sk), then the *.java source
files must be stored in the directory Pk (or
Pk/Sk), and the CLASSPATH must contain
at least .../Pk.
![Page 5: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/5.jpg)
cs3180 (Prasad) L8Packages 5
import statement (for programmer convenience)– importing a type explicitly
• import java.util.StringTokenizer;
– importing type-on-demand• import java.io.*;
(**New in Java 5**)(**New in Java 5**)
– importing static members individually• import static java.lang.Math.PI;
– importing static members in group• import static java.lang.Math.*;
![Page 6: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/6.jpg)
cs3180 (Prasad) L8Packages 6
–private : • inaccessible from outside the class
– default : • accessible in the package
–protected : • accessible in the subclasses and the
package–public :
• no restriction on accessibility
Access Control : Informal Spec
![Page 7: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/7.jpg)
cs3180 (Prasad) L8Packages 7
pr i vat e defaultpr ot ect ed publ i c
same class Y Y Y Y
same packagesubclass N Y Y Y
same packagenon-subclass N Y Y Y
different packagesubclass N N Y Y
different packagenon-subclass N N N Y
![Page 8: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/8.jpg)
cs3180 (Prasad) L8Packages 8
class S extends C { public int i; protected int j; private int k; int p(C c) { return c.x ; // + c.y + c.z ; } int q(S s) { return s.x + s.y + // s.z + s.i + s.j + s.k ;
}}
class C { public int x; protected int y; private int z; int p(C c) { return c.x + c.y + c.z ; } int q(S s) { return s.x + s.y +((C) s).y +((C) s).z // + s.z + s.i ; // + s.j + s.k ;
}}
Access Control : C and S in different packages
![Page 9: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/9.jpg)
Notes• Public, protected and private fields of a direct
instance (e.g., c.x, c.y, c.z) of a class are accessible in the class (C’s text), while the private fields of a subclass instance (e.g., z field of s) are accessible in the class (C’s text) only via a static cast (e.g., ((C)s).z,and not s.z).
• The inherited protected field due to parent class (C) of a direct instance of a subclass (e.g., s.y) is available in subclass (S’s text).– Note that the protected field of a direct class instance
(e.g., c.y) is not available in the subclass (S’s text) and the protected field of a subclass instance is not available in the parent class (C’s text) (e.g., s.j).
cs3180 (Prasad) L8Packages 9
![Page 10: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/10.jpg)
cs3180 (Prasad) L8Packages 10
Other Constraints• Access modifier of a hiding/overriding
method must provide at least as much access as the hidden/overridden method.
• Otherwise, access barrier beaten by casting.
class C { public void p() {}}class S extends C {
private void p() {}}C x = new S();
x.p();
Illegal Code
![Page 11: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/11.jpg)
cs3180 (Prasad) L8Packages 11
Hiding and Overriding : Static and Dynamic Binding
S x = new S(); C y = x;
(x.a == 77)(y.a == 84)
(((C) x).a == 84) (x.p() == y.p())
(x.q() != y. q()) (((C) x).q() == y.q())
class C { int a = 84; static int q() {} int p()
{...}}class S extends C { int a = 77; static int q() { super.q() + 1; ...} int p() {... super.p() + 1; ...}}
![Page 12: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/12.jpg)
Notes• Static methods, static fields and instance
fields are statically bound, while instance methods are dynamically bound.
• Static methods, static fields, and instance fields can be hidden, while instance methods can be overridden.
• Hidden members of a subclass instance can be accessed outside the class (text) using static cast and within the subclass (text) using super prefix.
cs3180 (Prasad) L8Packages 12
![Page 13: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/13.jpg)
Defining a Method with the Same Signature as a Superclass's Method
Superclass Instance
MethodSuperclass Static
Method
Subclass Instance Method
OverridesGenerates a
compile-time error
Subclass Static Method
Generates a compile-time error
Hides
cs3180 (Prasad) L8Packages 13
![Page 14: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/14.jpg)
Accessibility and Overriding
A method can be overridden in a subclass only if the method in the superclass is accessible.
If a method in the superclass is not accessible then method in the subclass does not override it even if they have the same signature.
cs3180 (Prasad) L8Packages 14
![Page 15: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/15.jpg)
package P1;
public abstract class AbstractBase {
private void pri() { System.out.print("AbstractBase.pri()"); }
void pac() { System.out.("AbstractBase.pac()"); }
protected void pro() { System.out.("AbstractBase.pro()"); }
public void pub() { System.out.("AbstractBase.pub()"); }
public final void show() {
pri();
pac();
pro();
pub();
}}cs3180 (Prasad) L8Packages 15
![Page 16: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/16.jpg)
package P2; // Different package from AbstractBase
import P1.AbstractBase;
public class Concrete1 extends AbstractBase {
public void pri() { print("Concrete1.pri()"); }
public void pac() { print("Concrete1.pac()"); }
public void pro() { print("Concrete1.pro()"); }
public void pub() { print("Concrete1.pub()"); }
}
new Concrete1().show();
// only protected and public can be overridden
OUTPUT:
AbstractBase.pri()
AbstractBase.pac()
Concrete1.pro()
Concrete1.pub()
cs3180 (Prasad) L8Packages 16
![Page 17: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/17.jpg)
package P1; // Same package as AbstractBase
import P2.Concrete1;
public class Concrete2 extends Concrete1 {
public void pri() { print("Concrete2.pri()"); }
public void pac() { print("Concrete2.pac()"); }
public void pro() { print("Concrete2.pro()"); }
public void pub() { print("Concrete2.pub()"); }
}
new Concrete2().show();
// default (package), protected and public can be overridden
OUTPUT:
AbstractBase.pri()
Concrete2.pac()
Concrete2.pro()
Concrete2.pub()
cs3180 (Prasad) L8Packages 17
![Page 18: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/18.jpg)
package P3; // Different package from AbstractBase
import P1.Concrete2;
public class Concrete3 extends Concrete2 {
public void pri() { print("Concrete3.pri()"); }
public void pac() { print("Concrete3.pac()"); }
public void pro() { print("Concrete3.pro()"); }
public void pub() { print("Concrete3.pub()"); }
}
new Concrete3().show();
// Concrete3.pac() overriddes Concrete2.pac()
// which in turn overrides AbstractBase.pac()
OUTPUT:
AbstractBase.pri()
Concrete3.pac()
Concrete3.pro()
Concrete3.pub()
cs3180 (Prasad) L8Packages 18
![Page 19: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/19.jpg)
cs3180 (Prasad) L8Packages 19
Scope and Lifetime
• The scope of an identifier declaration is the region of text in which the declaration is effective.
• E.g., class scope, block scope, global, etc.
• The lifetime of a variable (or an object) bound to an identifier is the period during which the variable exists in the memory.
• E.g., Static variables and objects allocated via new on heapheap have “infinite” lifetime. (garbage collection)
• E.g., Formal parameters and local variables of a method are allocated on stack. stack. (LIFO discipline)
![Page 20: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/20.jpg)
cs3180 (Prasad) L8Packages 20
Enumeration myEnumerate(final Object[] arr) {
class E implements Enumeration { int count = 0; public boolean hasMoreElements() { return count < arr.length; } public Object nextElement() { return arr[count++]; } } return new E();}
– Scope of arr is the body of myEnumerate function.– Lifetime of the array instance referenced by arr is
“infinite”. It survives as long as the Enumeration object returned is “alive”.
![Page 21: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/21.jpg)
cs3180 (Prasad) L8Packages 21
Java Development Kit (1995)• java.lang (contains Threads) • java.io (contains StreamTokenizer)• java.awt (Abstract Windowing ToolKit) • java.net (Support for TCP/IP, HTTP)• java.applet (To run code via Browser)• java.util (Standard Utilities)
• javac, java, javadoc
![Page 22: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/22.jpg)
cs3180 (Prasad) L8Packages 22
![Page 23: Cs3180 (Prasad)L8Packages1 Packages Organizing large programs => From monolithic programs to partitioning class name space Access control of names => Enforcing](https://reader035.vdocument.in/reader035/viewer/2022062717/56649e555503460f94b4c83f/html5/thumbnails/23.jpg)
cs3180 (Prasad) L8Packages 23