ในบทที่แล้วเรามักจะใช้ System.out.println() แล้วมันคืออะไร?
println() เป็นวิธีการ (Method) และระบบเป็นคลาสของระบบ (Class) และ out เป็นวัตถุเอาต์พุตมาตรฐาน (Object) การใช้ประโยคนี้คือการเรียกเมธอด println() ในอ็อบเจ็กต์เอาต์พุตมาตรฐานออกมาในคลาสระบบ System
วิธีการ Java คือชุดของคำสั่งที่ร่วมกันทำหน้าที่
วิธีการคือการรวมกันของขั้นตอนตามลำดับเพื่อแก้ไขปัญหาประเภทหนึ่ง
วิธีการที่มีอยู่ในคลาสหรือวัตถุ
วิธีการถูกสร้างขึ้นในโปรแกรมและอ้างอิงถึงที่อื่น
โดยทั่วไป การกำหนดวิธีการประกอบด้วยไวยากรณ์ต่อไปนี้:
ตัวแก้ไขชื่อวิธีการประเภทค่าส่งคืน (ชื่อพารามิเตอร์ประเภทพารามิเตอร์) {
-
เนื้อความวิธีการ...
ส่งคืนค่าส่งคืน;
-
วิธีการประกอบด้วยส่วนหัวของวิธีการและเนื้อหาของวิธีการ นี่คือส่วนประกอบทั้งหมดของวิธีการ:
โมดิฟายเออร์: โมดิฟายเออร์ซึ่งเป็นทางเลือก จะบอกคอมไพลเลอร์ว่าจะเรียกเมธอดอย่างไร กำหนดประเภทการเข้าถึงสำหรับวิธีนี้
ประเภทค่าส่งคืน: วิธีการอาจส่งคืนค่า returnValueType คือชนิดข้อมูลของค่าส่งคืนของเมธอด วิธีการบางอย่างดำเนินการที่จำเป็นแต่ไม่ส่งคืนค่า ในกรณีนี้ returnValueType คือคีย์เวิร์ด void
ชื่อวิธีการ: คือชื่อจริงของวิธีการ ชื่อวิธีการและรายการพารามิเตอร์รวมกันเป็นลายเซ็นวิธีการ
ประเภทพารามิเตอร์: พารามิเตอร์เป็นเหมือนตัวยึดตำแหน่ง เมื่อเรียกใช้เมธอด ค่าต่างๆ จะถูกส่งผ่านไปยังพารามิเตอร์ ค่านี้เรียกว่าพารามิเตอร์หรือตัวแปรจริง รายการพารามิเตอร์อ้างอิงถึงประเภทพารามิเตอร์ ลำดับ และจำนวนพารามิเตอร์ของวิธีการ พารามิเตอร์เป็นทางเลือก และวิธีการต้องไม่มีพารามิเตอร์
เนื้อหาของวิธีการ: เนื้อหาของวิธีการประกอบด้วยคำสั่งเฉพาะที่กำหนดฟังก์ชันของวิธีการ
ชอบ:
การเผยแพร่สาธารณะ (วันเกิด) {...}
สามารถมีได้หลายพารามิเตอร์:
staticfloatinterest(floatprincipal,intyear){...}
หมายเหตุ: ในภาษาอื่นบางวิธีหมายถึงขั้นตอนและฟังก์ชัน วิธีการส่งกลับค่าส่งคืนที่ไม่ใช่โมฆะเรียกว่าฟังก์ชัน วิธีการส่งกลับค่าส่งคืนเป็นโมฆะเรียกว่าขั้นตอน
วิธีการด้านล่างมี 2 พารามิเตอร์ num1 และ num2 และส่งกลับค่าสูงสุดของพารามิเตอร์ทั้งสองนี้
/**คืนค่าที่มากกว่าของข้อมูลตัวแปรจำนวนเต็มสองตัว*/
publicstaticintmax (intnum1, intnum2) {
เจตนา;
ถ้า(num1>num2){
ผลลัพธ์=num1;
}อื่น{
ผลลัพธ์=num2;
-
ผลตอบแทน;
-
Java รองรับวิธีการเรียกสองวิธี ขึ้นอยู่กับว่าวิธีการส่งคืนค่าหรือไม่
เมื่อโปรแกรมเรียกใช้เมธอด การควบคุมโปรแกรมจะถูกถ่ายโอนไปยังเมธอดที่ถูกเรียก การควบคุมจะถูกส่งกลับไปยังโปรแกรมเมื่อมีการดำเนินการคำสั่ง return ของเมธอดที่ถูกเรียก หรือถึงวงเล็บปิดเนื้อหาของเมธอด
เมื่อเมธอดส่งคืนค่า การเรียกเมธอดมักจะถือเป็นค่า ตัวอย่างเช่น:
intlarger=สูงสุด(30,40);
ถ้าค่าส่งคืนของเมธอดเป็นโมฆะ การเรียกเมธอดจะต้องเป็นคำสั่ง ตัวอย่างเช่น วิธีการ println ส่งคืนค่าเป็นโมฆะ การโทรต่อไปนี้เป็นคำสั่ง:
System.out.println("ยินดีต้อนรับสู่Java!");
ตัวอย่างต่อไปนี้สาธิตวิธีการกำหนดวิธีการและวิธีการเรียกมัน:
คลาสสาธารณะTestMax{
/**วิธีการหลัก*/
publicstaticvoidmain (สตริง [] args) {
อินติ=5;
intj=2;
intk=สูงสุด(i,j);
System.out.println("ค่าสูงสุดระหว่าง"+i+
"และ"+เจ+"คือ"+k);
-
/**คืนค่าที่มากกว่าของตัวแปรจำนวนเต็มสองตัว*/
publicstaticintmax (intnum1, intnum2) {
เจตนา;
ถ้า(num1>num2){
ผลลัพธ์=num1;
}อื่น{
ผลลัพธ์=num2;
-
ผลตอบแทน;
-
-
ผลการรวบรวมและการทำงานของตัวอย่างข้างต้นมีดังนี้:
ค่าสูงสุดระหว่าง 5 และ 2 คือ 5
โปรแกรมนี้ประกอบด้วยวิธีการหลักและวิธีสูงสุด วิธีการหลักถูกเรียกโดย JVM นอกเหนือจากนั้น วิธีการหลักก็ไม่แตกต่างจากวิธีอื่น
ส่วนหัวของเมธอด main ยังคงไม่เปลี่ยนแปลง ดังที่แสดงในตัวอย่าง โดยมีโมดิฟายเออร์สาธารณะและสแตติก ส่งคืนค่าประเภท void ชื่อเมธอดคือ main และรับพารามิเตอร์ประเภท String[] String[] ระบุว่าพารามิเตอร์นั้นเป็นอาร์เรย์สตริง
ในส่วนนี้อธิบายวิธีการประกาศและเรียกใช้เมธอด void
ตัวอย่างต่อไปนี้ประกาศวิธีการชื่อ printGrade และเรียกให้พิมพ์เกรดที่กำหนด
publicclassTestVoidMethod{
publicstaticvoidmain (สตริง [] args) {
พิมพ์เกรด(78.5);
-
publicstaticvoidprintGrade (คะแนนสองเท่า) {
ถ้า(คะแนน>=90.0){
System.out.println('A');
-
elseif(คะแนน>=80.0){
System.out.println('B');
-
elseif(คะแนน>=70.0){
System.out.println('C');
-
elseif(คะแนน>=60.0){
System.out.println('D');
-
อื่น{
System.out.println('F');
-
-
-
ผลการรวบรวมและการทำงานของตัวอย่างข้างต้นมีดังนี้:
ค
วิธีการ printGrade ที่นี่เป็นวิธีการประเภทโมฆะและจะไม่ส่งกลับค่า
การเรียกเมธอด void จะต้องเป็นคำสั่ง ดังนั้นจึงเรียกว่าเป็นคำสั่งในบรรทัดที่สามของวิธีหลัก เช่นเดียวกับข้อความใดๆ ที่ลงท้ายด้วยเครื่องหมายอัฒภาค
เมื่อเรียกใช้เมธอด คุณต้องจัดเตรียมพารามิเตอร์ และคุณต้องระบุพารามิเตอร์ตามลำดับที่ระบุในรายการพารามิเตอร์
ตัวอย่างเช่น วิธีการต่อไปนี้จะพิมพ์ข้อความ n ครั้งติดต่อกัน:
publicstaticvoidnPrintln (ข้อความสตริง intn) {
สำหรับ(inti=0;i<n;i++)
System.out.println (ข้อความ);
-
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงผลกระทบของการส่งผ่านค่า
โปรแกรมนี้สร้างเมธอดที่แลกเปลี่ยนตัวแปรสองตัว
คลาสสาธารณะTestPassByValue{
publicstaticvoidmain (สตริง [] args) {
intnum1=1;
intnum2=2;
System.out.println("วิธีก่อนหน้า,num1is"+
num1+"andnum2is"+num2);
//เรียกวิธีการสลับ swap(num1,num2);
System.out.println("วิธีการเปลี่ยนภายหลัง,num1is"+
num1+"andnum2is"+num2);
-
/**วิธีแลกเปลี่ยนตัวแปรสองตัว*/
publicstaticvoidswap (intn1, intn2) {
System.out.println("tInsidetheswapmethod");
System.out.println("ttBeforeswappingn1is"+n1
+"n2is"+n2);
//แลกเปลี่ยนค่าของ n1 และ n2 inttemp=n1;
n1=n2;
n2=อุณหภูมิ;
System.out.println("ttAfterswappingn1is"+n1
+"n2is"+n2);
-
-
ผลการรวบรวมและการทำงานของตัวอย่างข้างต้นมีดังนี้:
ก่อนสลับวิธีการ num1is1 และnum2is2
ภายในวิธีการสลับ
ก่อนทำการสลับn1is1n2is2
หลังจากสลับn1is2n2is1
วิธีหลังการแลกเปลี่ยน num1is1 และnum2is2
เรียกวิธีการสลับผ่านพารามิเตอร์สองตัว ที่น่าสนใจคือค่าของพารามิเตอร์จริงจะไม่เปลี่ยนแปลงหลังจากเรียกใช้เมธอด
วิธีการสูงสุดที่ใช้ข้างต้นใช้กับข้อมูลประเภท int เท่านั้น แต่ถ้าคุณต้องการได้รับค่าสูงสุดของข้อมูลจุดลอยตัวสองประเภทล่ะ
วิธีแก้ไขคือสร้างวิธีอื่นด้วยชื่อเดียวกันแต่มีพารามิเตอร์ต่างกัน ดังแสดงในโค้ดต่อไปนี้:
สาธารณะดับเบิ้ลแม็กซ์ (doublenum1, doublenum2){
ถ้า(num1>num2){
กลับหมายเลข 1;
}อื่น{
กลับหมายเลข2;
-
-
หากคุณส่งพารามิเตอร์ int เมื่อเรียกใช้เมธอด max เมธอด max ของพารามิเตอร์ int จะถูกเรียก
หากส่งผ่านพารามิเตอร์คู่ ตัวเมธอดสูงสุดของประเภทคู่จะถูกเรียก สิ่งนี้เรียกว่าการโอเวอร์โหลดของเมธอด
นั่นคือสองวิธีของคลาสมีชื่อเหมือนกัน แต่มีรายการพารามิเตอร์ต่างกัน
คอมไพเลอร์ Java กำหนดว่าควรเรียกใช้เมธอดใดโดยพิจารณาจากลายเซ็นของเมธอด
วิธีการโอเวอร์โหลดสามารถทำให้โปรแกรมชัดเจนและอ่านง่ายขึ้น วิธีการที่ทำงานที่เกี่ยวข้องกันอย่างใกล้ชิดควรใช้ชื่อเดียวกัน
วิธีการโอเวอร์โหลดต้องมีรายการพารามิเตอร์ที่แตกต่างกัน คุณไม่สามารถโอเวอร์โหลดเมธอดโดยยึดตามตัวดัดแปลงหรือประเภทการส่งคืนเพียงอย่างเดียว
ขอบเขตของตัวแปรคือส่วนของโปรแกรมที่สามารถอ้างอิงตัวแปรได้
ตัวแปรที่กำหนดภายในวิธีการเรียกว่าตัวแปรท้องถิ่น
ขอบเขตของตัวแปรท้องถิ่นเริ่มต้นจากการประกาศและสิ้นสุดที่ส่วนท้ายของบล็อกที่มีตัวแปรนั้น
ต้องประกาศตัวแปรท้องถิ่นก่อนจึงจะสามารถใช้งานได้
ขอบเขตพารามิเตอร์ของวิธีการครอบคลุมวิธีการทั้งหมด จริงๆ แล้วพารามิเตอร์นี้เป็นตัวแปรท้องถิ่น
ตัวแปรที่ประกาศในส่วนการเริ่มต้นของ for loop มีขอบเขตตลอดทั้งลูป
แต่ขอบเขตของการประยุกต์ใช้ตัวแปรที่ประกาศไว้ในเนื้อความของลูปนั้นมาจากการประกาศจนถึงจุดสิ้นสุดของเนื้อความของลูป ประกอบด้วยการประกาศตัวแปรตามที่แสดงด้านล่าง:
คุณสามารถประกาศตัวแปรโลคัลด้วยชื่อเดียวกันได้หลายครั้งภายในเมธอด ในบล็อกที่ไม่ซ้อนกันที่แตกต่างกัน แต่คุณไม่สามารถประกาศตัวแปรโลคัลสองครั้งภายในบล็อกที่ซ้อนกันได้
บางครั้งคุณต้องการส่งข้อความไปยังโปรแกรมในขณะที่กำลังทำงานอยู่ ซึ่งทำได้โดยการส่งอาร์กิวเมนต์บรรทัดคำสั่งไปยังฟังก์ชัน main()
พารามิเตอร์บรรทัดคำสั่งคือข้อมูลที่ตามหลังชื่อโปรแกรมทันทีเมื่อรันโปรแกรม
โปรแกรมต่อไปนี้พิมพ์อาร์กิวเมนต์บรรทัดคำสั่งทั้งหมด:
คลาสสาธารณะCommandLine{
publicstaticvoidmain (Stringargs []) {
สำหรับ(inti=0;i<args.length;i++){
System.out.println("args ["+i+"]:"+args[i]);
-
-
-
รันโปรแกรมดังภาพด้านล่าง:
javaCommandLinethisisacommandline200-100
ผลการวิ่งมีดังนี้:
หาเรื่อง[0]:นี่
หาเรื่อง[1]:คือ
หาเรื่อง[2]:a
args[3]:คำสั่ง
args[4]:เส้น
หาเรื่อง[5]:200
หาเรื่อง[6]:-100
เมื่อวัตถุถูกสร้างขึ้น ตัวสร้างจะถูกใช้เพื่อเตรียมใช้งานวัตถุ ตัวสร้างมีชื่อเดียวกันกับคลาสที่อยู่ในนั้น แต่ตัวสร้างไม่มีค่าส่งคืน
โดยทั่วไปแล้วตัวสร้างจะใช้ในการกำหนดค่าเริ่มต้นให้กับตัวแปรอินสแตนซ์ของคลาส หรือเพื่อดำเนินการขั้นตอนที่จำเป็นอื่นๆ เพื่อสร้างวัตถุที่สมบูรณ์
ไม่ว่าคุณจะปรับแต่ง Constructor หรือไม่ก็ตาม คลาสทั้งหมดจะมี Constructor เนื่องจาก Java จัดเตรียม Constructor เริ่มต้นโดยอัตโนมัติ ซึ่งจะเตรียมข้อมูลเบื้องต้นให้สมาชิกทั้งหมดเป็น 0
เมื่อคุณกำหนด Constructor ของคุณเองแล้ว Constructor เริ่มต้นจะไม่ถูกต้อง
นี่คือตัวอย่างการใช้วิธีคอนสตรัคเตอร์:
//คอนสตรัคเตอร์แบบคงที่ classMyClass{
intx;
//ต่อไปนี้คือ Constructor MyClass(){
x=10;
-
-
คุณสามารถเริ่มต้นวัตถุได้โดยการเรียกตัวสร้างดังนี้:
publicclassConsDemo{
publicstaticvoidmain (Stringargs []) {
MyClasst1=ใหม่MyClass();
MyClasst2=ใหม่MyClass();
System.out.println(t1.x+""+t2.x);
-
-
โดยส่วนใหญ่แล้วตัวสร้างที่มีพารามิเตอร์เป็นสิ่งจำเป็น
นี่คือตัวอย่างการใช้วิธีคอนสตรัคเตอร์:
//คลาสตัวสร้างอย่างง่าย classMyClass{
intx;
//ต่อไปนี้คือ Constructor MyClass(inti){
x=ฉัน;
-
-
คุณสามารถเริ่มต้นวัตถุได้โดยการเรียกตัวสร้างดังนี้:
publicclassConsDemo{
publicstaticvoidmain (Stringargs []) {
MyClasst1=ใหม่MyClass(10);
MyClasst2=ใหม่MyClass(20);
System.out.println(t1.x+""+t2.x);
-
-
ผลการวิ่งมีดังนี้:
1,020
ตั้งแต่ JDK 1.5 เป็นต้นไป Java รองรับการส่งผ่านพารามิเตอร์ตัวแปรประเภทเดียวกันไปยังเมธอด
การประกาศพารามิเตอร์ variadic ของเมธอดมีลักษณะดังนี้:
typeName...ชื่อพารามิเตอร์
ในการประกาศเมธอด ให้เพิ่มจุดไข่ปลา (...) หลังจากระบุประเภทพารามิเตอร์
วิธีการหนึ่งสามารถระบุพารามิเตอร์ตัวแปรได้เพียงตัวเดียวเท่านั้น และจะต้องเป็นพารามิเตอร์ตัวสุดท้ายของวิธีการ จะต้องประกาศพารามิเตอร์ทั่วไปไว้ข้างหน้า
publicclassVarargsDemo{
publicstaticvoidmain (Stringargs []) {
//เรียกเมธอดพารามิเตอร์ตัวแปร printMax(34,3,3,2,56.5);
printMax(ใหม่สองเท่า[]{1,2,3});
-
publicstaticvoidprintMax (สองเท่า...ตัวเลข) {
ถ้า(ตัวเลข.ความยาว==0){
System.out.println("Noargumentpassed");
กลับ;
-
doubleresult=ตัวเลข[0];
สำหรับ(inti=1;i<numbers.length;i++)
ถ้า(ตัวเลข[i]>ผลลัพธ์){
ผลลัพธ์=ตัวเลข[i];
-
System.out.println("Themaxvalueis"+ผลลัพธ์);
-
-
ผลการรวบรวมและการทำงานของตัวอย่างข้างต้นมีดังนี้:
ค่าสูงสุดคือ 56.5
ค่าสูงสุดคือ3.0
Java อนุญาตคำจำกัดความของวิธีการดังกล่าว ซึ่งถูกเรียกก่อนที่วัตถุจะถูกทำลาย (รีไซเคิล) โดยตัวรวบรวมขยะ วิธีการนี้เรียกว่าการสรุป () ซึ่งใช้ในการล้างวัตถุที่รีไซเคิล
ตัวอย่างเช่น คุณสามารถใช้ Finalize() เพื่อให้แน่ใจว่าไฟล์ที่เปิดโดยออบเจ็กต์ถูกปิด
ในเมธอด Finalize() คุณต้องระบุการดำเนินการที่จะดำเนินการเมื่อวัตถุถูกทำลาย
รูปแบบทั่วไปของ Finalize() คือ:
ป้องกันเป็นโมฆะสุดท้าย ()
-
//รหัสเทอร์มินัลที่นี่}
คำหลักที่มีการป้องกันคือตัวระบุที่ทำให้แน่ใจได้ว่าเมธอด Finalize() จะไม่ถูกเรียกด้วยโค้ดนอกคลาส
แน่นอนว่าการรีไซเคิลหน่วยความจำของ Java สามารถดำเนินการให้เสร็จสิ้นโดยอัตโนมัติโดย JVM หากคุณใช้ด้วยตนเอง คุณสามารถใช้วิธีการข้างต้นได้
publicclassFinalizationสาธิต{
publicstaticvoidmain (สตริง [] args) {
Cakec1=เค้กใหม่(1);
Cakec2=เค้กใหม่(2);
Cakec3=เค้กใหม่(3);
c2=c3=โมฆะ;
System.gc();//การเรียกตัวรวบรวมขยะ Java}
-
คลาสเค้กขยายวัตถุ{
เอกชน;
publicCake (จริงใจ) {
นี้.id=id;
System.out.println("CakeObject"+id+"iscreated");
-
protectedvoidfinalize()throwsjava.lang.โยนได้{
super.จบ();
System.out.println("CakeObject"+id+"isdisposed");
-
-
เมื่อรันโค้ดข้างต้น ผลลัพธ์ที่ได้จะเป็นดังนี้:
C:1>javaFinalizationDemo
CakeObject1 ถูกสร้างขึ้นแล้ว
CakeObject2 ถูกสร้างขึ้นแล้ว
CakeObject3 ถูกสร้างขึ้นแล้ว
CakeObject3isdisposed
CakeObject2isdisposed