Browse papers
A

Section A: Long Answer Questions

Attempt all / any as specified.

4 questions
1long15 marks

(a) Explain the four fundamental principles of Object-Oriented Programming (encapsulation, inheritance, polymorphism and abstraction) and discuss how each is supported by features of the Java language. (7)

(b) Distinguish between method overloading and method overriding in Java with suitable code examples. Explain the role of the super and this keywords and the use of the final modifier when applied to a method and a class. (8)

(a) Four Principles of OOP and their Java support (7 marks)

1. Encapsulation — Bundling data (fields) and the methods that operate on them inside a single unit (a class) and hiding the internal state.

  • Java support: private/protected access modifiers hide fields; public getter/setter methods control access.
class Account {
    private double balance;            // hidden state
    public double getBalance() { return balance; }
    public void deposit(double a) { if (a > 0) balance += a; }
}

2. Inheritance — A class (subclass) acquires the fields and methods of another class (superclass), enabling code reuse and an is-a relationship.

  • Java support: the extends keyword for classes and implements for interfaces; all classes implicitly extend Object.
class SavingsAccount extends Account { double interestRate; }

3. Polymorphism — "Many forms": the same method call behaves differently depending on the object type.

  • Java support: compile-time polymorphism via method overloading, and run-time polymorphism via method overriding with dynamic dispatch through a superclass reference.

4. Abstraction — Exposing only essential features while hiding implementation detail.

  • Java support: abstract classes and methods, and interface types that declare what a class does without how.

(b) Overloading vs Overriding, super/this, final (8 marks)

FeatureMethod OverloadingMethod Overriding
DefinitionSame method name, different parameter list in same classSubclass redefines a superclass method with the same signature
BindingCompile-time (static)Run-time (dynamic)
InheritanceNot requiredRequired (subclass–superclass)
Return typeCan differSame or covariant
class Calc {                       // OVERLOADING
    int add(int a, int b) { return a + b; }
    double add(double a, double b) { return a + b; }
}

class Animal { void sound() { System.out.println("Generic"); } }
class Dog extends Animal {          // OVERRIDING
    @Override void sound() { System.out.println("Bark"); }
}

this keyword — refers to the current object; used to disambiguate fields from parameters (this.x = x), to call another constructor (this(...)), or to pass the current object.

super keyword — refers to the immediate superclass; used to call the superclass constructor super(...), or to invoke an overridden superclass method super.sound().

final modifier:

  • On a method — the method cannot be overridden by any subclass.
  • On a class — the class cannot be subclassed (e.g. String is final).
  • (On a variable it makes it a constant.)
java-basicsoopinheritance
2long15 marks

(a) Describe the life cycle of a thread in Java with a neat labelled state-transition diagram, explaining the transitions between the new, runnable, running, blocked/waiting and dead states. (6)

(b) What is meant by thread synchronization? Write a complete multithreaded Java program that implements the classic producer–consumer problem using wait() and notify() on a shared bounded buffer, and explain how your solution avoids race conditions. (9)

(a) Thread Life Cycle in Java (6 marks)

A Java thread passes through the following states (managed by the JVM scheduler):

   new Thread()        start()           scheduler picks
  ┌─────────┐  ───────► ┌──────────┐  ─────────────► ┌─────────┐
  │   NEW   │           │ RUNNABLE │  ◄───────────── │ RUNNING │
  └─────────┘           └──────────┘   yield/preempt └─────────┘
                            ▲                              │
              notify()/     │  sleep()/wait()/             │ run() ends
              I/O ready/    │  blocked on lock/join        ▼
              timeout       │                         ┌─────────┐
                       ┌─────────────────┐            │  DEAD   │
                       │ BLOCKED/WAITING │            │(TERMIN.)│
                       └─────────────────┘            └─────────┘
  • New — the Thread object is created but start() has not yet been called.
  • Runnable — after start(); the thread is ready and waiting for CPU from the scheduler.
  • Running — the scheduler has selected the thread and run() is executing.
  • Blocked / Waiting / Timed-waiting — temporarily inactive, e.g. waiting for a lock, calling wait(), sleep(ms), or join(). It returns to runnable when the condition is satisfied (notify(), lock acquired, timeout, I/O complete).
  • Dead / Terminatedrun() has finished or the thread was aborted; it cannot be restarted.

