定义一个类Point,表示二维坐标系上的一个点;Point类包含有:
1、2个私有的double类型的成员变量,表示点的x坐标和y坐标;
2、一个无参数的构造器,该构造器创建的点为坐标系原点(0,0)
3、带参数构造器,按指定的x和y值创建点对象;
4、两个成员变量的getter方法;
5、定义成员方法:moveTo(double x,double y) ,该方法表示将当前点移动到指定位置;
6、定义成员方法:calDistance(Point target),该方法计算当前点与目标点(target)之间的距离
提示:
我们还是先把可以直接把成员变量和构造器的方法写上:
Main类代码:
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Point originPoint = new Point();
Scanner scanner = new Scanner(System.in);
double x = scanner.nextDouble();
double y = scanner.nextDouble();
Point point = new Point(x,y);
System.out.println("The point's x is "+point.getX()+" and point's y is "+point.getY());
System.out.printf("The distance from point to origin is:%.3f%n",point.calDistance(originPoint));
point.moveTo(20,10);
System.out.printf("After move,the distance from point to origin is:%.3f",point.calDistance(originPoint));
}
}
输入样例:
输入一个点的x坐标值和y坐标值,用空格分开:
15 25.5
输出样例:
The point's x is 15.0 and point's y is 25.5
The distance from point to origin is:29.585
After move,the distance from point to origin is:22.361
代码——
1——4题直接代码
class Point
{
private double x;
private double y;
public Point()
{
x = 0.0;
y = 0.0;
}//无参构造器
public Point(double x,double y)
{
this.x = x;
this.y = y;
}//有参构造器
public double getX()
{
return x;
}
public double getY()
{
return y;
}
}
5 .写一个方法 表示将当前点移动到指定位置
这个大白话翻译过来,就是改变x,y的值不是?
这就是赋值的一般方法:
public void moveTo(double x,double y)//没有返回值
{
this.x = x;
this.y = y;
}
6.该方法计算当前点与目标点(target)之间的距离
我们看下面的距离公式,也是拿一个对象中的x,y对应计算。我原先还想用数组,发现JAVA和C就是不一样吼,当然C里面也可以用结构体,这是题外话。
我们看这个方法的传参是一个对象。
引用类型传参
当传过去的参数是个对象,其类型就是我们定义的类名,为引用类型——我们传过去的是个地址。
先来看看引用类型:
引用类型和基本值类型对应,诸如:int,double,boolean,char...都是值类型。
可以知道引用类型传过去的不是值,而是什么?没错,地址。
至于,传参为引用类型的方法本质是对地址上的数据操作,还是另外的操作方式,这篇定义类强化就不过多讨论。
既然传过去的是一个对象,相当于对象里面的成员变量和方法都可供我们使用、派遣。
这意味着,我们不用再创建个数组啥的,因为x和y有一个共同的老大,它俩就算小弟。把老大传过来,小弟也就跟着来了。
继续分析:
当前点和目标点的计算怎么理解:
看一眼main代码,且看它意欲何为。
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Point originPoint = new Point();//创建对象,名字是最初的点
Scanner scanner = new Scanner(System.in);
double x = scanner.nextDouble();
double y = scanner.nextDouble();//手动输入,xy的值,这时候应该用有参构造器把值传过去吧,有构造器就是构造新对象。构造器,一个对象调用一次
Point point = new Point(x,y);//果然,这时候呢,创建了个新的对象,上面是赋值
System.out.println("The point's x is "+point.getX()+" and point's y is "+point.getY());//拿到xy的值,并打印
System.out.printf("The distance from point to origin is:%.3f%n",point.calDistance(originPoint));//注意看,这个calDistance是哪里的方法?正是新创建出的赋了值的对象,人家用了个.成员变量访问操作符,把最原先创建的对象传过去了
point.moveTo(20,10);//移动point对象里面xy的值
System.out.printf("After move,the distance from point to origin is:%.3f",point.calDistance(originPoint));//还是如上面,用的是point对象的方法,传最先创建的对象
}
}
噢—我们了然了,用的是point对象里的方法。至于俩对象之间x和y的计算,就要明确点明是来自哪里的x和y。
我们使用 . 操作符来访问,多说一句:.操作符在c的结构体一章也意为:成员访问操作符。
那一串距离公式,我们知道xy怎么表示了,但是那一串根号和平方呢?
Math类
我们需要学习一个新类
还记得我们学习一个类的三步走吗?
导包——创建对象——实现
math类就很简单了,导包由Java来帮我们自动导入,我们创建对象和实现就行。创建对象也不需要new了,math类构造对象都是priavte,私人的,你构造了的话,就说明非法访问了,这是不行的。而且math类都是静态方法,也称类方法。
可知,math类的方法的直系上司就是类,我们用 类名.方法直接调用。
总结:math类导包和创建对象都不用我们来,直接类名调用方法达到实现的目的。
开方:
public double Math.sqrt(double a);
平方(n次方)
public double Math.pow(double a1,int a2)//第一个是底数,第二个是指数
api协议也确实是两个double
分析差不了,现在代码就,犹抱琵琶半遮面了。
public double calDistance(Point target)//算距离,肯定有返回值。main代码里面也可求证
{
return Math.sqrt(Math.pow(target.x - this.x,2) + Math.pow(target.y - this.y,2));//中间的俩平方和再开个方
}
小总结:这俩方法咱积累一下,说不定以后还会遇见
完整代码参考:
package www.tot.demo;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Point originPoint = new Point();
Scanner scanner = new Scanner(System.in);
double x = scanner.nextDouble();
double y = scanner.nextDouble();
Point point = new Point(x,y);
System.out.println("The point's x is "+point.getX()+" and point's y is "+point.getY());
System.out.printf("The distance from point to origin is:%.3f%n",point.calDistance(originPoint));
point.moveTo(20,10);
System.out.printf("After move,the distance from point to origin is:%.3f",point.calDistance(originPoint));
}
}
class Point
{
private double x;
private double y;
public Point()
{
x = 0.0;
y = 0.0;
}//无参构造器
public Point(double x,double y)
{
this.x = x;
this.y = y;
}//有参构造器
public double getX()
{
return x;
}
public double getY()
{
return y;
}
public void moveTo(double x,double y)//没有返回值
{
this.x = x;
this.y = y;
}
public double calDistance(Point target)//算距离,肯定有返回值。main代码里面也可求证
{
return Math.sqrt(Math.pow(target.x - this.x,2) + Math.pow(target.y - this.y,2));//中间的俩平方和再开个方
}
}