Sunday, May 17, 2009

QnA - Para saan po ang pag gamit ng mga overloaded na constructor?

Ah, bale ganto po yan. Supposed you're going to create a Java program na merong object na Pencil. Tapos, pag brand lang ang binigay, magkakaroon kagad ng default na grade ang Pencil na object. And default value ng grade ng Pencil ay 'HB'. Pero pag nagbigay ang user ng grade, ang grade na binigay ng user ang gagamitin:

Pencil.java:
package org.pinoyjavatutorial.myclasses;

public class Pencil {

private String brand_1;
private String grade_1;

public Pencil(String brand, String grade){
brand_1 = brand;
grade_1 = grade;
}

public Pencil(String brand){
brand_1 = brand;
grade_1 = "HB";
}

public String toString(){
return brand_1 + " "+ grade_1;
}

}

At ang MainClass.java (nilagyan ko nang line number sa gilid):
1 package org.pinoyjavatutorial.main;

2 import java.util.Scanner;

3 import org.pinoyjavatutorial.myclasses.Pencil;

4 public class MainClass {

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

6 Scanner scan = new Scanner(System.in);
7 String brand,
8 grade;

9 System.out.println("Input brand: ");
10 brand = scan.nextLine();
11 Pencil pencil = new Pencil(brand);
12 System.out.println(pencil);

13 System.out.println("Input another brand: ");
14 brand = scan.nextLine();
15 System.out.println("Input pencil's grade (HB, B, H, etc.): ");
16 grade=scan.nextLine();
17 Pencil pencil2 = new Pencil(brand, grade);
18 System.out.println(pencil2);
19 }
20 }


Kung titinangnan po natin yung line 11, nung nag instantiate po sya ng new Pencil, ang nilagay po nyang parameter ay 'brand' lang. So sa class po natin na Pencil, ang gagamitin na constructor ay ito kasi isang string lang ang parameter:

public Pencil(String brand){
setBrand_1(brand);
setGrade_1("HB");
}


Pero dun sa sa line 17, dalawa na ang argument na nilagay kaya ang gagamitin ng java na constructor ay ito:

public Pencil(String brand, String grade){
setBrand_1(brand);
setGrade_1(grade);
}

Isa pang tanong, pwede kaya na isa lang ang constructor? Tapos manually na lang ilagay yung grade na 'HB' pag brand lang ang binigay? Ang sagot, opo pwede din. Bale magiging ganto ang hitsura ng code natin:

MainClass2.java:
1 package org.pinoyjavatutorial.main;

2 import java.util.Scanner;

3 import org.pinoyjavatutorial.myclasses.Pencil2;

4 public class MainClass2 {

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

6 Scanner scan = new Scanner(System.in);
7 String brand,
8 grade;

9 System.out.println("Input brand: ");
10 brand = scan.nextLine();
11 Pencil2 pencil2 = new Pencil2(brand);
12 pencil2.setGrade_1("HB");
13 System.out.println(pencil2);

14 System.out.println("Input another brand: ");
15 brand = scan.nextLine();
16 System.out.println("Input pencil's grade (HB, B, H, etc.): ");
17 grade=scan.nextLine();
18 Pencil2 pencil2a = new Pencil2(grade);
19 pencil2a.setGrade_1("grade");
20 System.out.println(pencil2);
21 }
22 }


Pencil2.java:
package org.pinoyjavatutorial.myclasses;

public class Pencil2 {

String brand_1;
String grade_1;

public Pencil2(String brand){
brand_1 = brand;
}

public void setGrade_1(String grade){
grade_1 = grade;
}

public String toString(){
return brand_1 + " "+ grade_1;
}
}


Kaso ang pangit dito ay everytime na brand lang ang binigay, kelangan pa natin i-set manually sa code natin yung default value ng grade (line 12 ng MainClass2). Eh pano kung maraming beses sa codes natin na puro brand lang ang binigay, e di set tayo ng set ng default value. Bukod sa set tayo ng set, pag nag palit tayo ng default value, yung lahat ng mga set natin ng grade eh papaltan natin ng new value. Pero kung dun sa dalawang constructor ang gagamitin natin, pag nagpalit ng value yung default na grade, sa constructor lang tayo magpapalit.

Actually, pwede naman gamitin ang kahit ano sa kanilang dalawa. Mas convinient lang gamitin yung unang approach (yung dalawa ang constructor) sa program na ito kaysa sa pag isa lang ang constructor. Pero it doesn't mean na ang overloaded constructor ang pinaka magandang approach. Depende na yan sa diskarte ng programmer or designer kung anong approach ang gagamitin depende kung anong klaseng program ang gagawin. Ang mahalaga eh alam natin kung pano gumagana ang mga overloaded constructor (mga classes na more than 1 ang constructor kagaya nung Pencil.java).

Now, pwede bang 'Pencil pencil = new Pencil();' ang gamitin. Hindi po kasi wala namang constructor na walang parameter sa class na Pencil. Ang meron lang ay 'Pencil(String brand, String grade)' at 'Pencil(String brand)'. Unless maglagay po tayo ng pang tatlong constructor na 'Pencil()'. Pag naglagay po tayo ng constructor na yan, pwede na pong gamitin ang 'Pencil pencil = new Pencil();'.

Isa pa pong tanong, pano kung wala akong ginawang constructor. Kagaya nito:

package org.pinoyjavatutorial.myclasses;

public class Person {

private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}


Kung mapapansin, walang constructor tayo dito. Puro methods ('public String getName()' at 'public void setName(...)') at 'private String name;' lang ang laman ng class natin. Bakit pag ginamit natin dito:

package org.pinoyjavatutorial.main;

import org.pinoyjavatutorial.myclasses.Person;


public class MainClass3 {

public static void main(String[] args) {

Person human = new Person();
human.setName("mau dim jr");
System.out.println(human.getName());

}
}


ay wala syang error eh wala namang constructor yung Person na class. Ang sagot, this is because pag walang constructor na nilagay sa class natin, JVM will automatically create a default constructor na blank lang, based sa name ng class. Kaya sa 'Person human = new Person();' ay hindi sya nag error kahit wala namang 'Person()' na constructor yung Person na class.

2 comments:

  1. ahhhhhhhhhhh.....

    hahahahaa.... saktong-sakto po sir sa mga tanong sa utak ko!!!!

    pero ano po ba sir dapat isipin pag gagawa ka ng program na may class, method and constructor??

    pag gumagawa po kasi aq ng program main class lang lage eh!! alang method and class...


    salamat po talaga sir..

    lhandbhel

    ReplyDelete
  2. Salamat po dito! :)

    ReplyDelete