(b) Thread Synchronization & Producer–Consumer (9 marks)

Thread synchronization is the mechanism that ensures only one thread accesses a shared resource (critical section) at a time, preventing race conditions and inconsistent data. In Java it is achieved with the synchronized keyword (intrinsic locks/monitors) and inter-thread coordination via wait(), notify() and notifyAll().

import java.util.LinkedList;
import java.util.Queue;

class BoundedBuffer {
    private final Queue<Integer> buf = new LinkedList<>();
    private final int capacity = 5;

    public synchronized void produce(int value) throws InterruptedException {
        while (buf.size() == capacity)   // wait while full
            wait();
        buf.add(value);
        System.out.println("Produced: " + value);
        notifyAll();                     // wake consumers
    }

    public synchronized int consume() throws InterruptedException {
        while (buf.isEmpty())            // wait while empty
            wait();
        int value = buf.poll();
        System.out.println("Consumed: " + value);
        notifyAll();                     // wake producers
        return value;
    }
}

public class ProducerConsumer {
    public static void main(String[] args) {
        BoundedBuffer b = new BoundedBuffer();
        Thread producer = new Thread(() -> {
            try { for (int i = 1; i <= 10; i++) b.produce(i); }
            catch (InterruptedException e) { Thread.currentThread().interrupt(); }
        });
        Thread consumer = new Thread(() -> {
            try { for (int i = 1; i <= 10; i++) b.consume(); }
            catch (InterruptedException e) { Thread.currentThread().interrupt(); }
        });
        producer.start();
        consumer.start();
    }
}

How race conditions are avoided:

  • produce() and consume() are synchronized on the same buffer object, so only one thread holds the monitor at a time — no concurrent modification of buf.
  • wait() is called inside a while loop (not if) so a thread re-checks the condition after waking, guarding against spurious wake-ups.
  • wait() releases the lock while sleeping, letting the partner thread proceed; notifyAll() wakes waiting threads when the buffer state changes, preventing deadlock and lost updates.
multithreadingsynchronizationconcurrency
3long14 marks

(a) List and explain the four types of JDBC drivers, stating one advantage and one disadvantage of each. (6)

(b) Write a complete Java program that connects to a MySQL database, retrieves all records from an Employee(empId, name, salary) table using a PreparedStatement, and prints them. Clearly identify the standard steps of JDBC connectivity used in your program and explain the difference between Statement and PreparedStatement. (8)

(a) Four Types of JDBC Drivers (6 marks)

Type 1 — JDBC-ODBC Bridge Driver

  • Translates JDBC calls into ODBC calls.
  • Advantage: easy to use, connects to any database with an ODBC source.
  • Disadvantage: slow (extra translation layer), platform-dependent, requires ODBC installed; removed in JDK 8.

Type 2 — Native-API (Partly Java) Driver

  • Converts JDBC calls into the database vendor's native client API.
  • Advantage: faster than Type 1.
  • Disadvantage: native client library must be installed on each machine; not fully portable.

Type 3 — Network-Protocol (Middleware) Driver

  • Pure Java; sends JDBC calls to a middleware server that talks to the database.
  • Advantage: no client-side library, can connect to many databases through one driver.
  • Disadvantage: needs an extra middleware/application server tier.

Type 4 — Thin (Pure Java) Driver

  • Pure Java; converts JDBC calls directly into the database's network protocol.
  • Advantage: fully portable, fastest, no client software needed (most widely used, e.g. MySQL Connector/J).
  • Disadvantage: database-specific (a different driver is needed per database vendor).

(b) JDBC Program with PreparedStatement (8 marks)

import java.sql.*;

public class EmployeeList {
    public static void main(String[] args) {
        String url  = "jdbc:mysql://localhost:3306/company";
        String user = "root", pass = "password";
        String sql  = "SELECT empId, name, salary FROM Employee";

        // Step 1: Load driver (optional since JDBC 4.0 auto-loads)
        // Step 2: Establish connection (try-with-resources auto-closes)
        try (Connection con = DriverManager.getConnection(url, user, pass);
             PreparedStatement ps = con.prepareStatement(sql);   // Step 3
             ResultSet rs = ps.executeQuery()) {                 // Step 4

            System.out.printf("%-6s %-15s %-10s%n", "ID", "Name", "Salary");
            while (rs.next()) {                                  // Step 5: process
                System.out.printf("%-6d %-15s %-10.2f%n",
                    rs.getInt("empId"), rs.getString("name"), rs.getDouble("salary"));
            }
        } catch (SQLException e) {                               // Step 6: close is automatic
            e.printStackTrace();
        }
    }
}

