Mảng có phải là một đối tượng trong java không


93

Trong java, chúng ta có thể khai báo một mảng như

String[] array = new String[10]; 
int size = array.length; 

Điều này có nghĩa là bản thân mảng là một đối tượng? Bởi vì trong C ++ một mảng chỉ là một con trỏ và không có bất kỳ phương thức nào.


5
Không, trong C ++ một mảng là một mảng và không phải là một mảng.
Kerrek SB

42
if (array instanceof Object) System.out.println("Yes!")
skaffman

6
Ồ, và trong C ++, cả mảng và con trỏ đều là đối tượng.
R. Martinho Fernandes

2
@ R.MartinhoFernandes Tất cả các mảng C ++ thực sự là đối tượng C ++, nhưng có những con trỏ C ++ không phải là đối tượng C ++, cụ thể là tất cả các con trỏ là kết quả của việc đánh giá một giá trị. Ví dụ bao gồm &x, p+inew int(42).
fredoverflow

1
@skaffman Thông báo này không hoàn toàn cần thiết vì nó sẽ không được biên dịch theo cách khác.
shmosel

Câu trả lời:


197

Đúng.

Phần Đặc tả ngôn ngữ Java 4.3.1 bắt đầu bằng:

Một đối tượng là một cá thể lớp hoặc một mảng.


4
Cho đến bây giờ tôi luôn cho rằng một đối tượng đồng nghĩa với cá thể lớp và các mảng là một tính năng ngôn ngữ đặc biệt hoặc một cái gì đó.
Ruben9922

Giải thích chi tiết được đưa ra ở đây: geeksforgeeks.org/array-primitive-type-object-java
garnet

60

Đúng; Đặc tả ngôn ngữ Java viết :

Trong ngôn ngữ lập trình Java, mảng là các đối tượng (§4.3.1), được tạo động và có thể được gán cho các biến kiểu Đối tượng (§4.3.2). Tất cả các phương thức của lớp Object có thể được gọi trên một mảng.


Nếu mảng là một đối tượng, điều đó không có nghĩa là nó là một thể hiện của một lớp? Nếu vậy, tôi có thể gia hạn lớp học đó không?
One Two Three

9
Không, không phải vậy: Đặc tả Java viết : "Một đối tượng là một cá thể lớp hoặc một mảng. Một cá thể lớp được tạo một cách rõ ràng bằng biểu thức tạo cá thể lớp (§15.9). Một mảng được tạo một cách rõ ràng bằng một biểu thức tạo mảng (§15.10). ”. Và không, bạn không thể mở rộng một mảng, bởi vì mệnh đề mở rộng phải có ClassType.
đức vào

36

Vâng, hãy hỏi 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);
  }
}

Đầu ra:

true
true

1
Bạn cũng có thể khai báo int[] someIntegers = {42};kết quả tương tự.
Holger

7

Vâng, nó là một đối tượng trong Java.

Cũng lưu ý rằng khi bạn thực hiện, array.lengthbạn không gọi bất kỳ phương thức nào mà chỉ truy cập vào trường của mảng length. Có rất nhiều phương thức tĩnh trong lớp Mảng .


3

Điều quan trọng cần lưu ý là các mảng trong Java có mã byte riêng mà chúng không chia sẻ với các đối tượng. Chúng chắc chắn là Đối tượng, nhưng được xử lý hơi khác ở cấp thấp.


2

Tôi sẽ nói câu trả lời là có, mặc dù tôi có thể nói thêm rằng, nói đúng ra, mảng cũng là một đối tượng trong C ++. Từ §1.8 [intro.object] của tiêu chuẩn hiện tại (FDIS):

Một đối tượng là một vùng lưu trữ.



1

Mọi mảng trong java là một đối tượng ex int [] a = new int [2]; Vì vậy, new được sử dụng để tạo một đối tượng và vì nó là một đối tượng, chúng ta có thể kiểm tra tên lớp chỉ bằng cách sử dụng a.getClass (). GetName ();


