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