Java支持结构吗? java有一个模拟C+++代码>结构> :< /p> struct Member { string FirstName; string LastName; int BirthYear; };

Java支持结构吗? java有一个模拟C+++代码>结构> :< /p> struct Member { string FirstName; string LastName; int BirthYear; };,java,data-structures,Java,Data Structures,我需要使用自己的数据类型。Java确实没有结构:) 但是您在这里描述的看起来像是JavaBean类的类。Java没有类似于C++的结构,但是您可以对所有公共成员使用类。是的,类就是您所需要的。类定义自己的类型。在Java中,与结构等价的是 class Member { public String FirstName; public String LastName; public int BirthYear; }; 在正确的情况下,这没有什么错。与C++相

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

Java确实没有结构:)
但是您在这里描述的看起来像是JavaBean类的类。

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

是的,类就是您所需要的。类定义自己的类型。

在Java中,与结构等价的是

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

在正确的情况下,这没有什么错。与C++相比,在使用一个封装数据的类时,使用什么时候是非常类似的。

< P>实际上C++中的一个结构是一个类(例如,你可以在其中定义方法,它可以被扩展,它的工作方式与类完全一样),唯一的区别是默认访问调制解调器被设置为公共的。(对于类,它们默认设置为private)

<>这是C++中唯一的差别,很多人不知道。)java中不支持

结构“真”纯。例如,C#支持表示值并可随时分配的
struct
定义

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

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

// Instantiation

{
    Token t = new Token;
}
如果不使用(静态缓冲区或列表),则执行如下操作

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

因此,只需分配变量或静态地将它们定义到一个类中。

对于JUniton项目,您可以通过使用@Struct annotation注释类来使用Java中的Struct

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

项目网站上的更多信息:

是的,Java还没有结构/值类型。但是,在即将发布的Java版本中,我们将得到
内联类
,它类似于C#中的struct,并将帮助我们编写无分配代码


inline class point { 
  int x;
  int y;
}


与Java14一起,它开始支持Record。你可以检查一下

Java15之后还有密封类。


Java14增加了对记录的支持,这些记录是非常容易构建的结构化数据类型

您可以这样声明Java记录:

public record AuditInfo(
    LocalDateTime createdOn,
    String createdBy,
    LocalDateTime updatedOn,
    String updatedBy
) {}
 
public record PostInfo(
    Long id,
    String title,
    AuditInfo auditInfo
) {}
而且,Java编译器将生成与
AuditInfo
记录关联的以下Java类:

public final class PostInfo
        extends java.lang.Record {
    private final java.lang.Long id;
    private final java.lang.String title;
    private final AuditInfo auditInfo;
 
    public PostInfo(
            java.lang.Long id,
            java.lang.String title,
            AuditInfo auditInfo) {
        /* compiled code */
    }
 
    public java.lang.String toString() { /* compiled code */ }
 
    public final int hashCode() { /* compiled code */ }
 
    public final boolean equals(java.lang.Object o) { /* compiled code */ }
 
    public java.lang.Long id() { /* compiled code */ }
 
    public java.lang.String title() { /* compiled code */ }
 
    public AuditInfo auditInfo() { /* compiled code */ }
}
 
public final class AuditInfo
        extends java.lang.Record {
    private final java.time.LocalDateTime createdOn;
    private final java.lang.String createdBy;
    private final java.time.LocalDateTime updatedOn;
    private final java.lang.String updatedBy;
 
    public AuditInfo(
            java.time.LocalDateTime createdOn,
            java.lang.String createdBy,
            java.time.LocalDateTime updatedOn,
            java.lang.String updatedBy) {
        /* compiled code */
    }
 
    public java.lang.String toString() { /* compiled code */ }
 
    public final int hashCode() { /* compiled code */ }
 
    public final boolean equals(java.lang.Object o) { /* compiled code */ }
 
    public java.time.LocalDateTime createdOn() { /* compiled code */ }
 
    public java.lang.String createdBy() { /* compiled code */ }
 
    public java.time.LocalDateTime updatedOn() { /* compiled code */ }
 
    public java.lang.String updatedBy() { /* compiled code */ }
}
请注意,构造函数、访问器方法以及
equals
hashCode
toString
都是为您创建的,因此使用Java记录非常方便

可以像创建任何其他Java对象一样创建Java记录:

PostInfo postInfo = new PostInfo(
    1L,
    "High-Performance Java Persistence",
    new AuditInfo(
        LocalDateTime.of(2016, 11, 2, 12, 0, 0),
        "Vlad Mihalcea",
        LocalDateTime.now(),
        "Vlad Mihalcea"
    )
);

简短的回答是:

