ใน Java เราสามารถประกาศอาร์เรย์โดยใช้สิ่งต่อไปนี้:
String[] array = new String[10];
int size = array.length;
นี่หมายความว่าอาร์เรย์เป็นวัตถุหรือไม่? ฉันถามเพราะใน C ++ อาร์เรย์เป็นเพียงตัวชี้และไม่มีวิธีการใด ๆ
ใน Java เราสามารถประกาศอาร์เรย์โดยใช้สิ่งต่อไปนี้:
String[] array = new String[10];
int size = array.length;
นี่หมายความว่าอาร์เรย์เป็นวัตถุหรือไม่? ฉันถามเพราะใน C ++ อาร์เรย์เป็นเพียงตัวชี้และไม่มีวิธีการใด ๆ
if (array instanceof Object) System.out.println("Yes!")
&x, และp+i new int(42)
คำตอบ:
ใช่; ข้อกำหนดภาษา Java เขียน :
ในภาษาโปรแกรม Java อาร์เรย์คือออบเจ็กต์ (§4.3.1) ถูกสร้างขึ้นแบบไดนามิกและอาจกำหนดให้กับตัวแปรประเภท Object (§4.3.2) เมธอดคลาสทั้งหมดอาจถูกเรียกใช้บนอาร์เรย์
ถาม Java กันเถอะ!
public class HelloWorld
{
public static void main(String[] args)
{
System.out.println(args instanceof Object);
int[] someIntegers = new int[] {42};
System.out.println(someIntegers instanceof Object);
}
}
เอาท์พุต:
true
true
int[] someIntegers = {42};ผลลัพธ์เดียวกันได้
ใช่มันเป็นวัตถุใน Java
โปรดทราบว่าเมื่อคุณarray.lengthไม่ได้เรียกใช้วิธีการใด ๆ แต่เพียงแค่เข้าถึงlengthฟิลด์ของอาร์เรย์ มีวิธีการคงที่มากมายในคลาสArrays
สิ่งสำคัญคือต้องทราบว่าอาร์เรย์ใน Java มีรหัสไบต์ของตัวเองซึ่งไม่ใช้ร่วมกับอ็อบเจ็กต์ พวกมันเป็นวัตถุอย่างแน่นอน แต่ได้รับการจัดการที่แตกต่างกันเล็กน้อยในระดับต่ำ
ฉันจะบอกว่าคำตอบคือใช่แม้ว่าฉันจะเพิ่มสิ่งนั้น แต่พูดอย่างเคร่งครัดอาร์เรย์ก็เป็นวัตถุใน C ++ เช่นกัน จาก§1.8 [intro.object] ของมาตรฐานปัจจุบัน (FDIS):
วัตถุเป็นพื้นที่ของการจัดเก็บข้อมูล
ทุกอาร์เรย์ใน java คือ object ex int [] a = new int [2]; ใหม่จึงใช้ในการสร้างวัตถุและเนื่องจากเป็นวัตถุเราสามารถตรวจสอบชื่อคลาสได้โดยใช้ a.getClass (). getName ();
java.util.Object(new int[1]) instanceof Object // -> evaluates to true
java.util.Arraysเป็นคลาสผู้ช่วยเหลือและอาร์เรย์ไม่ใช่อินสแตนซ์ของคลาสนี้(new int[1]) instanceof java.util.Arrays // -> compile error
java.lang.reflect.Arrayเป็นคลาสผู้ช่วยเหลือและอาร์เรย์ไม่ใช่อินสแตนซ์ของคลาสนี้(new int[1]) instanceof java.lang.reflect.Array // -> compile error
อาร์เรย์สืบทอดสมาชิกทั้งหมดของ java.lang.Object
อาร์เรย์แทนที่วิธีสืบทอดมาจากclone()Object
อาร์เรย์ใช้ฟิลด์lengthซึ่งมีจำนวนส่วนประกอบของอาร์เรย์ ความยาวอาจเป็นบวกหรือศูนย์ มันเป็นpublicและfinal.
อาร์เรย์ใช้อินเทอร์เฟซCloneableและjava.io.Serializable.
8 ก. อาร์เรย์ได้รับการสนับสนุนโดยClass<T>อาร์เรย์ได้รับการสนับสนุนโดยคุณสามารถดึงClass<T>อินสแตนซ์จากอินสแตนซ์อาร์เรย์
(new int[2]).getClass()
หรือจากประเภทอาร์เรย์
int[].class
8b. อินสแตนซ์คลาสการสะท้อนเฉพาะ (เช่นอินสแตนซ์ของjava.lang.Class<T>) ถูกสร้างขึ้นสำหรับอาร์เรย์แต่ละประเภทในโค้ดของคุณ ตัวอย่าง
int[].class.getCanonicalName() // -> "int[]"
String[].class.getCanonicalName() // -> "java.lang.String[]" /
ข้อมูลอ้างอิง
จากข้อกำหนด Java ส่วน 4.3.1 ออบเจ็กต์
ออบเจ็กต์คืออินสแตนซ์คลาสหรืออาร์เรย์
อินสแตนซ์คลาสถูกสร้างขึ้นอย่างชัดเจนโดยนิพจน์การสร้างอินสแตนซ์คลาส
อาร์เรย์ถูกสร้างขึ้นอย่างชัดเจนโดยนิพจน์การสร้างอาร์เรย์
superclass Objectในโดยตรงของชนิดอาร์เรย์
อาร์เรย์ทุกประเภทใช้อินเทอร์เฟซCloneableและjava.io.Serializable.
สมาชิกของประเภทอาร์เรย์มีดังต่อไปนี้:
ฟิลด์สุดท้ายสาธารณะlengthซึ่งมีจำนวนส่วนประกอบของอาร์เรย์ ความยาวอาจเป็นบวกหรือศูนย์
เมธอดสาธารณะcloneซึ่งแทนที่เมธอดของชื่อเดียวกันในคลาสObjectและไม่มีการตรวจสอบข้อยกเว้น ประเภทการกลับมาของcloneวิธีการของชนิดอาร์เรย์คือT[]T[]
โคลนของอาร์เรย์หลายมิตินั้นตื้นซึ่งกล่าวได้ว่าสร้างอาร์เรย์ใหม่เพียงชุดเดียว มีการแชร์ Subarrays
สมาชิกทั้งหมดที่สืบทอดมาจากคลาส Object; วิธีการเดียวของ Object ที่ไม่ได้รับการสืบทอดคือวิธีการโคลน
อาร์เรย์ของสิ่งใด ๆ คือวัตถุ หนึ่งสามารถเรียกวิธีการเช่นequals, hashcodeฯลฯ :
final int[] i = {};
i.equals(new int[] {1}); // false
i.hashcode();
เราไม่สามารถเรียกเมธอดในประเภทเนทีฟได้
สังเกตด้านล่างข้อมูลโค้ดและเอาต์พุต
public class Tester {
int a[];
public static void main(String[] args) {
System.out.println(new Tester().a);// null
System.out.println(new Tester().a[0]);// Exception in thread "main" java.lang.NullPointerException \n at mainclass.Tester.main(Tester.java:10)
}
}
เห็นได้ชัดว่าอาร์เรย์aถือว่าเป็นวัตถุ
ใช่เอกสารพูดอย่างนั้น:
อาร์เรย์เป็นวัตถุคอนเทนเนอร์ที่เก็บค่าจำนวนคงที่ของประเภทเดียว
โปรดสังเกตว่าประเภทดั้งเดิมของอาร์เรย์ (เช่นint[]หรือchar[]) เองก็เป็นวัตถุเช่นกัน
ทุกอาร์เรย์ขยายjava.lang.Objectและใช้งานอินเทอร์เฟซjavs.lang.Cloneableและjava.io.Serializable. ลายเซ็นประเภทรันไทม์ของอาร์เรย์[Lตามชื่อคลาสของประเภทคอมโพเนนต์ทันที (เช่น[Ljava.lang.String) อาร์เรย์ของชนิดดั้งเดิมมีลายเซ็นรันไทม์ดังต่อไปนี้:
[Bสำหรับbyte[];[Sสำหรับshort[];[Iสำหรับint[];[Jสำหรับlong[];[Fสำหรับfloat[];[Dสำหรับdouble[];[Cสำหรับchar[].