Organizing and Securing Java Code
Course: 4343203 - Java Programming
Packages are namespaces that organize related classes and interfaces
// File: com/company/utils/Calculator.java
package com.company.utils;
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int subtract(int a, int b) {
return a - b;
}
}
src/
com/
company/
utils/
Calculator.java
MathUtils.java
models/
Student.java
Course.java
main/
Application.java
package shapes;
public class Circle {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
public double getArea() {
return Math.PI * radius * radius;
}
public double getCircumference() {
return 2 * Math.PI * radius;
}
public void display() {
System.out.println("Circle with radius: " + radius);
System.out.println("Area: " + getArea());
}
}
package shapes;
public class Rectangle {
private double width, height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
public double getArea() {
return width * height;
}
public double getPerimeter() {
return 2 * (width + height);
}
public void display() {
System.out.println("Rectangle: " + width + "x" + height);
System.out.println("Area: " + getArea());
}
}
package main;
// Import specific classes
import shapes.Circle;
import shapes.Rectangle;
// Or import all classes from package
// import shapes.*;
public class TestShapes {
public static void main(String[] args) {
// Using imported classes
Circle circle = new Circle(5.0);
circle.display();
Rectangle rect = new Rectangle(4.0, 6.0);
rect.display();
// Without import (fully qualified name)
shapes.Circle anotherCircle =
new shapes.Circle(3.0);
anotherCircle.display();
}
}
# Compile with package structure
javac -d . shapes/*.java main/TestShapes.java
# Directory structure after compilation:
src/
shapes/
Circle.class
Rectangle.class
main/
TestShapes.class
# Run with package name
java main.TestShapes
Import statements allow you to use classes from other packages without fully qualified names
import java.util.ArrayList;
import java.util.HashMap;
import java.io.File;
public class Example1 {
public static void main(String[] args) {
ArrayList list = new ArrayList<>();
HashMap map = new HashMap<>();
File file = new File("test.txt");
}
}
import java.util.*;
import java.io.*;
public class Example2 {
public static void main(String[] args) {
ArrayList list = new ArrayList<>();
HashMap map = new HashMap<>();
File file = new File("test.txt");
Scanner scanner = new Scanner(System.in);
}
}
import static java.lang.Math.*;
import static java.lang.System.out;
public class Example3 {
public static void main(String[] args) {
// Using static imports
double result = sqrt(16); // Math.sqrt()
double power = pow(2, 3); // Math.pow()
out.println(result); // System.out.println()
out.println(power);
// Constants
out.println("PI = " + PI); // Math.PI
out.println("E = " + E); // Math.E
}
}
import java.util.Date;
import java.sql.Date; // Compilation error!
// Solution: Use fully qualified names
public class DateExample {
public static void main(String[] args) {
java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(
System.currentTimeMillis());
}
}
Access modifiers control the visibility and accessibility of classes, methods, and variables
| Modifier | Same Class | Same Package | Subclass | Different Package |
|---|---|---|---|---|
| private | ✓ | ✗ | ✗ | ✗ |
| default | ✓ | ✓ | ✗ | ✗ |
| protected | ✓ | ✓ | ✓ | ✗ |
| public | ✓ | ✓ | ✓ | ✓ |
package package1;
public class ClassA {
public int publicVar = 1;
protected int protectedVar = 2;
int defaultVar = 3; // package-private
private int privateVar = 4;
public void publicMethod() {
System.out.println("Public method");
}
protected void protectedMethod() {
System.out.println("Protected method");
}
void defaultMethod() {
System.out.println("Default method");
}
private void privateMethod() {
System.out.println("Private method");
}
public void testAccess() {
// All accessible within same class
System.out.println(publicVar);
System.out.println(protectedVar);
System.out.println(defaultVar);
System.out.println(privateVar);
publicMethod();
protectedMethod();
defaultMethod();
privateMethod();
}
}
package package1;
public class ClassB {
public void testAccess() {
ClassA obj = new ClassA();
// Accessible in same package
System.out.println(obj.publicVar); // ✓
System.out.println(obj.protectedVar); // ✓
System.out.println(obj.defaultVar); // ✓
// System.out.println(obj.privateVar); // ✗
obj.publicMethod(); // ✓
obj.protectedMethod(); // ✓
obj.defaultMethod(); // ✓
// obj.privateMethod(); // ✗
}
}
package package2;
import package1.ClassA;
public class ClassC extends ClassA {
public void testAccess() {
// Accessible to subclass
System.out.println(publicVar); // ✓
System.out.println(protectedVar); // ✓
// System.out.println(defaultVar); // ✗
// System.out.println(privateVar); // ✗
publicMethod(); // ✓
protectedMethod(); // ✓
// defaultMethod(); // ✗
// privateMethod(); // ✗
}
}
Default access (no modifier) provides package-level visibility
package utilities;
// Package-private class
class Helper {
// Package-private field
String name;
// Package-private constructor
Helper(String name) {
this.name = name;
}
// Package-private method
void performTask() {
System.out.println(name + " performing task");
}
}
public class UtilityManager {
public void useHelper() {
// Can access package-private class
Helper helper = new Helper("Manager Helper");
helper.performTask();
}
}
package utilities;
public class Calculator {
// Package-private utility method
static double internalCalculation(double x) {
return x * 2 + 1;
}
public double calculate(double input) {
// Can access package-private method
return internalCalculation(input);
}
public void demonstrateAccess() {
// Can access package-private class
Helper helper = new Helper("Calculator Helper");
helper.name = "Modified Name";
helper.performTask();
}
}
package main;
import utilities.*;
public class Application {
public static void main(String[] args) {
Calculator calc = new Calculator();
// Can access public methods
double result = calc.calculate(5.0);
// Cannot access package-private
// Helper helper = new Helper("Test"); // ✗
// calc.internalCalculation(10); // ✗
}
}
CLASSPATH tells Java where to find class files and packages
# Windows
set CLASSPATH=.;C:\myproject\classes;C:\lib\mylib.jar
# Unix/Linux/Mac
export CLASSPATH=.:./classes:/usr/local/lib/mylib.jar
# Compilation with classpath
javac -cp ./classes:./lib/* com/company/Main.java
# Execution with classpath
java -cp ./classes:./lib/* com.company.Main
project/
src/
com/
company/
Main.java
utils/
Helper.java
classes/ (compiled .class files)
lib/ (external JAR files)
commons.jar
database.jar
# 1. Create directory structure
mkdir -p classes
# 2. Compile with package structure
javac -d classes -cp lib/* src/com/company/*.java src/com/company/utils/*.java
# 3. Results in classes directory:
classes/
com/
company/
Main.class
utils/
Helper.class
# 4. Run with correct classpath
java -cp classes:lib/* com.company.Main
Java Standard Library provides many useful packages
Automatically imported
import java.util.*;
import java.io.*;
import java.net.*;
public class BuiltinPackageDemo {
public static void main(String[] args) throws Exception {
// java.util package
ArrayList list = new ArrayList<>();
list.add("Java");
list.add("Programming");
HashMap scores = new HashMap<>();
scores.put("Alice", 95);
scores.put("Bob", 87);
Scanner scanner = new Scanner(System.in);
Random random = new Random();
// java.io package
File file = new File("example.txt");
FileWriter writer = new FileWriter(file);
writer.write("Hello, World!");
writer.close();
BufferedReader reader = new BufferedReader(new FileReader(file));
String content = reader.readLine();
reader.close();
// java.net package
URL url = new URL("https://www.oracle.com");
URLConnection connection = url.openConnection();
// java.lang package (automatically imported)
String text = "Java Programming";
int length = text.length();
String upper = text.toUpperCase();
Math.sqrt(16);
System.out.println("Content: " + content);
System.out.println("Random number: " + random.nextInt(100));
}
}
Next: Exception Handling
Ready to explore Exception Handling!