Standard JDBC steps: (1) load/register the driver, (2) establish a Connection via DriverManager, (3) create a Statement/PreparedStatement, (4) execute the query to obtain a ResultSet, (5) iterate and process the results, (6) close the resources (here handled automatically by try-with-resources).

Statement vs PreparedStatement:

StatementPreparedStatement
SQL compiled on every executionSQL precompiled once, reused with parameters
Built by string concatenation — prone to SQL injectionUses ? placeholders set by setXxx()safe from injection
Slower for repeated queriesFaster for repeated execution
Cannot handle binary/parameterised input cleanlyHandles parameters and types cleanly
jdbcdatabase-connectivity
4long12 marks

(a) Explain the Java event delegation model. Describe the roles of the event source, event object and event listener with reference to handling a button click in Swing. (5)

(b) Design and write a Swing-based GUI application for a simple login form containing two text fields (username and password) and a Login button. When the button is clicked, the program should display a message dialog indicating whether the entered credentials match a hard-coded valid pair. Use an appropriate layout manager. (7)

(a) Java Event Delegation Model (5 marks)

In the delegation event model an event generated by a source is delegated to (handled by) one or more registered listener objects, rather than the source handling it itself. Three participants:

  • Event Source — the GUI component that generates the event (e.g. a JButton). It maintains a list of registered listeners and fires events to them via addXxxListener().
  • Event Object — an object (e.g. ActionEvent) that encapsulates information about what happened (source, command, timestamp). It is passed to the listener method.
  • Event Listener — an object implementing a listener interface (e.g. ActionListener) whose callback method (actionPerformed(ActionEvent e)) contains the response code.

Flow for a button click: user clicks the JButton (source) → an ActionEvent (event object) is created → the JVM invokes actionPerformed() on every registered ActionListener → the listener executes the handling logic.

(b) Swing Login Form (7 marks)

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class LoginForm extends JFrame {
    private final JTextField userField = new JTextField(15);
    private final JPasswordField passField = new JPasswordField(15);

    public LoginForm() {
        setTitle("Login");
        setLayout(new GridLayout(3, 2, 5, 5));   // layout manager

        add(new JLabel("Username:"));  add(userField);
        add(new JLabel("Password:"));  add(passField);
        JButton loginBtn = new JButton("Login");
        add(new JLabel());             add(loginBtn);

        loginBtn.addActionListener(new ActionListener() {   // register listener
            public void actionPerformed(ActionEvent e) {
                String u = userField.getText();
                String p = new String(passField.getPassword());
                if (u.equals("admin") && p.equals("1234"))    // hard-coded valid pair
                    JOptionPane.showMessageDialog(LoginForm.this, "Login Successful!");
                else
                    JOptionPane.showMessageDialog(LoginForm.this, "Invalid Credentials!",
                        "Error", JOptionPane.ERROR_MESSAGE);
            }
        });

        setSize(300, 150);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(LoginForm::new);
    }
}

Here the JButton is the event source, the ActionListener is the listener registered with addActionListener, and ActionEvent e is the event object; the GridLayout arranges the labels, fields and button in a neat 3×2 grid.

swingguievent-handling
B

Section B: Short Answer Questions

Attempt all / any as specified.

8 questions
5short8 marks

Differentiate between checked and unchecked exceptions in Java. Explain the use of the try, catch, finally, throw and throws constructs, and write a short program that defines and throws a user-defined (custom) exception.

Checked vs Unchecked Exceptions

Checked ExceptionUnchecked Exception
Subclass of Exception (not RuntimeException)Subclass of RuntimeException (and Error)
Checked at compile timeChecked at run time
Must be handled with try-catch or declared with throwsNo compulsory handling
e.g. IOException, SQLException, ClassNotFoundExceptione.g. NullPointerException, ArrayIndexOutOfBoundsException, ArithmeticException

