Last time, we built a very simple Java class called HelloWorld that did one thing: print out a message Hello, World!:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

Fields

We can add new layers of complexity to this very simple program that will introduce some new concepts in Java. The first is a field: some property or attribute about the class. To implement a field, our code might look something like

public class HelloWorld {
    private String message; // This is our field!

    public static void main(String[] args) {
        
    }
}

We’ve taken out the print statement line in the main() function for convenience. Note that the field is called message, and this time, it is only private: this means that any outside program or person won’t be able to read or change the value of this field in this class. Typically, most fields for classes are private. The field message has a variable type of String, which we introduce in a later lesson.

We want our class to be able to always have a message Hello, World!. This tells us that we should set the value of the message to Hello, World! in the constructor of the class. The constructor is a special method of a class that is only executed once: when the instance of the class is first created.

public class HelloWorld {
    private String message; // This is our field!

    /* This is our constructor. */
    public HelloWorld() {
        this.message = "Hello, World!";
    }

    public static void main(String[] args) {
        
    }
}

Constructors

Note that the constructor has the same name as the class (this will always be the case). It can also take in input arguments between the parentheses, but here there are no input arguments. The constructor is doing one thing: setting the field message of this instance of a class, which we refer to as this.message, equal to the String Hello, World!. This will be done for every instance of this HelloWorld class.

Methods

Remember that we said previously that the field message cannot be accessed by other programs right now, due to its private permissions. However, in some cases, we might want to be able to read the String in order to print out our message. To do this, we have to define a new method that our class can do. A method is just a function that the class can perform:

public class HelloWorld {
    private String message; // This is our field!

    /* This is our constructor. */
    public HelloWorld() {
        this.message = "Hello, World!";
    }

    /* This is a method. */
    public String getMessage() {
        return this.message;
    }

    public static void main(String[] args) {
        
    }
}

We’ve defined a new method called getMessage(). This method has public permissions, and it will return (output) a String. It will return the message associated with this instance of the class that we’re working with, which again, we refer to as this.message.

Class Instances

All that’s left to do now is print our message Hello, World! in the main function:

public class HelloWorld {
    private String message;

    public HelloWorld() {
        this.message = "Hello, World!";
    }

    public String getMessage() {
        return this.message;
    }

    public static void main(String[] args) {
        HelloWorld abc = new HelloWorld();

        System.out.println(abc.getMessage());
    }
}

What are these two new lines of code in main() doing? The first line is declaring the existence of a new instance of our class called HelloWorld: the same one that we went through all the trouble of defining its fields and methods for above. Declaring new instances of a class always follows the same format:

NameOfClass variableName = new NameofClass(anyInputArgumentsHere);

In constructing this new HelloWorld instance called abc, the constructor method also set the message of abc equal to Hello, World!. Therefore, when the method getMessage() is called on abc, it will return Hello, World!. The last line therefore tells our program to print the message of abc, which should be Hello, World! if our program works correctly.

Let’s run this program again using MacOS Terminal, just like we did last time.

$ javac HelloWorld.java
$ java HelloWorld
Hello, World!

This gives us the expected output, so our program works!

Why did we go through all the trouble of defining all these methods and fields? For a simple program that just prints our Hello, World!, defining these features was probably not needed. However, as our Java programs get more and more complicated, we will inevitably use a bunch of different fields and methods. Today was more of an introduction to what these things are.

Comments

One last thing. In some of our above code samples, you may have seen phrases or sentences prefixed with // or encased by /* */ or /** **/. These things are called comments, and are written solely for being able to read and understand the code. The computer and program ignores comments entirely.