You're building a game with many enemies. Each enemy has health, position, and attack methods. Instead of managing separate variables, a class bundles the data and behavior into one reusable blueprint.

Your first class

Define a class with fields and methods.

FirstClass.java
public class FirstClass {
    public static void main(String[] args) {
        System.out.println("=== Your First Class ===\n");

        // Create an object from the Dog class
        Dog myDog = new Dog();

        // Set field values
        String dogName = ;
        int dogAge = ;
        myDog.name = dogName;
        myDog.breed = "Golden Retriever";
        myDog.age = dogAge;

        // Read field values
        System.out.println("Name: " + myDog.name);
        System.out.println("Breed: " + myDog.breed);
        System.out.println("Age: " + myDog.age);

        // Call methods
        System.out.println();
        myDog.bark();
        myDog.bark();
    }
}

// Class definition
class Dog {
    // Fields (instance variables)
    String name;
    String breed;
    int age;

    // Method
    void bark() {
        System.out.println(name + " says: Woof!");
    }
}
public class FirstClass {
    public static void main(String[] args) {
        System.out.println("=== Your First Class ===\n");

        // Create an object from the Dog class
        Dog myDog = new Dog();

        // Set field values
        String dogName = ;
        int dogAge = ;
        myDog.name = dogName;
        myDog.breed = "Golden Retriever";
        myDog.age = dogAge;

        // Read field values
        System.out.println("Name: " + myDog.name);
        System.out.println("Breed: " + myDog.breed);
        System.out.println("Age: " + myDog.age);

        // Call methods
        System.out.println();
        myDog.bark();
        myDog.bark();
    }
}

// Class definition
class Dog {
    // Fields (instance variables)
    String name;
    String breed;
    int age;

    // Method
    void bark() {
        System.out.println(name + " says: Woof!");
    }
}
public class FirstClass {
    public static void main(String[] args) {
        System.out.println("=== Your First Class ===\n");

        // Create an object from the Dog class
        Dog myDog = new Dog();

        // Set field values
        String dogName = ;
        int dogAge = ;
        myDog.name = dogName;
        myDog.breed = "Golden Retriever";
        myDog.age = dogAge;

        // Read field values
        System.out.println("Name: " + myDog.name);
        System.out.println("Breed: " + myDog.breed);
        System.out.println("Age: " + myDog.age);

        // Call methods
        System.out.println();
        myDog.bark();
        myDog.bark();
    }
}

// Class definition
class Dog {
    // Fields (instance variables)
    String name;
    String breed;
    int age;

    // Method
    void bark() {
        System.out.println(name + " says: Woof!");
    }
}
public class FirstClass {
    public static void main(String[] args) {
        System.out.println("=== Your First Class ===\n");

        // Create an object from the Dog class
        Dog myDog = new Dog();

        // Set field values
        String dogName = ;
        int dogAge = ;
        myDog.name = dogName;
        myDog.breed = "Golden Retriever";
        myDog.age = dogAge;

        // Read field values
        System.out.println("Name: " + myDog.name);
        System.out.println("Breed: " + myDog.breed);
        System.out.println("Age: " + myDog.age);

        // Call methods
        System.out.println();
        myDog.bark();
        myDog.bark();
    }
}

// Class definition
class Dog {
    // Fields (instance variables)
    String name;
    String breed;
    int age;

    // Method
    void bark() {
        System.out.println(name + " says: Woof!");
    }
}
public class FirstClass {
    public static void main(String[] args) {
        System.out.println("=== Your First Class ===\n");

        // Create an object from the Dog class
        Dog myDog = new Dog();

        // Set field values
        String dogName = ;
        int dogAge = ;
        myDog.name = dogName;
        myDog.breed = "Golden Retriever";
        myDog.age = dogAge;

        // Read field values
        System.out.println("Name: " + myDog.name);
        System.out.println("Breed: " + myDog.breed);
        System.out.println("Age: " + myDog.age);

        // Call methods
        System.out.println();
        myDog.bark();
        myDog.bark();
    }
}

// Class definition
class Dog {
    // Fields (instance variables)
    String name;
    String breed;
    int age;

