Java中类似JavaScript的对象数据类型?

Posted

技术标签:

【中文标题】Java中类似JavaScript的对象数据类型?【英文标题】:JavaScript-like Object data type in Java? 【发布时间】:2015-01-03 07:56:19 【问题描述】:

我在 javascript 方面经验丰富,但对 Java 很陌生。在 JavaScript 中有“对象”数据类型,其中给定变量本质上具有具有自己唯一值的子变量,例如:

var car = type:"Fiat", model:500, color:"white";

它几乎像一个数组,但不完全是(JavaScript 也有数组)。我想知道Java中是否存在相同类型的东西?如果是这样,我将如何在 Java 中声明相同的东西?根据我的搜索,我找不到对象数据类型,但认为可能有类似的东西?

【问题讨论】:

docs.oracle.com/javase/tutorial/java/javaOO/objects.html 在这种情况下,创建Car 类几乎是您能做的最好的事情。我建议你继续学习 Java 编程和 OOP。 看看***.com/a/14442630/203968 【参考方案1】:

虽然 Java 有一个名为 object 的类型,但它不是您想要的。 Java 中几乎所有东西都是一个对象,有两种方法可以处理:

    将具有正确属性的强类型对象定义为类。 Javascript 有类似的概念,实现方式不同,但应该可以识别:

    public class Car 
        private String type;
        private int model;
        private String color;
    
        public Car(final String type, final int model, final String color) 
            this.type = type;
            this.model = model;
            this.color = color;
        
    
        public String getType()  return this.type; 
        public int getModel()  return this.model; 
        public String getColor()  return this.color; 
    
    
    final Car car = new Car("Fiat", 500, "white");
    
    // To get the color, you must:
    car.getColor();
    

    根据需要添加获取和设置属性的方法,启动、停止、驱动等方法。

    如果您想要一个没有行为或限制的松散属性集合,请使用Map。同样,存在一个 Javascript 等价物(x: 1, y: 2 构造 without 使用 new 关键字)。

    final Map<String, Object> car = new HashMap<>();
    car.put("type", "Fiat");
    car.put("model", 500);
    car.put("color", "white");
    
    // To get the color, you:
    car.get("color");
    

    这种方法的缺点是编译器不能强制这些对象的类型(几乎也是如此),并且映射不能具有自定义行为(以任何合理的方式)。在您的示例中,model 是一个数字,但这将允许您分配任何内容,无论它是否有意义(也许有人将数据保存在服务器上并使用 HttpConnection,您所有期望数字的代码都会爆炸) .

在 Java 中,如果您知道您将拥有多辆汽车,所有汽车都具有相同(或相似)的属性,那么建议您使用第一种方法。它允许编译器强制执行和优化您知道将存在的属性,并且继承允许您稍后添加其他属性。该类还允许您定义在该实例上运行的方法,这有助于在系统的各个部分之间创建抽象(您不需要知道汽车是如何启动的,您只需告诉汽车自己启动)。

作为参考,Javascript 等价物是:

// #1
var Car = function(type, model, color) 
    this.type = type;
    this.model = model;
    this.color = color;


var car = new Car("Fiat", 500, "white");

// #2
var car = type: "Fiat", model: 500, color: "white";

// For either option, to get the color you can simply:
console.log(car.color);

最明显的是Java 会跟踪每个变量的类型。不可见的是,Java 会阻止您分配未知属性,比如car.mileage,Javascript 会很乐意在其中添加新属性。最后,Java 有一个可见性的概念,默认情况下将事物设为私有(外部查看者不可见)。在 Javascript 中复制它看起来像:

var Car = function(type, model, color) 
    var _type = type;
    var _model = model;
    var _color = color;

    this.getType = function()  return _type; 
    this.getModel = function()  return _model; 
    this.getColor = function()  return _color; 


console.log(car.getColor());

在 Javascript 中,您可以利用闭包来隐藏数据。 Java 默认为隐藏,并要求您在需要时公开数据。这是一个有趣的选择,在比较代码库时非常相关,并且可以帮助保持类彼此独立。当你开始用 OO 语言编写代码时,它也很容易(并且很容易)违反,所以要记住一些事情(使用简单的结构 会再次困扰你)。

【讨论】:

【参考方案2】:

是的,它们被称为对象并由类定义。这基本上是你学习 Java 时要学习的第一件事

//The definition of an object and it's members
public class Car  
 String type, model, color;

然后,您可以将它们公开以在类外部访问和更改它们

public class Car 
 public String type, model, color;

然后像这样访问它们

//Create an instance of a Car, point to it with variable c and set one of it's properties/members
 Car c = new Car();
 c.type = "Fiesta";

但是允许在外部编辑类的变量在 Java 中被认为是不好的形式,通常你会添加方法来访问每个变量,称为访问器

public class Car 
  private String type, model, color;

//Return the type of this object
  public String getType()
    return type;
  

//Set the type of this object
  public void setType(String type)
    this.type = type;
  

  //etc

然后像这样访问它们

 Car c = new Car();
 c.setType("Fiesta");

类是您为创建对象而编写的模板,对象是类的运行时实例。

【讨论】:

啊,我明白了,我只是以完全不同的方式思考事情。现在这是有道理的。【参考方案3】:

为此目的最好的对象是LinkedHashMap。你可以像 map 一样使用它,但在迭代时它会保持键的顺序。

【讨论】:

【参考方案4】:

如果你想在 JVM 中使用一些 JS 语法,你可以尝试使用 Groovy 而不是 Java

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于Java中类似JavaScript的对象数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

javascript中,数据类型和对象的关系(区别)

JavaScript中基本数据类型和引用数据类型的区别

JavaScript 对象

javascript概述

javascript学习笔记 - 引用类型

Java对象类似于R data.frame [关闭]