Java是否支持结构?


92

Java是否有C ++的类似物struct

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

我需要使用自己的数据类型。


对于那些复制,望文生义:在Java的领域确实需要使用小写字符,因此firstNamelastNamebirthYear(或yearOfBirth课程)。
Maarten Bodewes

Answers:


52

Java绝对没有结构:)但是,您在此处描述的内容看起来像JavaBean类。


30
好吧,只有公共变量的类看起来像个结构。
mglauche 2011年

10
我们将在Java 14之后的9年后获得记录。这真是太快了。
George Leung

类和结构之间的主要区别之一是它们在内存中的行为。在这方面,这个答案是错误的。Java没有任何行为可以像结构一样,但是希望inline class在不久的将来能够实现,我相信它更像一个结构。
Will Calderwood

Bean具有属性(即,getter和通常的setter),并且如今通常会对其进行注释,以使其符合Bean的要求。
Maarten Bodewes,

88

在Java中相当于struct的是

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

在正确的情况下,这没有错。实际上,在何时使用带有封装数据的类时,与何时使用struct verses几乎完全相同。


22
在与C ++中相同的情况下,我将在Java中使用“ POD”类型类。在J2EE中想到了“值对象”,那里有一个可以一次返回多个值的方法。用getter和setter方法封装数据没有意义,只是将字段公开-更短和更具描述性。我倾向于封装任何“适当的”东西,就像我在C ++中所做的一样。所以我坚持我最初的评论,但这是一种风格选择。我认为您不会松懈任何东西,的确,我认为当您拥有的是价值类时,它更具描述性。
汤姆·夸伦登

16
无需在Java中以分号结束类。
法老王大厨

14
如果我错了,请纠正我,但是Struct的要点是它是通过值而不是通过引用传递的。类总是通过引用传递。这就是为什么这个答案是错误的。
ULazdins

4
@ULazdins:我认为您正在将C#结构与C ++结构混淆。当您将类传递给C ++中的方法时,它将调用复制构造函数,该构造函数默认情况下会复制每个字段。您必须显式使用语法通过引用传递它。
罗纳尔多·纳萨雷

4
@PabloAriel我也不同意我之前的评论。我的想法可以发展7年;)
Michael Berry

16

实际上,C ++中的结构是一个类(例如,您可以在其中定义方法,可以对其进行扩展,它就像类一样工作),唯一的区别是默认访问修饰符设置为public(对于类,它们设置为private默认)。

这确实是C ++的唯一区别,很多人不知道。; )


14

Java没有C ++结构的类似物,但是您可以对所有公共成员使用类。


15
实际上struct,C ++中的a与C ++中的(几乎)相同class
Joachim Sauer'3

为什么需要这些成员public,为什么不至少将它们保留在包装内部?这样的类通常不适合在API中使用(如果仅用于可能的null引用)。始终使用最小可见度!
Maarten Bodewes,

8

使用Project JUnion,您可以通过使用@Struct批注对类进行批注来在Java中使用结构

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

有关该项目网站的更多信息,请访问:https : //tehleo.github.io/junion/


好东西。我现在了解结构(对象)如何在内存中表示。谢谢男人:)
user218046

6

是的,您需要一门课。一个类定义了自己的类型。


5

是的,Java还没有结构/值类型。但是,在即将发布的Java版本中,我们将获得inline class与C#中的struct类似的内容,这将有助于我们编写无分配代码。


inline class point { 
  int x;
  int y;
}


2

Java不支持“真正”纯净的结构。例如,C#支持struct代表值的定义,并且可以随时分配。

在Java中,获得C ++结构近似值的独特方法

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

// Instantiation

{
    Token t = new Token;
}

不使用(静态缓冲区或列表)做类似

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

因此,只需分配变量或将其静态定义为类即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.