Methods in Fortress

Java supports methods defined on class types.

public class Rectangle {
    private int width;
    private int height;

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

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

    // Methods can be defined for the class itself.
    // There's no distinction between pointer and value receivers in Java.
    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 non-primitive types are reference types,
        // so there's no need for explicit pointer handling.
        // The following lines would be redundant in Java:
        // Rectangle rp = r;
        // System.out.println("area: " + rp.area());
        // System.out.println("perimeter: " + rp.perimeter());
    }
}

To run the program:

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

In Java, methods are always associated with classes. There’s no distinction between pointer and value 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.

Java uses object-oriented programming principles, where methods are typically defined within classes. The concept of “receiver” is implicit in Java - the object on which a method is called is always the receiver.

Next, we’ll look at Java’s mechanism for defining contracts for classes: interfaces.