由于Java通过值传递方法参数,因此在调用它的方法中将看不到方法中正在操作的值x
和y
正在操作的值.rotate
因此,x
和y
那些在正在改变值rotate
的方法是一个本地副本,所以一旦超出范围(即从返回rotate
的方法来调用它的方法),值x
和y
消失.
所以目前正在发生的事情是:
x = 10; y = 10; o1 = new obj(); o1.a = 100; rotate(x, y, obj); System.out.println(x); // Still prints 10 System.out.println(y); // Still prints 10
从Java中的方法获取多个值的唯一方法是传递一个对象,并操纵传入的对象.(实际上,在进行方法调用时会传入对象引用的副本.)
例如,重新定义rotate
以返回Point
:
public Point rotate(int x, int y, double angle) { // Do rotation. return new Point(newX, newY); } public void callingMethod() { int x = 10; int y = 10; p = rotate(x, y, 45); System.out.println(x); // Should print something other than 10. System.out.println(y); // Should print something other than 10. }
也就是说,正如皮埃尔所说,在我看来,使用AffineTransform会更容易.
例如,创建Rectangle
对象并使用它旋转AffineTransform
可以通过以下方式执行:
Rectangle rect = new Rectangle(0, 0, 10, 10); AffineTransform at = new AffineTransform(); at.rotate(Math.toRadians(45)); Shape rotatedRect = at.createTransformedShape(rect);
AffineTransform
可以应用于实现Shape
接口的类.Shape
可以在Shape
接口的链接Java API规范中找到实现类的列表.
有关如何使用AffineTransform
和Java 2D的更多信息:
Trail:2D图形
课程:Java2D中的高级主题
转换形状,文本和图像