/**
* 声明构造方法的格式为 修饰符+当前类的名称(形参列表){语句块}
* 构造方法通过new 调用
* 构造方法固定返回通过方法运算后的对象 不能更改和定义返回值类型
* 没有定义构造方法的情况下默认构造方法为 类名称(){} 两个括号内均为空值 在new调用时对对象进行运算 无更改 直接返回对象
*/
public class Point {
double x,y;
public void set(int a,int b){
x = a;
y = b;
}
public void print(){
System.out.println(“(“+x+”,”+y+”)”);
}
public static void main(String[] args) {
Point a = new Point();
//通过new调用构造方法Point() 类中没有手动定义构造方法,默认方法中的(){}为空,只返回默认的对象
//Point a 为引用类型 占用4字节 a的4字节用来保存对象的地址
a.print();
a.set(3,5);
a.print();
}
}
class Point1 {
double x,y;
public Point1(double _x,double _y){
x = _x;
y = _y;
}
//手动定义构造方法 设定形参_x _y 用这两个的值赋值给x y
public double getDistance(Point1 p){
//定义求距离的方法getDistance 返回double型的距离
//方法里()定义形参p p是Point1类的对象
double d = Math.sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));
//Math.sqrt开平方 百度搜索java开方运算
//这里的x y为程序中实际使用调用命令来调用方法getDistance的那个对象的x y
//用实际对象的x y 和形参p的p.x p.y运算
return d;
}
public static void main(String[] args) {
Point1 a = new Point1(3,5);
//new调用构造方法 构造方法内(3,5)为实参 对应(_x,_y)形参
//通过构造方法 使对象的x,y初始化为3,5
//每次执行方法 会在栈stack内开辟一个栈帧 这里调用构造方法 开辟了Point1()的栈帧
/*构造方法为创建对象的第三步
创建对象第一步创建一个全默认的对象 x y 全默认值
第二步初始化xy 如果在类中定义了double x =7.0 第二步会将x从默认0初始化为7.0
第三步调用构造方法 调用时生成对象的地址this 将构造方法的实参3,5赋值给对象的this.x this.y
因为构造方法中的x y 没有特意指名别的对象 所以默认x y 是指this.x this.y
即将3,5赋值给当前正在构造的对象
构造方法执行完毕后该方法的栈帧从栈stack内消失
*/
System.out.println(a.x+”,”+a.y);
Point1 b = new Point1(5,6);
/*第一步 创建新的对象 对象的x y 全默认值0
第二步 初始化 对象的x y 类中没有进行定义x=?y=? 所以跳过
第三步 调用构造方法 在栈stack内开辟Point1()的栈帧 将当前正在构造的对象的地址赋值给方法内的this
根据实参(5,6)进行运算 构造方法Point1的语句块内设定将5赋值给this.x 将6赋值给this.y
返回对象 构造方法执行完毕 栈帧从栈stack内消失
第四步 将new的对象的地址赋值给引用类型b
*/
double d = a.getDistance(b);
//a为调用方法的主体 (b)为实参 b的5,6对应Point1 p 形参的p.x,p.y
//即用主体a的3,5和实参b的5,6运算
//调用getDistance()方法 在栈stack内开辟一个栈帧 执行完毕后消失
//主体a的地址赋值给方法的this
//运算时使用 this.x this.y 和 b.x b.y
System.out.println(d);
}
//main方法结束 栈帧main()消失
}