Exploring object lifetime
Video: Exploring object lifetimeOne place that is worth talking about language differences is in the idea of object lifetime. How are objects created? What happens when they're created? And what happens when with them? We know the core idea is that once we define a class, we make an instance of it. We make an object so we can use the object, and this is instantiation, creating an instance. To create an object, most object- oriented languages use the word new. I'm going to show a few examples here. Don't worry about syntax, just take a look at the different languages.
Viewers: in countries Watching now:
Most modern programming languages, such as Java, C#, Ruby, and Python, are object-oriented languages, which help group individual bits of code into a complex and coherent application. However, object-orientation itself is not a language; it's simply a set of ideas and concepts.
Let Simon Allardice introduce you to the terms—words like abstraction, inheritance, polymorphism, subclass—and guide you through defining your requirements and identifying use cases for your program. The course also covers creating conceptual models of your program with design patterns, class and sequence diagrams, and unified modeling language (UML) tools, and then shows how to convert the diagrams into code.
- Why use object-oriented design (OOD)?
- Pinpointing use cases, actors, and scenarios
- Identifying class responsibilities and relationships
- Creating class diagrams
- Using abstract classes
- Working with inheritance
- Creating advanced UML diagrams
- Understanding object-oriented design principles
Exploring object lifetime
One place that is worth talking about language differences is in the idea of object lifetime. How are objects created? What happens when they're created? And what happens when with them? We know the core idea is that once we define a class, we make an instance of it. We make an object so we can use the object, and this is instantiation, creating an instance. To create an object, most object- oriented languages use the word new. I'm going to show a few examples here. Don't worry about syntax, just take a look at the different languages.
So I have a Customer class, I want to make a Customer object. In Java, I'd say Customer fred = new Customer. It would be identical in C#, also using the word new. In VB.NET, we'd have something fairly similar, again, using the word new, as does Ruby. C++ looks very similar to Java, and C# except it's using the asterisk for a pointer symbol. And Objective-C likes to be different, so it's using alloc and init instead of new. Objective-C actually does have a new keyword, it's just more common to see this format.
But, as you can see, most of the time it's the new keyword that is responsible for creating an object. In the background, the computer is allocating a little bit of memory for your new object, and then initializing all the variables in it and returning a reference to that object. Then you start to use it, and most of that happens without you needing to think about it. But your question is do you want something different to happen is created? Do you want to be part of that instantiation process? In the usual way, you can take part in instantiation is with something called a constructor.
Now if you're coming from a procedural language background like traditional COBOL, straight C, or Fortran, you don't have this idea. A constructor is an object orientation concept. Constructor is a special method that exists to construct the object. It will be called when the object is created. A little while ago I showed the idea of a basic Spaceship class, and now I want to make a Spaceship object. I'm going to use typical C# or Java format. So I've created using the word new. And the question is what is the internal state of that object right now? Well, I know that the class defined a String and an Integer, those were my instance variables.
So, the object has been created, and it has two variables, name, and shieldStrength. The name is null and shieldStrength, which was an integer, is 0. The object exists, but it has a meaningless state. Now, I could start setting its values. But what if I wanted to create it in a meaningful state to begin with? Well, we can provide constructor methods to do this. Basically, a constructor can make sure that any variables belonging to that object are immediately set to the right values as soon as the object is created.
In Java or C#, or C++, what you do in the class is you create a constructor by simply creating a method in the class with the same name as the class. Now, there's no return type to it, because you'd never call it yourself. It's called when you use the word new. So, in this case, I would create a method with the same name as the class, and in it, I'm going to set the initial state that I want these instance variables to be. I then use the same code to instantiate that object, but it will now be instantiated with some actual values in those instance variables.
So, this is a basic constructor that takes no arguments, and in a UML class diagram, if you see a method with the same name as the a constructor. Now, in VB.NET and Python, constructors are created by making a new method. The actual method has the name new. In Ruby, it's by creating a method called initialize, and in Objective-C, it's by creating an init method in the class. Now, in most languages, we can create multiple constructors, what's called overloading or constructor methods.
So, if I went back to that class definition, added a second method, it's also called Spaceship, same name as the class, but this one takes a parameter just one string which I've called n. And now when I instantiate that object, I have two ways of doing it, I can use the word new with no parameters, or I can use the word new along with a string parameter. And in this case, it's going to call the overloaded constructor which is immediately going to set the values of those instance variables to different values.
So, overloaded constructors allows me to have flexibility and pass-in information when actually creating the object, and that in UML would typically be represented something like this. You would see two methods with the same name as the class, one with no parameters, and one with parameters. And this is a very simple example. When you have more complex object, it's often very important to make sure they aren't instantiated in an invalid state, particularly when one object needs to contain other objects and often has to create them as part of that instantiation process.
All languages can get deeper on the idea of constructors or initializers, but I'll leave that for you to explore. Now, on the other side of the lifetime equation, we also have the idea of a destructor. This is a method that is called when an object is no longer needed and is being disposed off. In some languages, this role is played by something called a finalizer rather than a destructor, but the concept is much the same, a place to put some code that will automatically be called when the object is destroyed. Now, destructors are not needed as often as constructors, but they do have their uses.
They're typically used if you have an object that is holding a resource, say it has a document open on the file system or it's connected to a database, and you just want to make sure that, that object has released any connection that it has before it's destroyed.
There are currently no FAQs about Foundations of Programming: Object-Oriented Design.