Exception-handling constructs

  • try — encloses the code that may throw an exception.
  • catch — handles a specific exception type thrown from the try block.
  • finally — always executes (whether or not an exception occurs), used for cleanup such as closing files/connections.
  • throw — explicitly throws an exception object: throw new XxxException(...).
  • throws — declares in a method signature the checked exceptions the method may propagate to its caller.

Custom Exception Program

class InvalidAgeException extends Exception {     // user-defined checked exception
    public InvalidAgeException(String msg) { super(msg); }
}

public class CustomExceptionDemo {
    static void validate(int age) throws InvalidAgeException {
        if (age < 18)
            throw new InvalidAgeException("Age " + age + " is below 18 — not eligible");
        System.out.println("Eligible to vote");
    }

    public static void main(String[] args) {
        try {
            validate(15);
        } catch (InvalidAgeException e) {
            System.out.println("Caught: " + e.getMessage());
        } finally {
            System.out.println("Validation complete");
        }
    }
}

Output: Caught: Age 15 is below 18 — not eligible then Validation complete.

exception-handling
6short8 marks

Describe the Java Collections Framework hierarchy. Compare ArrayList vs LinkedList and HashMap vs TreeMap in terms of internal structure and performance. Write a short code snippet that uses an Iterator to traverse a generic List<String>.

Java Collections Framework Hierarchy

The framework is rooted at the IterableCollection interface, which branches into:

            Iterable
               │
          Collection ───────────────┐
        ┌──────┼───────┐            (Map is separate)
      List    Set     Queue            Map
     (Array   (Hash   (Linked     (HashMap, TreeMap,
      List,    Set,    List,        LinkedHashMap,
      Linked   TreeSet) PriorityQ)  Hashtable)
      List,    Linked
      Vector)  HashSet)
  • List — ordered, allows duplicates, index-based.
  • Set — no duplicates.
  • Queue — FIFO/priority ordering.
  • Map — key→value pairs (does not extend Collection).

ArrayList vs LinkedList

ArrayListLinkedList
Internal structureDynamic arrayDoubly-linked list
Random access get(i)O(1)O(1)O(n)O(n)
Insert/delete at middleO(n)O(n) (shifting)O(1)O(1) once positioned
Best forFrequent access/readFrequent insertion/deletion

HashMap vs TreeMap

HashMapTreeMap
Internal structureHash table (buckets)Red-black (self-balancing) tree
OrderingNo orderSorted by key (natural/comparator)
get/put complexityO(1)O(1) averageO(logn)O(\log n)
Null keysOne null key allowedNo null key

Iterator over a generic List

List<String> names = new ArrayList<>(List.of("Asha", "Bibek", "Chandra"));
Iterator<String> it = names.iterator();
while (it.hasNext()) {
    String name = it.next();
    System.out.println(name);
}
collections-frameworkgenerics
7short8 marks

Explain the difference between TCP and UDP communication in Java. Write a simple TCP client–server program (server and client code) in which the server echoes back any message sent by the client, using the ServerSocket and Socket classes.

TCP vs UDP in Java

TCP (Socket, ServerSocket)UDP (DatagramSocket, DatagramPacket)
Connection-orientedConnectionless
Reliable — guarantees delivery and order, with acknowledgements/retransmissionUnreliable — no delivery or order guarantee
Stream-based (continuous byte stream)Packet (datagram) based
Higher overhead, slowerLightweight, faster
Use: HTTP, file transfer, login/echoUse: video/voice streaming, DNS, online games

TCP Echo Server and Client

Server (EchoServer.java):

import java.io.*;
import java.net.*;

public class EchoServer {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(5000);
        System.out.println("Server listening on port 5000...");
        Socket client = server.accept();                 // wait for client

        BufferedReader in = new BufferedReader(
                new InputStreamReader(client.getInputStream()));
        PrintWriter out = new PrintWriter(client.getOutputStream(), true);

        String msg;
        while ((msg = in.readLine()) != null) {
            System.out.println("Received: " + msg);
            out.println("Echo: " + msg);                 // echo back
        }
        client.close();
        server.close();
    }
}

Client (EchoClient.java):

import java.io.*;
import java.net.*;

