首先程序要从程序入口main开始看起。
point p = new point(1,2,3);
point p1 = new point(0,0,0);
这两句是实例化了两个point,一个叫p,一个叫p1,以p为例,程序向下执行,执行到point的构造方法(构造方法写的不正规),point(double _x, double _y, double _z),把1,2,3分别赋给_x,_y,_z,执行方法里面的:
x = _x;
y = _y;
z = _z;
这里是_x,_y,_z的值赋给x,y,z。这个xyz就是整个class里面的xyz,就是这个代码第二行的double x,y,z定义的,他是属于point的,是全局变量,不是到了大括号外面就不能用了。_x那几个是局部变量,他们才是在大括号外面不能用的。后面的p.x用的是p里面的x,也就是说是p的全局变量,就是你注释里面说的x。
方法继续向下面走:
System.out.println(p.getdestance(p1));
这句就要执行到上面的double getdistance(Point p)了。首先,Point大写了,和上面定义的class point不一样,这是不行的,java是严重区分大小写的,要改成一致的才能行。这里调用方法用“.”,其实你可以把“.”理解成的,就是p的getdestance方法了。这句话就是说:打印出p的getdestance方法传入参数p1返回的东西。
然后进入方法体:
return(p.x*p.x+p.y*p.y+p.z*p.z);
这里的p.x就是p的x,指的是全局变量x。但是这个时候的p是方法括号里面传进来的p,就是那个Point p,也就是前面调用方法时的p1了。他的xyz都是0,所以算完了也都是0,输出的是0.0,因为是double型的返回值。
另外,你这个程序有点问题,除了编程的潜规则以外,就是有两个setX方法,还有就是上面说的大小写的事,而且方法都没有加修饰。算距离是平方和了,没有开根号。
你最后问的问题没看明白,我说了这些感觉应该都说明白了,不明白你就再问吧。
class point{
double x,y,z;
point(double _x,double _y,double _z){
x = _x;
y = _y;
z = _z;/*这里的xyz是可以用的这么给你写你就清楚了。前面的是当前类的属性。*/
}
void setX(double _x){
x = _x;
}
void setY(double _y){
y = _y;
}
void setX(double _z){
z = _z;
}
double getdistance(Point p){
return (p.x*p.x+p.y*p.y+p.z*p.z);/*参数传进来一个Point的对象 p。。。p.x就是p对象里面的x属性。*/
}
}
public class testpoint {
public static void main(string args[]){
point p=new point(1,2,3);
point p1=new point(0,0,0);
System.out.println(p.getdistance(p1));/*这里的p.xx 是调用p对象的方法。*/
}
}
首先纠正你一点,不要把这些p弄混了
1.在构造函数中出现的x,y,z等在类的其他方法中还可以继续使用,在构造函数中只是为这些变量赋了初始值。
2.getdistance方法只是接收一个Point,并把Point的xyz相加,就相当于给这个Point又传递了一个Point,然后返回这个Point的xyz相加的值。
3.至于最后一个注释,我觉得这是面向对象最基础的知识了,类的实例调用类的方法都是使用.操作符
上面的 x y z 出了大括号还是有用的 因为声明的是全局变量 你在最外面的
double x,y,z;的地方声明的 所以在class point 之后的大括号结束之前都有用
下一个问题 没怎么看明白啊
你提的问题都是关于变量作用域的,这方面问题书中有很清楚的解答和例子,多看看就会懂。
最后一个问题是关于方法的调用,并不是每个方法都可以直接.调用,需要看你方法定义的权限范围,例如pubilc,private,...等等