    // Method
    void bark() {
        System.out.println(name + " says: Woof!");
    }
}
public class FirstClass {
    public static void main(String[] args) {
        System.out.println("=== Your First Class ===\n");

        // Create an object from the Dog class
        Dog myDog = new Dog();

        // Set field values
        String dogName = ;
        int dogAge = ;
        myDog.name = dogName;
        myDog.breed = "Golden Retriever";
        myDog.age = dogAge;

        // Read field values
        System.out.println("Name: " + myDog.name);
        System.out.println("Breed: " + myDog.breed);
        System.out.println("Age: " + myDog.age);

        // Call methods
        System.out.println();
        myDog.bark();
        myDog.bark();
    }
}

// Class definition
class Dog {
    // Fields (instance variables)
    String name;
    String breed;
    int age;

    // Method
    void bark() {
        System.out.println(name + " says: Woof!");
    }
}
public class FirstClass {
    public static void main(String[] args) {
        System.out.println("=== Your First Class ===\n");

        // Create an object from the Dog class
        Dog myDog = new Dog();

        // Set field values
        String dogName = ;
        int dogAge = ;
        myDog.name = dogName;
        myDog.breed = "Golden Retriever";
        myDog.age = dogAge;

        // Read field values
        System.out.println("Name: " + myDog.name);
        System.out.println("Breed: " + myDog.breed);
        System.out.println("Age: " + myDog.age);

        // Call methods
        System.out.println();
        myDog.bark();
        myDog.bark();
    }
}

// Class definition
class Dog {
    // Fields (instance variables)
    String name;
    String breed;
    int age;

    // Method
    void bark() {
        System.out.println(name + " says: Woof!");
    }
}
public class FirstClass {
    public static void main(String[] args) {
        System.out.println("=== Your First Class ===\n");

        // Create an object from the Dog class
        Dog myDog = new Dog();

        // Set field values
        String dogName = ;
        int dogAge = ;
        myDog.name = dogName;
        myDog.breed = "Golden Retriever";
        myDog.age = dogAge;

        // Read field values
        System.out.println("Name: " + myDog.name);
        System.out.println("Breed: " + myDog.breed);
        System.out.println("Age: " + myDog.age);

        // Call methods
        System.out.println();
        myDog.bark();
        myDog.bark();
    }
}

// Class definition
class Dog {
    // Fields (instance variables)
    String name;
    String breed;
    int age;

    // Method
    void bark() {
        System.out.println(name + " says: Woof!");
    }
}
public class FirstClass {
    public static void main(String[] args) {
        System.out.println("=== Your First Class ===\n");

        // Create an object from the Dog class
        Dog myDog = new Dog();

        // Set field values
        String dogName = ;
        int dogAge = ;
        myDog.name = dogName;
        myDog.breed = "Golden Retriever";
        myDog.age = dogAge;

        // Read field values
        System.out.println("Name: " + myDog.name);
        System.out.println("Breed: " + myDog.breed);
        System.out.println("Age: " + myDog.age);

        // Call methods
        System.out.println();
        myDog.bark();
        myDog.bark();
    }
}

// Class definition
class Dog {
    // Fields (instance variables)
    String name;
    String breed;
    int age;

    // Method
    void bark() {
        System.out.println(name + " says: Woof!");
    }
}

A class has fields (data) and methods (behavior). Define once, create many objects.

class Blueprint for objects. Defines fields (data) and methods (behavior).

Create objects from a class

Instantiate objects using new.

CreateObjects.java
public class CreateObjects {
    public static void main(String[] args) {
        System.out.println("=== Creating Multiple Objects ===\n");

        // Create first student
        Student alice = new Student();
        alice.name = "Alice";
        alice.grade = 85;

        // Create second student
        Student bob = new Student();
        bob.name = "Bob";
        bob.grade = 92;

        // Create third student
        Student charlie = new Student();
        charlie.name = "Charlie";
        charlie.grade = 78;

        // Display all students
        System.out.println("Student Records:");
        System.out.println("  " + alice.name + ": " + alice.grade);
        System.out.println("  " + bob.name + ": " + bob.grade);
        System.out.println("  " + charlie.name + ": " + charlie.grade);

        // Each is independent
        System.out.println("\nChanging Alice's grade...");
        alice.grade = 90;

        System.out.println("Alice: " + alice.grade);
        System.out.println("Bob: " + bob.grade);  // Unchanged!
        System.out.println("Charlie: " + charlie.grade);  // Unchanged!
    }
}

class Student {
    String name;
    int grade;
}

new ClassName() creates an object. Each object is independent.

