Lesson 5 | Constructors |
Objective | Explain the syntax of class constructors. |
Java Class Constructor Syntax
Constructors are used to create instances of classes. Their syntax follows:
modifiers ConstructorName(arguments) throws Exception {
// Constructor body
}
The modifiers, arguments, and
throws
clause are optional.
The
modifiers
may be
public
,
protected
,
private
, or
- none (package access).
The arguments and throws
clause are defined in the same way as with methods (see Module 5).
Constructors are not inherited from their superclasses; they must be defined for each class.
There is one exception: if no constructors are defined for a class, then the compiler defines a default, parameterless constructor.
If the class is declared as public,
then the default constructor is public
. Otherwise, it has no modifiers.
this() and super() in Java
Sometimes you may want to define one constructor in terms of another. Consider the following example:
class MyClass {
int i;
String s;
public MyClass(int i, String s) {
this.i = i;
this.s = s;
}
public MyClass() {
this(10,"none");
}
}
The first MyClass()
constructor sets the i
and s
field variables to the values of the
i
and s
parameters.
The this
identifier refers to the current instance of MyClass
being created. The second MyClass()
constructor creates a MyClass
object using the first constructor.
The this(10,"none")
causes the first constructor to be invoked with the arguments of 10 and "none."
If this()
is used, it must be the first statement in a constructor.
The use of super()
is similar to this()
except that it invokes a constructor of the class's superclass.
If super()
is used, it must also be the first statement in a constructor. If neither this()
nor super()
is supplied, an implicit super()
(with no arguments) is
supplied by the compiler.
This causes the superclass portion of an object to be created before that of the class itself.
Java Constructors
Constructors are used to initialize an object. Whenever an object is created, a constructor executes. A default constructor is the one that has no arguments and is provided automatically for all classes. This constructor will initialize all instance variables to default values.
However, if the developer provides a constructor, the compiler's default constructor is no longer added and the developer will need to explicitly add a default constructor. It is a good practice to always have a default, no-argument constructor.
Which of the following statements are true?
- Non-static nested classes must have either default or public accessibility.
- Non-static nested classes cannot contain static members.
- Methods in all nested classes can be declared static.
- All nested classes can be declared static.
- A static inner class can contain a non-static inner class.
Answer: e
Explanation:
a. Non-static nested classes, unlike normal package classes, can have any type of accessibility.
b. They can if the static variable is also made final.
c. Not in non-static inner classes.
d. Local (i.e. inside a method) nested classes cannot be declared static.
Note: As per http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html : Nested classes are divided into two categories: 1) static and 2) non-static.
Nested classes that are declared static are simply called static nested classes. Non-static nested classes are called inner classes.
Further, a static nested class is behaviorally a top-level class that has been nested in another top-level class for packaging convenience.
As opposed to top-level classes (whether nested or not), inner classes can declare a static member only if it is a constant (i.e. final).
To create a class variable for an inner class, the programmer must place the desired variable in an enclosing class. It is helpful at this point to abuse the terminology somewhat, and say, loosely, that the static keyword always marks a "top-level" construct (variable, method or class), which is never subject to an enclosing instance. This shows why an inner class cannot declare a static member, because the entire body of the inner class is in the scope of one or more enclosing instances.
Only top-level nested classes can be declared static. Declaring a class static only means that instances of the class are created
without having an outer instance.