Java 从作为第一个对象中的字段的对象访问对象的字段

Java 从作为第一个对象中的字段的对象访问对象的字段,java,object,encapsulation,Java,Object,Encapsulation,我想知道在java中是否可以从对象本身的一个字段访问对象的字段。让我给出一个示例代码: 假设我有一个类(我在这里压缩代码,所以我知道所呈现的代码不会编译) 公共类驱动程序{ //建造师 公共司机(){ } //方法 公共双findArea(){ 返回???;如果我正确理解您的问题 不,无法从Driver的实例向后导航到Car,后者有一个Driver字段引用它。毕竟,可能有几个这样的Car实例,或者根本没有 如果您想让驾驶员知道它是哪辆汽车的一部分,您需要在驾驶员中有一个字段来表示该信息,然后将其

我想知道在java中是否可以从对象本身的一个字段访问对象的字段。让我给出一个示例代码:

假设我有一个类(我在这里压缩代码,所以我知道所呈现的代码不会编译)

公共类驱动程序{
//建造师
公共司机(){
}
//方法
公共双findArea(){

返回???;如果我正确理解您的问题

不,无法从
Driver
的实例向后导航到
Car
,后者有一个
Driver
字段引用它。毕竟,可能有几个这样的
Car
实例,或者根本没有


如果您想让
驾驶员
知道它是哪辆
汽车
的一部分,您需要在
驾驶员
中有一个字段来表示该信息,然后将其设置为(例如)从
汽车
传递到
驾驶员
构造器。但要小心-允许
在构造器内逃逸(从
汽车
构造器调用
驾驶员
构造器)这可能是危险的,因为您在对象完全初始化之前宣传对象的存在。

您需要有对第一个对象的引用。您可以执行以下操作:

public class Driver {

    private Car car;

    public Driver(Car car){
        this.car = car;
    }

    public double findArea(){
        return car.getLength() * car.getWidth();
    }

}

public class Car {

    public double length; 
    public double width;
    public Driver me;

    public Car(){
        length=20.5;
        width=11.2;
        me = new Driver(this);
    }

    // getters and setters

}

其他人已经回答了您的问题。我只想指出,
公共
数据成员在面向对象编程中被认为是一件坏事(TM)。正如Francisco所示,您应该使用getter和setter,并将成员变量本身更改为
私有
访问


话虽如此,我相信你的设计不是最好的。为什么司机要计算汽车的面积?汽车不应该负责计算它自己的面积,特别是因为它已经知道它的宽度和长度了吗?如果你这样设计代码,你将完全消除在你的原始代码中导致问题的问题stion.

@dantuch:Yes-如果
驱动程序
构造函数调用
Car
引用上的方法,则该方法通过参数传递,可能会由于汽车未完全初始化而失败。是的,谢谢。那么如何处理这种情况以使其正常工作?这是否表明您的
findArea()
方法更适合作为
汽车
类的成员,而不是
驾驶员
类的成员?只有汽车才有“区域”,而不是驾驶员。
public static void main(String arg[]){

car = new Car();
car.me.findArea();  << ---line #2 in question
}
public class Driver {

    private Car car;

    public Driver(Car car){
        this.car = car;
    }

    public double findArea(){
        return car.getLength() * car.getWidth();
    }

}

public class Car {

    public double length; 
    public double width;
    public Driver me;

    public Car(){
        length=20.5;
        width=11.2;
        me = new Driver(this);
    }

    // getters and setters

}