object Instance of a class. Has its own copy of the fields.

Access and modify fields

Read and write object data.

AccessFields.java
public class AccessFields {
    public static void main(String[] args) {
        System.out.println("=== Accessing Object Fields ===\n");

        Book book = new Book();

        // Write to fields
        book.title = "1984";
        book.author = "George Orwell";
        book.pages = 328;
        book.isAvailable = true;

        // Read from fields
        System.out.println("Title: " + book.title);
        System.out.println("Author: " + book.author);
        System.out.println("Pages: " + book.pages);
        System.out.println("Available: " + book.isAvailable);

        // Modify fields
        System.out.println("\nBorrowing book...");
        book.isAvailable = false;
        System.out.println("Available: " + book.isAvailable);

        // Default values before fields are assigned
        System.out.println("\n=== Default Values ===");
        Book emptyBook = new Book();
        System.out.println("Default title: " + emptyBook.title);
        System.out.println("Default pages: " + emptyBook.pages);
        System.out.println("Default available: " + emptyBook.isAvailable);
    }
}

class Book {
    // Different field types
    String title;       // Reference type (default: null)
    String author;      // Reference type (default: null)
    int pages;          // Primitive (default: 0)
    boolean isAvailable; // Primitive (default: false)
}

Use dot notation: object.field to access, object.field = value to set.

Multiple instances

Each object has its own field values.

MultipleInstances.java
public class MultipleInstances {
    public static void main(String[] args) {
        System.out.println("=== Multiple Instances Demo ===\n");

        // Create bank accounts
        BankAccount acc1 = new BankAccount();
        acc1.owner = "Alice";
        acc1.balance = 1000.0;

        BankAccount acc2 = new BankAccount();
        acc2.owner = "Bob";
        acc2.balance = 500.0;

        BankAccount acc3 = new BankAccount();
        acc3.owner = "Charlie";
        acc3.balance = 2500.0;

        // Initial state
        System.out.println("Initial balances:");
        printAccount(acc1);
        printAccount(acc2);
        printAccount(acc3);

        // Operations on different accounts
        System.out.println("\nTransactions:");
        acc1.balance -= 200;  // Alice withdraws
        System.out.println("Alice withdrew $200");

        acc2.balance += 100;  // Bob deposits
        System.out.println("Bob deposited $100");

        acc3.balance -= 500;  // Charlie withdraws
        System.out.println("Charlie withdrew $500");

        // Final state
        System.out.println("\nFinal balances:");
        printAccount(acc1);
        printAccount(acc2);
        printAccount(acc3);

        // Each object maintains its own state!
        System.out.println("\n=== Key Point ===");
        System.out.println("Three objects, three independent balances!");
        System.out.println("Same class (blueprint), different data (state).");
    }

    static void printAccount(BankAccount acc) {
        System.out.println("  " + acc.owner + ": $" + acc.balance);
    }
}

class BankAccount {
    String owner;
    double balance;
}

Changes to one object don't affect others. Each has its own memory.

Methods that use object data

Methods can read and modify the object's fields.

ClassWithMethods.java
public class ClassWithMethods {
    public static void main(String[] args) {
        System.out.println("=== Class with Methods ===\n");

        Counter counter = new Counter();

        counter.display();  // Shows 0 (default)

        counter.increment();
        counter.increment();
        counter.increment();
        counter.display();  // Shows 3

        counter.decrement();
        counter.display();  // Shows 2

        counter.reset();
        counter.display();  // Shows 0

        System.out.println("\n=== Two Independent Counters ===");
        Counter counterA = new Counter();
        Counter counterB = new Counter();

        counterA.increment();
        counterA.increment();
        counterA.increment();
        counterA.increment();
        counterA.increment();

        counterB.increment();
        counterB.increment();

        System.out.println("Counter A: " + counterA.getValue());
        System.out.println("Counter B: " + counterB.getValue());
    }
}

class Counter {
    int count = 0;  // Field with initial value

    void increment() {
        count++;
    }

    void decrement() {
        if (count > 0) {
            count--;
        }
    }

    void reset() {
        count = 0;
    }

    int getValue() {
        return count;
    }

    void display() {
        System.out.println("Count: " + count);
    }
}

Methods operate on this object's data. this is implicit.

Exercise: PointRectangle.java

Create Point and Rectangle classes that work together