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

2022-09-01 23:08:42

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

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

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


答案 1

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

  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");
    
    // To get the color, you must:
    car.getColor();
    

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

  2. 如果需要一个没有行为或限制的松散属性集合,请使用 .同样,存在一个Javascript等效项(不使用关键字的构造)。Map{x: 1, y: 2}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");
    

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

在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会阻止你分配到未知属性,比如说,Javascript会很乐意添加一个新属性。最后,Java有一个可见性的概念,并且默认情况下使事情变得私有(对外部查看者不可见)。在Javascript中复制它看起来像这样:car.mileage

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");

类是您编写的用于创建对象的模板,这些对象是类的运行时实例。