public class EchoClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 5000);
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
        BufferedReader console = new BufferedReader(
                new InputStreamReader(System.in));

        String line;
        while ((line = console.readLine()) != null) {
            out.println(line);                           // send to server
            System.out.println("Server says: " + in.readLine());
        }
        socket.close();
    }
}

The server creates a ServerSocket and blocks on accept(); the client creates a Socket to connect; messages flow over the input/output streams and the server echoes each line back.

networkingsockets
8short8 marks

Explain the life cycle of a servlet, describing the purpose of the init(), service() and destroy() methods. How does a servlet differ from a JSP page, and at what point is a JSP converted into a servlet?

Servlet Life Cycle

A servlet is managed by the servlet container (web server) through three life-cycle methods:

  1. init(ServletConfig config) — Called once, when the servlet is first loaded/instantiated. Used for one-time setup such as opening database connections or reading configuration.
  2. service(ServletRequest req, ServletResponse res) — Called for every client request. The container creates a new thread per request and dispatches to doGet(), doPost(), etc. This is where the request is processed and the response generated.
  3. destroy() — Called once, before the servlet is unloaded/the container shuts down. Used to release resources (close connections, save state).
Load → init() [once] → service() [per request, many times] → destroy() [once] → unload

Servlet vs JSP

ServletJSP
Pure Java code; HTML is embedded inside out.println() statementsHTML page with embedded Java (scriptlets/tags)
Better for request processing / business logic (controller)Better for presentation / view
Harder to write/maintain HTMLEasier for page design by non-programmers

When a JSP becomes a servlet: at the first request (or at deployment if pre-compiled), the container's JSP engine translates the .jsp file into an equivalent Java servlet source file, then compiles it into a .class. This compiled servlet then follows the normal servlet life cycle (initservicedestroy). Thus a JSP is ultimately a servlet in disguise.

servletsjspweb
9short6 marks

Differentiate between the String, StringBuffer and StringBuilder classes in Java with respect to mutability and thread safety. Explain why String is said to be immutable and what is meant by the string constant pool.

String vs StringBuffer vs StringBuilder

StringStringBufferStringBuilder
MutabilityImmutableMutableMutable
Thread safetyThread-safe (immutable)Synchronized (thread-safe)Not synchronized (not thread-safe)
PerformanceSlow for many edits (creates new objects)Slower than StringBuilder (locking overhead)Fastest for single-thread editing
Use caseFixed/constant textConcatenation in multithreaded codeConcatenation in single-threaded code (Java 5+)

Why String is immutable

Once a String object is created, its character contents cannot be changed; any "modifying" method (e.g. concat, replace) returns a new String object. Reasons for immutability:

  • Security — strings are used for file paths, URLs, DB credentials; immutability prevents tampering.
  • String pool sharing — multiple references can safely share the same literal.
  • Thread safety — immutable objects need no synchronization.
  • Hashcode caching — safe to cache the hashcode, making String efficient as a HashMap key.

String Constant Pool

The string constant pool is a special region of the heap where the JVM stores unique string literals. When a literal like "hello" is created, the JVM checks the pool; if it already exists, the same reference is reused instead of creating a new object — saving memory.

String a = "hello";
String b = "hello";       // refers to the SAME pooled object
System.out.println(a == b);            // true
String c = new String("hello");        // new object on heap (not pooled)
System.out.println(a == c);            // false
java-basicsstrings
10short6 marks

Compare the two ways of creating a thread in Java: extending the Thread class versus implementing the Runnable interface. State which approach is generally preferred and justify your answer with an example signature.

Creating a Thread: Thread class vs Runnable interface

1. Extending the Thread class

class MyThread extends Thread {
    public void run() { System.out.println("Running via Thread"); }
}
// usage: new MyThread().start();

2. Implementing the Runnable interface

class MyTask implements Runnable {
    public void run() { System.out.println("Running via Runnable"); }
}
// usage: new Thread(new MyTask()).start();
Extending ThreadImplementing Runnable
Subclass IS a threadTask is separate from the thread
Uses up the single inheritance slot (cannot extend another class)Class is still free to extend another class
Tight coupling of task and threadLoose coupling; task can be reused / shared, suits thread pools

Preferred approach: implementing Runnable.

Justification: Java allows only single inheritance, so extending Thread blocks the class from extending any other class, whereas a class can implement Runnable and still extend another class. Runnable also cleanly separates the task (what to run) from the thread (how to run it), and is the form required by the ExecutorService thread-pool API and lambdas:

