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

17 浏览
0 Comments

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

我在JavaScript方面有经验,但对Java还是新手。在JavaScript中,有"对象"数据类型,其中一个给定的变量基本上有其自己独特值的子变量,例如:

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

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

0
0 Comments

在Java中,没有类似于JavaScript中的对象数据类型。这是一个问题,因为有时候我们希望在迭代时保持键的顺序。要解决这个问题,可以使用LinkedHashMap。

LinkedHashMap是Java中的一个类,可以实现类似于JavaScript中对象的功能。它是一个有序的映射表,可以按照插入的顺序来迭代。

下面是一个示例代码,展示了如何使用LinkedHashMap来创建一个类似于JavaScript对象的数据结构:

LinkedHashMap myObject = new LinkedHashMap<>();
myObject.put("name", "John");
myObject.put("age", 25);
myObject.put("city", "New York");
// 遍历对象,并按照插入的顺序输出键和值
for (Map.Entry entry : myObject.entrySet()) {
    String key = entry.getKey();
    Object value = entry.getValue();
    System.out.println(key + ": " + value);
}

运行以上代码,将会输出:

name: John
age: 25
city: New York

可以看到,使用LinkedHashMap可以实现类似于JavaScript对象的功能,并且可以保持键的顺序。这对于一些需要按照特定顺序进行迭代的场景非常有用。

总结起来,虽然Java中没有内置的JavaScript-like对象数据类型,但可以通过使用LinkedHashMap来实现类似的功能。LinkedHashMap是一个有序的映射表,可以按照插入的顺序来迭代。使用LinkedHashMap,我们可以创建类似于JavaScript对象的数据结构,并且保持键的顺序。

0
0 Comments

JavaScript中的对象是通过类(Class)进行定义的。当学习Java时,这基本就是你要学的第一件事。

//对象及其成员的定义
public class Car {
  String type, model, color;
}

你可以将它们设置为public,以便在类的外部访问和修改。

public class Car {
  public String type, model, color;
}

并且可以像下面这样访问它们。

//创建一个Car的实例,用变量c指向它,并设置它的一个属性/成员
Car c = new Car();
c.type = "Fiesta";

但是,在Java中将类的变量允许外部修改被认为是不好的编程习惯,通常你会添加用于访问每个变量的方法,称为访问器。

public class Car {
  private String type, model, color;
  //返回该对象的类型
  public String getType() {
    return type;
  }
  //设置该对象的类型
  public void setType(String type) {
    this.type = type;
  }
  //等等
}

然后可以这样访问它们。

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

一个类是你编写的用于创建对象的模板,而对象则是类的运行时实例。

我明白了,我刚才的思考方式完全不对。现在这样看就有意义了。

0
0 Comments

Java中有一个称为object的类型,但这并不是你想要的。在Java中,几乎所有的东西都是对象,并且有两种处理方式:

1. 定义一个具有正确属性的强类型对象,作为一个类。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");
// 要获取颜色,你必须:
car.getColor();

根据需要添加获取和设置属性的方法,以及开始、停止、驾驶等方法。

2. 如果你想要一个没有行为或限制的宽松属性集合,可以使用Map。同样,在JavaScript中也有一个类似的概念({x: 1, y: 2}构造,不使用关键字new)。

final Map car = new HashMap<>();
car.put("type", "Fiat");
car.put("model", 500);
car.put("color", "white");
// 要获取颜色,你可以:
car.get("color");

使用这种方法的缺点是编译器无法像前一种方法那样强制类型(几乎没有),而且在任何合理的方式下,Map不能具有自定义行为(也就是说,无法限制属性的类型)。在你的例子中,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"};
// 无论选择哪个选项,要获取颜色,只需使用:
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中,默认情况下是隐藏的,需要在需要时公开数据。这是一个有趣的选择,在比较代码库时非常相关,并且可以帮助保持类之间的独立性。但当你开始使用面向对象语言编写代码时,违反这一点非常容易(使用简单的结构将会给你带来麻烦)。

0