Methods in Karel

Java supports methods defined on class types.

public class Rectangle {
    private int width, height;

    public Rectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }

    // This area method is defined for the Rectangle class.
    public int area() {
        return this.width * this.height;
    }

    // Methods can be defined for the class. Here's another example.
    public int perimeter() {
        return 2 * this.width + 2 * this.height;
    }

    public static void main(String[] args) {
        Rectangle r = new Rectangle(10, 5);

        // Here we call the 2 methods defined for our class.
        System.out.println("area: " + r.area());
        System.out.println("perimeter: " + r.perimeter());

        // In Java, all objects are pass-by-reference, so there's no need
        // for explicit pointer manipulation like in some other languages.
        // The following calls will work the same as above:
        System.out.println("area: " + r.area());
        System.out.println("perimeter: " + r.perimeter());
    }
}

To run the program:

$ javac Rectangle.java
$ java Rectangle
area: 50
perimeter: 30
area: 50
perimeter: 30

In Java, methods are always associated with a class, and there’s no distinction between value and pointer receivers as in some other languages. All non-primitive types in Java are reference types, so method calls always operate on the same instance of the object.

Next, we’ll look at Java’s mechanism for defining abstract types and behaviors: interfaces.