pirun.ku.ac.thpirun.ku.ac.th/~faastwc/sem22556/JAVA/JAVA/BIG JAVA...  · Web viewคลาส...

Post on 18-Aug-2020

1 views 0 download

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); }

}