Java бағдарламалау/Методтер
Методтер дегеніміз - біздің объектілермен қалай байланысуымыз. Біз әдісті шақырғанда немесе шақырғанда, біз нысанды тапсырманы орындауды сұраймыз. Әдістер объектілердің әрекетін жүзеге асырады деп айта аламыз. Әрбір әдіс үшін біз атау беруіміз керек, оның енгізу параметрлерін анықтауымыз керек және оның қайтару түрін анықтауымыз керек. Біз сондай-ақ оның көрінуін орнатуымыз керек (жеке, қорғалған немесе жалпыға ортақ). Егер әдіс тексерілген ерекше жағдайды шығарса, оны да жариялау керек. Ол әдіс анықтамасы деп аталады. Әдіс анықтамасының синтаксисі:
MyClass {
...
public ReturnType methodName(ParamOneType parameter1, ParamTwoType parameter2) {
...
return returnValue;
}
...
} We can declare that the method does not return anything using the void Java keyword. For example:
Example Code section 3.67: Method without returned data. private void methodName(String parameter1, String parameter2) {
... return;
} When the method returns nothing, the return keyword at the end of the method is optional. When the execution flow reaches the return keyword, the method execution is stopped and the execution flow returns to the caller method. The return keyword can be used anywhere in the method as long as there is a way to execute the instructions below:
Warning Code section 3.68: return keyword location. private void aMethod(int a, int b) {
int c = 0;
if (a > 0) {
c = a;
return;
}
int c = c + b;
return;
int c = c * 2;
} In the code section 3.68, the return keyword at line 5 is well placed because the instructions below can be reached when a is negative or equal to 0. However, the return keyword at line 8 is badly placed because the instructions below can't be reached.
Test your knowledge Parameter passing We can pass any primitive data types or reference data type to a method.
Primitive type parameter The primitive types are passed in by value. It means that as soon as the primitive type is passed in, there is no more link between the value inside the method and the source variable:
Example Code section 3.69: A method modifying a variable. private void modifyValue(int number) {
number += 1;
} Example Code section 3.70: Passing primitive value to method. int i = 0; modifyValue(i); System.out.println(i); Standard input or output Output for Code section 3.70 0 As you can see in code section 3.70, the modifyValue() method has not modified the value of i.
Reference type parameter The object references are passed by value. It means that:
There is no more link between the reference inside the method and the source reference, The source object itself and the object itself inside the method are still the same. You must understand the difference between the reference of an object and the object itself. An object reference is the link between a variable name and an instance of object:
Object object ⇔ new Object() An object reference is a pointer, an address to the object instance.
The object itself is the value of its attributes inside the object instance:
object.firstName ⇒ "James" object.lastName ⇒ "Gosling" object.birthDay ⇒ "May 19" Take a look at the example above:
Example Code section 3.71: A method modifying an object. private void modifyObject(FirstClass anObject) {
anObject.setName("Susan");
} Example Code section 3.72: Passing reference value to method. FirstClass object = new FirstClass(); object.setName("Christin");
modifyObject(object);
System.out.println(object.getName()); Standard input or output Output for Code section 3.72 Susan The name has changed because the method has changed the object itself and not the reference. Now take a look at the other example:
Example Code section 3.73: A method modifying an object reference. private void modifyObject(FirstClass anObject) {
anObject = new FirstClass();
anObject.setName("Susan");
} Example Code section 3.74: Passing reference value to method. FirstClass object = new FirstClass(); object.setName("Christin");
modifyObject(object);
System.out.println(object.getName()); Standard input or output Output for Code section 3.74 Christin The name has not changed because the method has changed the reference and not the object itself. The behavior is the same as if the method was in-lined and the parameters were assigned to new variable names:
Example Code section 3.75: In-lined method. FirstClass object = new FirstClass(); object.setName("Christin");
// Start of the method FirstClass anObject = object; anObject = new FirstClass(); anObject.setName("Susan"); // End of the method
System.out.println(object.getName()); Standard input or output Output for Code section 3.75 Christin Variable argument list Java SE 5.0 added syntactic support for methods with variable argument list, which simplifies the typesafe usage of methods requiring a variable number of arguments. Less formally, these parameters are called varargs[1]. The type of a variable parameter must be followed with ..., and Java will box all the arguments into an array:
Example Code section 3.76: A method using vararg parameters. public void drawPolygon(Point... points) {
//…
} When calling the method, a programmer can simply separate the points by commas, without having to explicitly create an array of Point objects. Within the method, the points can be referenced as points[0], points[1], etc. If no points are passed, the array has a length of zero.
A method can have both normal parameters and a variable parameter but the variable parameter must always be the last parameter. For instance, if the programmer is required to use a minimum number of parameters, those parameters can be specified before the variable argument:
Example Code section 3.77: Variable arguments. // A polygon needs at least three points. public void drawPolygon(Point p1, Point p2, Point p3, Point... otherPoints) {
//…
} Return parameter A method may return a value (which can be a primitive type or an object reference). If the method does not return a value we use the void Java keyword.
However, a method can return only one value so what if you want to return more than one value from a method? You can pass in an object reference to the method, and let the method modify the object properties so the modified values can be considered as an output value from the method. You can also create an Object array inside the method, assign the return values and return the array to the caller. However, this gives a problem if you want to mix primitive data types and object references as the output values from the method.
There is a better approach, define a special return object with the needed return values. Create that object inside the method, assign the values and return the reference to this object. This special object is "bound" to this method and used only for returning values, so do not use a public class. The best way is to use a nested class, see example below:
Computer code Code listing 3.12: Multiple returned variables. public class MyObject {
...
/** Nested object is for return values from getPersonInfoById method */
private static class ReturnObject {
private int age;
private String name;
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void setName(String name) {
name = name;
}
public String getName() {
return name;
}
} // End of nested class definition
/** Method using the nested class to return values */
public ReturnObject getPersonInfoById(int id) {
int age;
String name;
...
// Get the name and age based on the ID from the database
...
ReturnObject result = new ReturnObject();
result.setAge(age);
result.setName(name);
return result; }
} In the above example the getPersonInfoById method returns an object reference that contains both values of the name and the age. See below how you may use that object:
Example Code section 3.78: Retrieving the values. MyObject object = new MyObject(); MyObject.ReturnObject person = object.getPersonInfoById(102);
System.out.println("Person Name=" + person.getName()); System.out.println("Person Age =" + person.getAge()); Test your knowledge Special method, the constructor The constructor is a special method called automatically when an object is created with the new keyword. Constructor does not have a return value and its name is the same as the class name. Each class must have a constructor. If we do not define one, the compiler will create a default so called empty constructor automatically.
Computer code Code listing 3.13: Automatically created constructor. public class MyClass {
/**
* MyClass Empty Constructor
*/
public MyClass() {
}
} Static methods A static method is a method that can be called without an object instance. It can be called on the class directly. For example, the valueOf(String) method of the Integer class is a static method:
Example Code section 3.79: Static method. Integer i = Integer.valueOf("10"); The static keyword makes attributes instance-agnostic. This means that you cannot reference a static attribute of a single object (because such a specific object attribute doesn't exist). Instead, only one instance of a static attribute exists, whether there is one object in the JVM or one hundred. Here is an example of using a static attribute in a static method:
Example Code section 3.80: Static attribute. private static int count = 0;
public static int getNewInteger() {
return count++;
} You can notice that when you use System.out.println(), out is a static attribute of the System class. A static attribute is related to a class, not to any object instance. This is how Java achieves one universal output stream that we can use to print output. Here is a more complex use case:
Computer code Code listing 3.14: A static attribute. public class MyProgram {
public static int count = 0;
public static void main (String[] args) {
MyProgram.count++;
MyProgram program1 = new MyProgram();
program1.count++;
MyProgram program2 = new MyProgram();
program2.count++;
new MyProgram().count++;
System.out.println(MyProgram.count);
}
}