Runnable r = () -> System.out.println("Lambda task");
new Thread(r).start();
multithreadingconcurrency
11short6 marks

Explain the role of the ResultSet interface in JDBC. Differentiate between a forward-only and a scrollable result set, and write code to update a column value through an updatable ResultSet.

Role of the ResultSet Interface

ResultSet represents the table of data returned by executing a SQL query (typically a SELECT). It acts as a cursor pointing to a row of the result; methods like next() advance the cursor and getXxx("column") retrieve column values of the current row. It is obtained from Statement.executeQuery() or PreparedStatement.executeQuery().

Forward-only vs Scrollable ResultSet

Forward-only (TYPE_FORWARD_ONLY)Scrollable (TYPE_SCROLL_INSENSITIVE / TYPE_SCROLL_SENSITIVE)
Cursor moves only forward with next()Cursor can move freely: next(), previous(), first(), last(), absolute(n)
Default, lowest overheadHigher overhead; can re-read rows
Cannot revisit a rowRandom navigation supported

TYPE_SCROLL_INSENSITIVE does not reflect later DB changes; TYPE_SCROLL_SENSITIVE does.

Updating a column via an Updatable ResultSet

To update through the result set, request CONCUR_UPDATABLE concurrency:

Statement st = con.createStatement(
        ResultSet.TYPE_SCROLL_SENSITIVE,
        ResultSet.CONCUR_UPDATABLE);
ResultSet rs = st.executeQuery("SELECT empId, salary FROM Employee");

while (rs.next()) {
    if (rs.getInt("empId") == 101) {
        rs.updateDouble("salary", 75000.0);   // change column value
        rs.updateRow();                        // commit change to DB
    }
}
jdbcresultset
12short4 marks

What is the difference between an abstract class and an interface in Java? With the introduction of default and static methods, explain how interfaces have evolved since Java 8.

Abstract Class vs Interface

Abstract ClassInterface
Declared with abstract; can have both abstract and concrete methodsDeclared with interface; traditionally only abstract methods
Can have instance fields and constructorsFields are implicitly public static final (constants); no constructor
A class can extend only one abstract classA class can implement many interfaces (multiple inheritance of type)
Can have any access modifier on membersMethods implicitly public
Represents an is-a relationship with shared state/behaviourRepresents a capability / contract

Use an abstract class when classes share common state/implementation; use an interface to define a contract that unrelated classes can fulfil.

Evolution of Interfaces since Java 8

Before Java 8 an interface could contain only abstract methods (and constants). Since Java 8 interfaces may contain:

  • default methods — methods with a body, so new methods can be added to an interface without breaking existing implementing classes; subclasses inherit the default unless they override it.
  • static methods — utility methods called on the interface itself.
  • (Java 9 further added private interface methods to share code between defaults.)
interface Vehicle {
    void start();                                  // abstract
    default void honk() { System.out.println("Beep!"); }   // default method
    static int wheels() { return 4; }              // static method
}

This blurred the line between interfaces and abstract classes, though interfaces still cannot hold mutable instance state.

oopinterfaces

Frequently asked questions

Where can I find the BE Computer Engineering (Pokhara University) Advanced Programming with Java (PU, CMP 228) question paper 2079?
The full BE Computer Engineering (Pokhara University) Advanced Programming with Java (PU, CMP 228) 2079 (regular) question paper is available free on Kekkei. You can read every question online and attempt the paper under timed exam conditions.
Does the Advanced Programming with Java (PU, CMP 228) 2079 paper come with solutions?
Yes. Every question on this Advanced Programming with Java (PU, CMP 228) past paper includes a step-by-step solution, plus instant AI feedback when you attempt it on Kekkei.
How many marks is the BE Computer Engineering (Pokhara University) Advanced Programming with Java (PU, CMP 228) 2079 paper?
The BE Computer Engineering (Pokhara University) Advanced Programming with Java (PU, CMP 228) 2079 paper carries 100 full marks and is meant to be completed in 180 minutes, across 12 questions.
Is practising this Advanced Programming with Java (PU, CMP 228) past paper free?
Yes — reading and attempting this Advanced Programming with Java (PU, CMP 228) past paper on Kekkei is completely free.