pirun.ku.ac.thpirun.ku.ac.th/~faastwc/sem22556/JAVA/JAVA/BIG JAVA... · Web viewคลาส...
Transcript of pirun.ku.ac.thpirun.ku.ac.th/~faastwc/sem22556/JAVA/JAVA/BIG JAVA... · Web viewคลาส...
Chapter 2 การเรยกใชออบเจคต (Using Object)
วตถประสงค• เพอเขาใจแนวคดของคลาสและวตถ • เรยนรเกยวกบตวแปร • การเรยกใช methods, methods arguments และ return values • การจดทำาเอกสาร API • เขาใจความแตกตางระหวางวตถ(objects)และตวอางองวตถ (object
references) • สามารถเขยนโปรแกรมแสดงรปทรงอยางงาย(simple shapes )
2.1 วตถและคลาส (Objects and Classes)
2.1.1 การใชวตถ (Using Objects ) จากการยดหลกวาโปรแกรมเกดจากการทำางานรวมกนระหวางวตถ เราสามารถเรยกใหวตถทำางานโดยผานเมธอด(methods)ตางๆในวตถนน โดยภายเมธอดจะบรรจคำาสงไว เชน จาก lab1 มการเขยนโปรแกรมเพอพมพขอความบนหนาจอ โดยเรยกใชเมธอด
println() จากวตถ System.out ซงเปนวตถในคลาส PrintStream
โดยปกตแลวเราจะสรางเมธอดเพอทำาการประมวลผลขอมลภายในวตถเอง แตผเรยกใชไมจำาเปนตองรรายละเอยดภายในเราอาจจะพจารณาเปรยบเทยบวาเครองทำานำาอนบนหลงคากเปนวตถอนหนงทมเมธอด ผลตนำาอน โดยไมสนใจวาจะผลตโดย“ ”วธแสงแดดหรอใชแกส
2.1.2 คลาส(Classes ) คลาสเปนสงทรวมวตถตางๆทมพฤตกรรมหรอเมธอดบางอยางทเหมอนกน
เขาไว ดงนนวตถทกๆวตถในคลาสของตวเองสามารถเรยกใชเมธอดเหลานนได ตวอยางเชน
คลาส PrintStream ซงประกอบวตถตางๆทำาหนาทสงขอมลไปยงจดหมายทตองการ สามารถเลอกใชเมธอด print() หรอ println() ไดทกวตถ เชนวตถ System.out ในบททผานมาเหมอนทผานมา
คลาส String จะมเมธอดตางๆทวตถในคลาสนเรยกใชได เชน length(), toUpperCase()
คำาถาม ?• คณจะแยกแยะความแตกตางระหวางคลาสและวตถไดอยางไร• คณคดวา ทว และเตาไมโครเวฟควรอยในคลาสเดยวกนหรอไม• เครองซกผาบางชนดป นดานตงตรง บางชนดป นแบบ ในการจางคนซกผาเรา
จำาเปนตองรรายละเอยดวธซกหรอไม
2.2 ตวแปร(Variables)กอนทเราจะไดเรยนรถงเรองเมธอดหรอพฤตกรรมของวตถทมากขนเรา
จำาเปนตองทราบถง การประกาศตวแปร ชนด การตงชอ การคอมเมนตและการกำาหนดคาใหกบตวแปร 2.2.1 การประกาศตวแปร(Variable Declaration)
เพอทจะใหวตถสามารถทำางานไดเราจะเกบคาขอมลตางๆของวตถทจำาเปนตอการทำางานของเมธอดโดยการประกาศตวแปรขนไวเกบคาขอมลเหลานน
ชอตวแปรจะถกใชจองหนวยความ ณ.ตำาแหนงหนงในหนวยความจำาเพอจดเกบคาขอมล ในการประกาศตวแปร เราจำาเปนตองกำาหนดประเภทของตวแปร ตามดวยชอตวแปร ในทางปฏบตนยมกำาหนดคาเรมตน(Initial Value) ใหกบตวแปรในคราวเดยว เชน int width = 20 ซงหมายความวาเราประกาศตวแปรชอ width มประเภทเปน integer มคาเรมตนเทากบ 20 เกบไวทหนวยความความจำา เราตองประกาศตวแปรกอนจงจะสามารถเรยกใชงานได เชน
int width = 20; //ประกาศตวแปร width กอน
System.out.println(width); // เรยกใชint area = width*width; // เรยกใช
2.2.2 ประเภทตวแปร(types)ในภาษาจาวามประเภทตวแปรอยหลายประเภท เชน
integer สำาหรบเกบคาจำานวนเตมทไมมจดทศนยม double สำาหรบเกบคาจำานวนเตมทมจดทศนยม เชน double
taxrate = 7.5 ;String สำาหรบเกบตวอกษรประเภทของตวแปรเปนสงบงบอกวาเราสามารถทำางานกบคาของตวแปรนนได
เพยงใดเชน เราไมสามารถใชการคำานวณกบคาทเปน String ได สวนทเปน integer หรอ double สามารถคำานวณทางคณตศาสตรไดเปนตน
2.2.3 การตงชอ คลาส วตถและตวแปร(names)ภาษาจาวามกฎเกณฑในการตงชอสำาหรบ คลาส วตถและตวแปรดงน
ชอตองขนตนดวย _ , ตวอกษร ทเหลออาจเปนตวเลขหรอตวอกษร _ , $ แตไมแนะนำาใช $ เพราบางครงไปซำากบตวแปรทเครองมอสรางขน
หามใช ? , % และ ชองวาง ในชอ ชอมความแตกตางระหวางตวอกษรเลกและใหญ(Case Sensitive) เชน
cat กบ Cat จะถอวาเปนตวแปรคนละตว ชอทตงขนตองไมซำากบคำาสงวน(Reserve Word) ของภาษาจาวา เชน
double , class ในการตงชอคลาสเรานยมตงเปนตวอกษรแรกของแตละคำาเปนอกษรพมพ
ใหญนอกนนตวอกษรพมพเลก เชน BlackCat, PrintStream สวนชอเมธอดและตวแปรใชตวอกษรพมพเลกสำาหรบคำาแรกสวนคำาตอไปใชเหมอน
คลาส เชน maxNumber, getTotal() การตงชอควรตงใหสอความหมายกบการทำาของชอนน ตวอยางการตงชอตวแปร
2.2.4 Comments
ใชอธบายรายละเอยดเพมเตม ชวยอำานวยความสะดวกในการอานคำาสงไดงายขน สามารถใชไดดงน
แบบเดยว int maxNumber = 200 ; // จำานวนผชมสงสดแบบชด
/*int width = 20; System.out.println(width);int area = width*width;*/
2.2.5 การกำาหนดคา(Assignment)เราใชเครองหมายเทากบในการกำาหนดคาใหกบตวแปร เชน
int number = 10; // number มคาเทากบ 10 number = 20; // number มคาเทากบ 20
int height; // ประกาศตวแปร heightint width = height; // error เพราะ height ยงไมไดกำาหนดคา
int height = 20 ; // ประกาศตวแปร height
int width = height; // ถกตองwidth = height +10;
int area = width*height; // ถกตอง
2.3 การเรยกใชเมธอด(Calling Methods)
โปรแกรมสามารถเรยกใชวตถตางๆผานเมธอด โดยสามารถสงคาขอมลเพมเตมไปกบเมธอดกได บางเมธอดเมอทำางานแลวอาจมการคนคากลบ(return value)มายงโปรกรมหรอวตถอนทเปนผเรยก ซงมรายละเอยดการเรยกใชดงน
2.3.1 สวนตดตอแบบสาธารณะของคลาส(The Public Interface of a Class )
คลาสใดๆตองประกาศเมธอดทตองการใหคลาสอนสามารถเรยกใชไดผานการกำาหนดขอบเขตของเมธอดนนแบบสาธารณะ(public)
String greeting = "Hello World";int numberOfCharacters = greeting.length();// numberOfCharacters = 13
จากตว greeting เปนวตถจากคลาส String ซงเราสามารถเรยกเมธอด length() จากวตถ greeting ไดซง length()ไดถกประกาศไวแบบ public จงจะสามารถเรยกใชงานได ซงในกรณนเราไมตองสงขอมลไปกบ length() แตเมธอด length()จะสงคาจำานวนตวอกษรกลบมายงตวแปร numberOfCharacters
String river = "Mississippi";String bigRiver = river.upperCase();// bigRiver = "MISSISSIPPI"
2.3.2 Method Arguments
Syste.out.println("Hello World"); // argument = Hello World
2.3.3 return Values
String greeting = "Hello World";
Syste.out.println (greeting.length()); // ผลลพธหนาจอเทากบ 13
2.3.4 Method Declaration
เราสามารถสรางเมธอดในคลาสโดยประกาศ ชนดการเขาถงเมธอด ชนดคาสงกลบ ชนดของอารกวเมนต เชน
public int length();public String replace(String target, String
replacement);
ในทนใหเราใชการเขาถงเมธอดเปน public กอน ซงจะกลาวรายละเอยดเรองการเขาถงเมธอดอกครงในบทตอไป ในกรณทไมมการสงคากลบใหใช void เชน
public void println(String output);public void println(int output);
เราสามารถประกาศเมธอดทชอเหมอนกนแตมชนดของอารกวเมนตตางกน เราเรยกชดเมธอดแบบนวา overload methods
2.4 การสรางวตถ(Constructing Objects)เราตองทำาการสรางวตถจากคลาสทกครงกอนเรยกใชวตถนน ซงมรปแบบคำา
สงดงน
Rectangle box = new Rectangle(5, 10, 20, 30) ;
จากคำาสงขางบนจะเกดการทำางานดงน1. โอเปอรเรเตอร new จะสรางวตถอนหนงจากคลาส Rectangle 2. จะใชคาอารกวเมนต (5, 10, 20, 30) เปนคาเรมตนขอมลของวตถทได3. จะสงคาของวตถทมชนดคนมา
เมธอดทใชสรางวตถเราเรยกวา Constructor Method ในทนคอ new Rectangle(5, 10, 20, 30)
เราสามารถนำาคาตวแปรมาเกบตวอางองไปยงวตถทสงคนกลบมาไดดวยคำาสง
Rectangle box = new Rectangle(5, 10, 20, 30) ; // ถกตองตวแปร box จะชไปยงไปยงวตถทสงคนกลบมา
// และสามารถเรยกใชวตถนไดในภายหลงผานการเรยก // ตวแปร box
Rectangle box = box.Rectangle(5, 10, 20, 30) ; // ไมถกตองเพราะเราตองเรยก Constructor Method
// ผานโอเปอรเรเตอร new เทานน
2.5 accessor and Mutator Methods
เมธอดของคลาสททำางานแลวมการสงขอมลเกยวกบวตถออกมาโดยไมมการเปลยนแปลงขอมลในวตถแตอยางใด เราเรยกวาเมธอดนวา accessor method เชน เมธอด length() จะคนคาความยาวของสตรงใดๆคนมา
เมธอดของคลาสททำางานแลวมการเปลยนแปลงคาขอมลของวตถเราเรยกเมธอดนนวา mutator method
ตวอยาง mutator method (ในตวอยางนใชคลาส Rectangle ซงเปนคลาสทมอยแลวในระบบของจาวา)
Rectangle box = new Rectangle(5, 10, 20, 30) ;box.translate(15, 25); // translate() จะเปน mutator method
เพราะมการเปลยนคาจดพกดของวตถ box
2.6 the API Documentation
เราสามารถเรยกดรายละเอยดการใชงานคลาสและเมธอดในไลบารของจาวา(JDK)ทงหมดไดจาก
http://docs.oracle.com/javase/7/docs/api/index.html.
2.7 แพคเกจ(Packgages)
เราใชแพคเกจชวยจดกลมของคลาสททำางานใกลเคยงกนใหอยในกลมเดยวกน เชน คลาส Rectangle จะอยในแพคเกจ java.awt แพคเกจตางๆอาจบรรจคลาสทมชอเหมอนกนได ดงนนในการสรางวตถจากคลาสใด หรอตองการเรยกคลาสใด ดงนนเพอปองการสบสนในการเรยกใชคลาสเราจงตองมการระบแพคเกจของคลาสทตองการใชใหตรงจดดวยคำาสง import
2.8 การอางองวตถ(Object references)
ในความเปนจรงแลวเมอเราประกาศตวแปรวตถ(object variable)แลวไมไดหมายความวาตวแปรนนจะเกบคาทงหมดของวตถ แตจะเกบเพยงทตำาแหนงอยของวตถนนในหนวยความจำา
จากคำาสง Rectangle box = new Rectangle(5, 10, 20, 30); สามารถแสดงคาของตวแปร box ไดดงน
ถามการนำาคาของ box ไปเกบไวใน box2 โดยคำาสงดงตอไปน Rectangle box2 = box;
นนหมายถง ตวแปร box2 จะชทตำาแหนงเดยวกบ boxในกรณทมการแกขอมลผาน box2 กจะทำาให คาของวตถท box ช
เปลยนแปลงดวย ดงตวอยางRectangle box = new Rectangle(5, 10, 20, 30); ---
1Rectangle box2 = box; ---2box2.translate(15, 25); ---3
3
ซงการเกบตวแปรของคลาสจะไมเหมอนกบการเกบตวแปรประเภท integer ซงจะเกบคาเหลานนโดยตรง เชน int luckyNumber = 13; สามารถแสดงไดดงน2.9 การเขยนโปรแกรมแบบกราฟก(Graphical Applications)
2.9.1 Frame Windows เราสามารถสรางหนาตางไดดงน 1. สรางวตถเฟรมจากคลาส JFrame ดวยคำาสง
JFrame frame = new JFrame(); 2. กำาหนดขนาดของหนาตาง
frame.setSize(300, 400); เฟรมนมขนาดกวาง 300 pixels สง 400 pixels ถาไมกำาหนดขนาด
หนาตางทไดจะมขนาด กวาง 0 ยาว 0 pixels3. สรางชอของหนาตาง
frame.setTitle("An empty frame"); 4. กำาหนดการปดโปรแกรมเมอปดหนาตาง ถาไมกำาหนด เมอปดหนาตางแลว
โปรแกรมจะยงทำางาน(run)ตอ
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 5. ทำาใหหนาตางมองเหน
frame.setVisible(true); สรปคำาสงไดดงน
import javax.swing.JFrame;public class EmptyFrameViewer{
public static void main(String[] args) { JFrame frame = new JFrame(); frame.setSize(300, 400); frame.setTitle("An empty frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }
}
2.9.2 การวาดคอมโพเนนต(Drawing on a Component)
เปนการสรางรปรางคอมโพเนนตในหนาตาง ซงการวาดจะเกดจากภายคอมโพเนนตเอง ซงรบมาจากคลาส Jcomponent เชน การวาดรปสเหลยม จะมแนวการวาดดงน
public class RectangleComponent extends JComponent{
public void paintComponent(Graphics g) { // คำาสงทใชวาดรปสเหลยม }
}เมธอด paintComponent จะถกเรยกทกครงทมการแสดงคอมโพเนนต
เชน จากการซอนหนาตาง(window)หรอปรบขนาดหนาตาง
เมธอด paintComponent ตองการวตถกราฟก(g)เปนอารกวเมนต ซงวตถกราฟกนจะเกบสถานะของวตถนไวเชน ส ขนาดฟอนต ฯลฯ แตในทางปฏบตเรามกเปลยนวตถจากคลาสกราฟก(Graphic)ไปเปนคลาส Graphic2D ทมประสทธภาพมากกวา
ตวอยางคำาสง การสรางรปสเหลยมในหนาตาง
//rectanglecomponent.java สำาหรบสรางสเหลยมimport java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Rectangle;import javax.swing.JComponent;/**A component that draws two rectangles. */public class RectangleComponent extends JComponent{
public void paintComponent(Graphics g) { //Recover Graphics2D Graphics2D g2 = (Graphics2D) g; //Construct a rectangle and draw it Rectangle box = new Rectangle(5, 10, 20, 30); g2.draw(box); //Move rectangle 15 units to the right and 25 units down box.translate(15, 25); //Draw moved rectangle g2.draw(box); }
}
2.9.3 การทำาใหคอมโพเนนตมองเหนในหนาตาง (Displaying a Component in a Frame)
ในทนขอยกตวอยางการทำาใหสเหลยมมองเหนในหนาตาง โดนอาศยการสรางสเหลยมจากหวขอทผานมา ดงคำาสงตอไปน//rectangleViewer.java
import javax.swing.JFrame;public class RectangleViewer{
public static void main(String[] args) { JFrame frame = new JFrame(); frame.setSize(300, 400); frame.setTitle("Two rectangles");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); RectangleComponent component = new RectangleComponent(); frame.add(component); frame.setVisible(true); }
}
2.10 การสรางวงร เสน ตวอกษรและการกำาหนดส (ellipses, lines, text, and Color)
//facecomponent.java สำาหรบวาด วงร เสน ตวอกษร กำาหนดสimport java.awt.Color;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Rectangle;import java.awt.geom.Ellipse2D;import java.awt.geom.Line2D;import javax.swing.JComponent;
/* A component that draws an alien face
*/public class FaceComponent extends JComponent{
public void paintComponent(Graphics g) { // Recover Graphics2D Graphics2D g2 = (Graphics2D) g; // Draw the head Ellipse2D.Double head = new Ellipse2D.Double(5, 10, 100, 150); g2.draw(head); // Draw the eyes g2.setColor(Color.GREEN); Rectangle eye = new Rectangle(25, 70, 15, 15);
g2.fill(eye); eye.translate(50, 0); g2.fill(eye); // Draw the mouth Line2D.Double mouth = new Line2D.Double(30, 110, 80, 110); g2.setColor(Color.RED); g2.draw(mouth); // Draw the greeting g2.setColor(Color.BLUE); g2.drawString("Hello, World!", 5, 175); }
}
// faceViewer.java สำาหรบแสดง วงร เสน ตวอกษร และส ทไดสรางไว
import javax.swing.JFrame;public class FaceViewer{
public static void main(String[] args) { JFrame frame = new JFrame(); frame.setSize(150, 250); frame.setTitle("An Alien Face");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); FaceComponent component = new FaceComponent(); frame.add(component); frame.setVisible(true); }
}