ilsoviet1917 发表于 2022-3-8 14:34:52

求助关于构造器的问题

public class Point {
        double x, y;
       
        public Point() {
                System.out.println("这是无参构造器");
        }
       
        public Point(double _x, double _y){
                System.out.println("这是有参构造器");
                x = _x;
                y = _y;
        }
       
        public double getDistance(Point p) {
                double d = Math.sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));
                return d;
        }
       
        public static void main(String[] args) {
                Point p = new Point();
                Point p1 = new Point(3.0, 4.0);
                Point origin = new Point(0, 0);
                System.out.println(p1.getDistance(origin));
        }
}

网上解释说,创建对象时系统会对这个对象的实例进行初始化,如果想改变这种初始化,就可以通过自定义构造器实现。现在有几个问题不明吧:

1.
public class Point {
        double x, y;}本身就有x和y,public Point(double _x, double _y)这一段有有啥意义呢?

2.在有参构造器里,“_x”这种写法是约定俗成呢?还是Java规定必须这么写?

3.public double getDistance(Point p)里面的Point p是public class Point还是public Point() 还是public Point(double _x, double _y)?

小伤口 发表于 2022-3-9 11:03:06

1
public class Point {
      double x, y;}
这个 x,y 是实例变量,实例变量要想在其他类中改变他的值只能实例化的时候,或者实例化之后.
public Point(double _x, double _y)这一段
所以这段代码就是为了初始化x,y的变量的

2

一般来说有参构造的参数名称最好与类中的实例变量相同
就像这样
public Point(double x, double y){
                System.out.println("这是有参构造器");
                this.x = x;
                this.y = y;
      }
不过要加 this 关键字应该是你还没有学到这儿

3

Point p 就是 Point类的引用 他指向整个类就跟 String 是一样的

ilsoviet1917 发表于 2022-3-9 13:12:29

小伤口 发表于 2022-3-9 11:03
1

这个 x,y 是实例变量,实例变量要想在其他类中改变他的值只能实例化的时候,或者实例化之后.


1.如果构造器前不用public修饰会怎么样?

2.class Point里既然有x和y两个变量,无参构造器的意义是什么呢?

3.如果不用构造器,是不是就该写成public class Point(double x, double y){

}

4. Math.sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));里的x和y是哪里的?

小伤口 发表于 2022-3-9 13:32:50

1 可以不用public修饰
没有修饰就是package型的,同一个包的中其他类可以构造此类的对象,
用public修饰的构造方法,是为了让外部能够使用new来创建对象,你也可以用 private
protect 来修饰这是来决定此构造方法的访问权限的

2 不管是无参构造还是有参都是用来实例化对象的,如果你的类不需要初始化类中的变量就用无参,需要就加上有参
一般来说无参构造都要添加,
子类继承父类的时候会自动继承默认的构造函数(这里指无参的构造函数)。而子类里面
已经有一个带有参数的构造函数了,如果没有写那个默认的不带参数的构造函数的话,继承的时候就会报错,因为系
统不知道要继承哪个构造函数,必须明确的使用super()关键字来描述。所以一般为了避免这种错误的发生,在有带多
个构造函数的类里面都会写一个不带参数的构造函数。

3 x y 就是当前类的实例变量 p.x 和p.y是另一个实例化的类实例变量,换言之就是同时实例化两个相同的类进行计算
页: [1]
查看完整版本: 求助关于构造器的问题