1
  1. Một mảng không phải là một thể hiện của bất kỳ lớp nào được liệt kê trong cây lớp, tuy nhiên mỗi mảng là một đối tượng và kế thừa trực tiếp từ java.util.Object
(new int[1]) instanceof Object   // -> evaluates to true
  1. Lớp java.util.Arraysnày là một lớp trợ giúp và các mảng không phải là cá thể của lớp này.
(new int[1]) instanceof java.util.Arrays    // -> compile error
  1. Lớp java.lang.reflect.Arraynày là một lớp trợ giúp và các mảng không phải là cá thể của lớp này.
(new int[1]) instanceof java.lang.reflect.Array    // -> compile error
  1. Mảng kế thừa tất cả các thành viên của java.lang.Object

  2. Mảng ghi đè phương thức clone()được kế thừa từ Object.

  3. Mảng triển khai trường length, trường này chứa số lượng thành phần của mảng. độ dài có thể là số dương hoặc số không. Nó là publicfinal.

  4. Mảng triển khai các giao diện Cloneablejava.io.Serializable.

8a. Mảng được hỗ trợ bởi Class<T>. Bạn có thể truy xuất Class<T>phiên bản từ một phiên bản mảng

(new int[2]).getClass()

hoặc từ một kiểu mảng

int[].class

8b. Một cá thể lớp phản chiếu duy nhất (tức là một cá thể của java.lang.Class<T>) được tạo cho mỗi kiểu mảng khác nhau trong mã của bạn. Ví dụ

int[].class.getCanonicalName()    //  -> "int[]"
String[].class.getCanonicalName() //  -> "java.lang.String[]" /
  1. Nhắc lại: Mảng là các đối tượng nhưng không phải là thể hiện của bất kỳ lớp nào trong cây lớp.

NGƯỜI GIỚI THIỆU

Từ đặc tả Java Phần 4.3.1 Đối tượng

  • Một đối tượng là một cá thể lớp hoặc một mảng.

  • Một cá thể lớp được tạo rõ ràng bởi một biểu thức tạo cá thể lớp.

  • Một mảng được tạo một cách rõ ràng bởi một biểu thức tạo mảng.

Từ java.util.Arrays

  • Lớp này chứa nhiều phương thức khác nhau để thao tác với mảng (chẳng hạn như sắp xếp và tìm kiếm)

Từ java.lang.reflect.Array

  • Lớp Array cung cấp các phương thức tĩnh để tạo và truy cập động vào các mảng Java.

Từ Phần 10.1 Đối tượng

  • Lớp cha trực tiếp của một kiểu mảng là Object.

  • Mọi kiểu mảng hiện thực các giao diện Cloneablejava.io.Serializable.

Từ Phần 10.7 Các thành viên mảng

Các thành viên của một kiểu mảng là tất cả những điều sau:

  • Trường cuối cùng công khai length, chứa số lượng thành phần của mảng. độ dài có thể là số dương hoặc bằng không.

  • Phương thức public clone, ghi đè phương thức cùng tên trong lớp Objectvà không ném ra ngoại lệ đã kiểm tra. Kiểu trả về của clonephương thức kiểu mảng T[]T[].

  • Bản sao của một mảng nhiều chiều là nông, có nghĩa là nó chỉ tạo ra một mảng mới duy nhất. Các mảng con được chia sẻ.

  • Tất cả các thành viên kế thừa từ lớp Object; phương thức duy nhất của Object không được kế thừa là phương thức clone của nó.


1

Mảng của bất kỳ thứ gì đều là đối tượng. Người ta có thể gọi các phương thức như equals, hashcodev.v.:

final int[] i = {};
i.equals(new int[] {1});  // false
i.hashcode();

Người ta không thể gọi các phương thức trên một kiểu gốc.


0

Quan sát đoạn mã dưới đây và đầu ra.

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

}

rõ ràng mảng a được coi là đối tượng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.