答案很长:

  • 结构
    (在C++中)之间的主要区别在于,结构中的所有属性都是
    公共的
    ,可以从任何地方访问。对于
    ,您可以使用不同的
    隐私级别
    对其进行限制
  • <> >如果您想在C++中拥有与结构> /CODE相同的数据结构,只需将所有属性公有。
    好吧,一个只有公共变量的类看起来非常像一个stuct。在Java14中,我们将有9年的时间。有趣的是,时间过得真快。类和结构之间的主要区别之一是它们在内存中的行为。在这方面,这个答案是错误的。Java没有任何行为类似于结构的东西,但希望在不久的将来有
    内联类
    ,我相信这更像是结构。bean有属性(即getter和setter)现在通常注释它是为了符合bean的要求。实际上,C++中的结构> <代码>是(C++)与C++中的<代码>类< /代码>相同的。这让我想知道C++类是如何从C结构中得到的。@ MaMattBoWees的问题是内部< /代码>,它比保护< /C> >要不那么明显。在 COM.MyApp.LIB < /C>中声明的<<代码>内部< /COD>成员将无法在<代码> COM.MyApp.Mu主< <代码>中访问,因此您可能无法在同一项目内访问它。@ JPoO:我不是C或C++专家,这只是我拾取的一个有趣的琐事。但我想,C++类与C++结构几乎是一样的,我想它们都与C结构(不直接支持关联的构造函数/方法的继承)有很大的不同。@jpaugh我在
    public
    中提到这个问题的全部原因是,您可能不想向许多类公开一个容易处于错误状态的记录;最好将其保存在内部。注意,java记录,如所提到的是不可变的(但是,您总是可以使用工厂方法来创建新记录)当然,我将在java中使用与C++一样的“POD”类类。在J2EE中,您会想到“值对象”,其中有一个方法可以同时返回多个值。用getter和setter方法封装数据毫无意义,只需将字段公开即可——更短、更具描述性。任何“适当”的东西我都倾向于封装,在C++中也是如此。所以我坚持我最初的评论,但这是一种风格选择。我不认为你会失去任何东西,事实上,我认为当你得到的是一个值类时,它更具描述性。不需要在java中用分号结束一个类。如果我错了,请纠正我,但Struct的要点是它是通过值传递的,而不是通过引用传递的。类始终通过引用传递。这就是为什么这个答案是错误的。@乌拉辛丁:我想你把C结构与C++结构混淆了。当将类传递给C++中的方法时,它调用复制构造函数,默认构造函数复制每个字段。您必须显式地使用语法通过引用传递它。@PabloAriel我也不同意我先前的评论。我的思维可以在7年内进化;)对于那些过于严格复制的人:Java中的字段确实需要以小写字符开头,所以
    firstName
    lastName
    生日
    (当然也可以是
    出生年份
    )。好东西。我现在了解了结构(对象)是如何被表示的
    public final class PostInfo
            extends java.lang.Record {
        private final java.lang.Long id;
        private final java.lang.String title;
        private final AuditInfo auditInfo;
     
        public PostInfo(
                java.lang.Long id,
                java.lang.String title,
                AuditInfo auditInfo) {
            /* compiled code */
        }
     
        public java.lang.String toString() { /* compiled code */ }
     
        public final int hashCode() { /* compiled code */ }
     
        public final boolean equals(java.lang.Object o) { /* compiled code */ }
     
        public java.lang.Long id() { /* compiled code */ }
     
        public java.lang.String title() { /* compiled code */ }
     
        public AuditInfo auditInfo() { /* compiled code */ }
    }
     
    public final class AuditInfo
            extends java.lang.Record {
        private final java.time.LocalDateTime createdOn;
        private final java.lang.String createdBy;
        private final java.time.LocalDateTime updatedOn;
        private final java.lang.String updatedBy;
     
        public AuditInfo(
                java.time.LocalDateTime createdOn,
                java.lang.String createdBy,
                java.time.LocalDateTime updatedOn,
                java.lang.String updatedBy) {
            /* compiled code */
        }
     
        public java.lang.String toString() { /* compiled code */ }
     
        public final int hashCode() { /* compiled code */ }
     
        public final boolean equals(java.lang.Object o) { /* compiled code */ }
     
        public java.time.LocalDateTime createdOn() { /* compiled code */ }
     
        public java.lang.String createdBy() { /* compiled code */ }
     
        public java.time.LocalDateTime updatedOn() { /* compiled code */ }
     
        public java.lang.String updatedBy() { /* compiled code */ }
    }
    
    PostInfo postInfo = new PostInfo(
        1L,
        "High-Performance Java Persistence",
        new AuditInfo(
            LocalDateTime.of(2016, 11, 2, 12, 0, 0),
            "Vlad Mihalcea",
            LocalDateTime.now(),
            "Vlad Mihalcea"
        )
    );