# Lecture for March 27

## In the Real World...

Objects are known for having characteristics. A car has on average 4 wheels, 2-4 doors, a steering wheel.

Objects can perform actions. A car can drive, hold cargo, and honk.

## In the Programming World...

Object-Oriented Programming

- Focuses on objects
- Are not linear
- Adds organization to a program
- Fits with human cognition (making abstractions)

## Class Structure

    public class Classname {
        // Fields
        // Constructors
        // Methods
    }

## Fields

Fields are instance variables, they store values, help define state, and exist in memory for the lifetime of the object.

    public class Car {
        private double price;
        private double gas;
    }

## Constructor

We can build an object through a constructor. It is a special kind of method, this method requires that you not have a return type and that you name it the same as the class itself.

Constructors help set default field values for the different properties of our class.

    public class Car {
        // Begin Constructor
        public Car(double cost) {
            this.price = cost;
            this.gas = 0;
        }
        // End Constructor
        private double price;
        private double gas;
    }

Note: The `this` keyword refers to the object's fields. This helps keep it separate from other variables you can create in the method and the input parameters you receive.

## Accessor Method - "Getter"

We like to classify methods into two types, accessors and mutators.

Getter methods return a copy of an instance field. It does not change the state of the object.

    public double getPrice() {
        return this.price;
    }

## Mutator Method - "Setter"

This type of method modifies an instance field. It does not return anything and changes the state of the object.

    public void setPrice(double cost) {
        this.price = cost;
    }

## Example of Car Class In All Its Glory

    public class Car {
        // Instance Variables
        private int mpg;
        private double price;

        // Constructors
        public Car() {
            this.price = 0;
            this.mpg = 0;
        }
        public Car(double cost, int mpg) {
            this.price = cost;
            this.mpg = mpg;
        }

        // Accessors
        public double getPrice() {
            return this.price''
        }
        public int getMpg() {
            return this.mpg;
        }

        // Mutators
        public void setPrice(double cost) {
            this.price = cost;
        }
        public void setMpg(int mpg) {
            this.mpg = mpg;
        }
    }

## Using Classes

Just like how we used the `Scanner` class, we can also use our new `Car` class.

    public class TestCar {
        public static void main(String[] args) {
            // Declare an object reference
            Car c;

            // Initialize the object
            c = new Car();

            // Update the fields of the object
            c.setPrice(3000);
            c.setMpg(22);

            // Print object information
            System.out.println("Price is " + c.getPrice() )
        }
    }