Java中非继承Vehicle的Traffic类如何访问其私有实例变量ticking
解决方案
你当前的Vehicle类已经自带了ticking对应的公共Getter方法getTicking(),完全不需要继承就能合法访问,优先选择方案1实现:
方案1:通过公共Getter方法访问(最推荐,符合封装规范)
直接在Traffic类的方法中传入Vehicle(或其子类如Car)的实例作为入参,调用它的getTicking()方法即可,这是Java封装规范下的标准实现,完全不违反业务语义。
修改后的Traffic类代码:
public class Traffic { private double time; public Traffic(double time) { this.time = time; } // 传入Vehicle实例读取ticking值 public double getVehicleTicking(Vehicle vehicle) { return vehicle.getTicking(); } // 判断红绿灯的示例逻辑可参考如下实现 public boolean isGreenLight(Vehicle vehicle) { // 示例判断规则:ticking小于当前time值时为绿灯 return vehicle.getTicking() < this.time; } }
启动类Driver中调用示例:
public class Driver { public static void main(String [] args) { Car obj = new Car("North", 25 , 125, "blue"); Traffic traffic = new Traffic(10); obj.direction("South"); System.out.println(obj.canCarMove()); obj.direction("North"); System.out.println(obj.canCarMove()); obj.move(); obj.move(); System.out.println(obj.moveQuantity()); // 读取车辆的ticking值 System.out.println("车辆ticking值:" + traffic.getVehicleTicking(obj)); // 判断红绿灯状态 System.out.println("当前是否绿灯:" + traffic.isGreenLight(obj)); obj.move(); obj.move(); obj.move(); obj.move(); obj.detectEnd(); } }
方案2:同包缺省访问权限(次选,适合内部模块使用)
如果Traffic和Vehicle类处于同一个包下,可以把Vehicle类中ticking的修饰符从private改成无修饰符(包访问权限),这样同包下的Traffic可以直接访问实例的ticking变量,但会破坏类的封装性,不建议对外暴露的类使用。
修改Vehicle类代码:
// 去掉private修饰符,变为包访问权限 double ticking = 0;
同包下的Traffic可以直接访问:
public double getVehicleTicking(Vehicle vehicle) { return vehicle.ticking; }
方案3:反射访问(极不推荐,仅作特殊场景参考)
如果确实不能修改Vehicle类的代码,也可以用反射强行读取私有变量,但会破坏封装、跳过权限校验,性能也差,正常业务开发不要使用。
示例代码:
import java.lang.reflect.Field; public double getVehicleTicking(Vehicle vehicle) { try { Field tickingField = Vehicle.class.getDeclaredField("ticking"); tickingField.setAccessible(true); return (double) tickingField.get(vehicle); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); return 0; } }
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

