OOP 1. Introduction to Classes and Objects

Purpose of this lesson: Terminology New Java language features

Object-Oriented Programming (OOP) concepts

Class = data + methods. Everything (data and methods) in Java is contained in classes. So far you've been using classes to hold methods (main and perhaps a few other static methods). These methods use local variables, which are completely private to the method, and which disappear when the method returns.

Historical development. Classes can also be used to store data. Historically, programming languages had something similar to classes for grouping data, usually called structs or records. These were used for storing only data, not methods. Eventually, advantages of combining both data and the methods to work on that data were recognized.

Classes model problem domain. One advantage of encapsulating data and methods in a class is to make programming objects that reflect "objects" in the problem domain. If your problem deals with orders and products, then you'll very likely have classes called Order and Product.

Classes reduce complexity. Another advantage of classes is reducing complexity. Complexity limits the size and reliability of programs. Complexity is reduced by increasing cohesion (putting things together that belong together) and reducing coupling (interconnections). The proper use of classes can make large improvements in both of these.

Class, object, OOP. The term class is almost universally used for a programming language structure which combines data and methods, object is used for each instance of a class that is created, and the practices that developed around these ideas is called Object-Oriented Programming (OOP).

Value objects - Data-first approach. We'll start with classes that represent data, and then add constructors and methods. Ultimately you will be more concerned with methods than data, and you'll see how (and why) methods are used to completely hide the data implementation.

A class stores the attributes (data) of something

To group related values. Classes are used to group a number of related, named, data values associated with an entity. By entity we mean something that is typically a noun when you are talking about a problem you are solving. For example, in a university computing system, you might have OOP classes to represent a student, an instructor, a classroom, a department, a course, a section of a course, ....

Student example. The information you would store about students, would be their name, id, phone number, etc. We'll keep this example simple and just save name and id information.

Declare each field. A class contains declarations of the fields (instance variables, attributes) that hold the data associated with a student. These declarations are like declaring a local variable in a method, except that you also specify the visibility (which program elements outside the class can see the variable). We'll start by using the visibility modifier public, which lets everyone see them. For example, the following Student1 class can be used to represent a student. As you go through these notes, we'll make improvements to this class, specifically explaining why public usually isn't the best choice.

public class Student1 {
    public String firstName;
    public String lastName;
    public int    id;

A class is a type

Class names. Classes names are nouns and begin with a capital letter. The fields (variables) in it are attributes one would normally associate with that noun.

Predefined Java classes that you have already used are String, which contains the characters in the string and the length, JOptionPane, which contains information necessary to produce a dialog box on the screen, etc. These predefined Java classes are used for the programming infrastructure that you need. Many common infrastructure classes are available in the 3000+ predefined Java library classes. But, of course, these don't address the specifics of your problems, which is why you will define classes associated with your specific data.

Business objects. Most classes you define will concern your problem domain, where they represent business objects (Student, TimeOfDay, Order, ...).

Declaring business object variables is like declaring any other variable. Use the class name as a type, just as you've used String, int, etc. For example, the following declares two Student1 variables.

Student1 bestInClass;  // This variable references a Student1 object.
Student1 t;            // And here is another

These don't have values yet; the next section will show how to do that.

Does your problem require classes or simple variables?

If the data you are working with, for example a temperature, can be expressed as a simple value and the operations on it are all defined by operators, then just use a simple variable for it with a standard Java type (int, double, String, ...). Often the data associated with an entity in your problem is not a simple value, but has multiple attributes and this is where defining a class will be useful.

Examples showing classes as groups of attributes.

Object-Oriented Design involves deciding which classes you need to represent the things (entities) in your problem. For simple programs, you often use only simple variables, but as programs get larger, you will define classes to represent the things you are working with.

Similarity to database table

If your are familiar with databases, a class is very similar to a table definition. If you're not familiar with databases, don't worry because these lessons don't assume you are.

Review Questions