Java có hỗ trợ cấu trúc không?


93

Java có tương tự như C ++ không struct:

struct Member {
  string FirstName; 
  string LastName;  
  int BirthYear; 
};

Tôi cần sử dụng kiểu dữ liệu của riêng mình.


Đối với những trường hợp sao chép quá theo nghĩa đen: các trường trong Java thực sự cần phải bắt đầu bằng ký tự viết thường, vì vậy firstName, lastNamebirthYear(hoặc yearOfBirthtất nhiên).
Maarten Bodewes

Câu trả lời:


52

Java chắc chắn không có cấu trúc :) Nhưng những gì bạn mô tả ở đây trông giống như một loại lớp JavaBean.


30
Chà, một lớp chỉ có các biến public trông giống như một cái stuct khủng khiếp.
mglauche

10
Chúng ta sẽ có kỷ lục 9 năm sau câu trả lời này, trong Java 14. Thật thú vị là thời gian trôi nhanh như thế nào.
George Leung

Một trong những điểm khác biệt chính giữa các lớp và cấu trúc là cách chúng hoạt động trong bộ nhớ. Về mặt này, câu trả lời này là sai. Java không có gì hoạt động như một cấu trúc nhưng hy vọng sẽ có inline classvào một thời điểm nào đó trong tương lai gần mà tôi tin rằng nó giống một cấu trúc hơn.
Will Calderwood

Một bean có các thuộc tính (tức là getters và thường là setters) và ngày nay thường được chú thích để nó tuân thủ các yêu cầu đối với bean.
Maarten Bodewes

88

Tương tự trong Java với một cấu trúc sẽ là

class Member
{
    public String FirstName; 
    public String LastName;  
    public int    BirthYear; 
 };

và không có gì sai với điều đó trong những trường hợp thích hợp. Giống như trong C ++ thực sự về việc khi nào bạn sử dụng các câu trúc khi bạn sử dụng một lớp với dữ liệu được đóng gói.


22
Tôi sẽ sử dụng các lớp kiểu "POD" trong java trong các trường hợp tương tự như tôi làm trong C ++. "Đối tượng giá trị" xuất hiện trong J2EE nơi bạn có một phương thức trả về nhiều giá trị cùng một lúc. Không cần đóng gói dữ liệu bằng các phương thức getter và setter, chỉ cần đặt các trường ở chế độ công khai - ngắn hơn và mang tính mô tả nhiều hơn. Bất cứ điều gì "thích hợp" tôi có xu hướng đóng gói, giống như tôi đã làm trong C ++. Vì vậy, tôi đứng về nhận xét ban đầu của mình, nhưng đó là một sự lựa chọn phong cách. Tôi không nghĩ rằng bạn mất bất cứ điều gì, và thực sự tôi nghĩ nó mô tả hơn khi những gì bạn có là một lớp giá trị.
Tom Quarendon

16
Không cần kết thúc một lớp trong java bằng dấu chấm phẩy.
Chef Pharaoh

14
Hãy sửa cho tôi nếu tôi sai, nhưng quan điểm của Struct là nó được truyền bằng giá trị chứ không phải bằng tham chiếu. Các lớp học luôn được thông qua bằng cách tham khảo. Đó là lý do tại sao câu trả lời này là sai.
ULazdins

4
@ULazdins: Tôi nghĩ rằng bạn đang nhầm lẫn giữa cấu trúc C # với cấu trúc C ++. Khi bạn truyền một lớp cho một phương thức trong C ++, nó sẽ gọi hàm tạo sao chép, theo mặc định, nó sẽ sao chép từng trường. Bạn phải sử dụng rõ ràng cú pháp để chuyển nó bằng tham chiếu.
Ronaldo Nazarea

4
@PabloAriel Tôi cũng không đồng ý với nhận xét trước đó của mình. Suy nghĩ của tôi được phép phát triển hơn 7 năm;)
Michael Berry

16

Trên thực tế, cấu trúc trong C ++ là một lớp (ví dụ bạn có thể định nghĩa các phương thức ở đó, nó có thể được mở rộng, nó hoạt động chính xác như một lớp), sự khác biệt duy nhất là các sửa đổi truy cập mặc định được đặt thành công khai (đối với các lớp chúng được đặt thành riêng tư theo mặc định).

Đây thực sự là điểm khác biệt duy nhất trong C ++, nhiều người không biết điều đó. ; )


14

Java không có cấu trúc tương tự như cấu trúc của C ++, nhưng bạn có thể sử dụng các lớp với tất cả các thành viên công khai.


15
Thực sự là một structtrong C ++ là ( khá nhiều ) điều tương tự như một classtrong C ++.
Joachim Sauer

Tại sao cần phải có những thành viên này public, tại sao không chỉ giữ chúng bên trong gói ít nhất? Các lớp như vậy thường không phù hợp để sử dụng trong API (nếu chỉ để nulltham khảo có thể có ). Luôn sử dụng khả năng hiển thị tối thiểu!
Maarten Bodewes

8

Với Project JUnion, bạn có thể sử dụng các cấu trúc trong Java bằng cách chú thích một lớp với chú thích @Struct

@Struct
class Member {
  string FirstName; 
  string LastName;  
  int BirthYear; 
}

Thông tin thêm tại trang web của dự án: https://tehleo.github.io/junion/


Đồ tốt. Bây giờ tôi hiểu cấu trúc (đối tượng) được biểu diễn như thế nào trong bộ nhớ. Cảm ơn bạn :)
user218046

6

Vâng, một lớp học là những gì bạn cần. Một lớp định nghĩa một kiểu riêng.


6

Có, Java chưa có kiểu cấu trúc / giá trị. Tuy nhiên, trong phiên bản sắp tới của Java, chúng ta sẽ lấy inline classnó tương tự như struct trong C # và sẽ giúp chúng ta viết mã miễn phí cấp phát.


inline class point { 
  int x;
  int y;
}


2

Các cấu trúc "thực sự" thuần túy không được hỗ trợ trong Java. Ví dụ: C # hỗ trợ các structđịnh nghĩa đại diện cho các giá trị và có thể được cấp phát bất cứ lúc nào.

Trong Java, cách duy nhất để có được giá trị gần đúng của cấu trúc C ++

struct Token
{
    TokenType type;
    Stringp stringValue;
    double mathValue;
}

// Instantiation

{
    Token t = new Token;
}

mà không sử dụng (bộ đệm tĩnh hoặc danh sách) đang làm điều gì đó như

var type = /* TokenType */ ;
var stringValue = /* String */ ;
var mathValue = /* double */ ;

Vì vậy, chỉ cần cấp phát các biến hoặc định nghĩa tĩnh chúng thành một lớp.

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.