鱼C论坛

 找回密码
 立即注册
查看: 1895|回复: 3

[已解决]求助关于构造器的问题

[复制链接]
发表于 2022-3-8 14:34:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. public class Point {
  2.         double x, y;
  3.        
  4.         public Point() {
  5.                 System.out.println("这是无参构造器");
  6.         }
  7.        
  8.         public Point(double _x, double _y){
  9.                 System.out.println("这是有参构造器");
  10.                 x = _x;
  11.                 y = _y;
  12.         }
  13.        
  14.         public double getDistance(Point p) {
  15.                 double d = Math.sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));
  16.                 return d;
  17.         }
  18.        
  19.         public static void main(String[] args) {
  20.                 Point p = new Point();
  21.                 Point p1 = new Point(3.0, 4.0);
  22.                 Point origin = new Point(0, 0);
  23.                 System.out.println(p1.getDistance(origin));
  24.         }
  25. }
复制代码


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

1.
  1. public class Point {
  2.         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 13:32:50
1 可以不用public修饰
没有修饰就是package型的,同一个包的中其他类可以构造此类的对象,
用public修饰的构造方法,是为了让外部能够使用new来创建对象,你也可以用 private
protect 来修饰这是来决定此构造方法的访问权限的

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

3 x y 就是当前类的实例变量 p.x 和p.y是另一个实例化的类实例变量,换言之就是同时实例化两个相同的类进行计算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-9 11:03:06 | 显示全部楼层
1
  1. public class Point {
  2.         double x, y;}
复制代码

这个 x,y 是实例变量,实例变量要想在其他类中改变他的值只能实例化的时候,或者实例化之后.
  1. public Point(double _x, double _y)这一段
复制代码

所以这段代码就是为了初始化x,y的变量的

2

一般来说有参构造的参数名称最好与类中的实例变量相同
就像这样
  1. public Point(double x, double y){
  2.                 System.out.println("这是有参构造器");
  3.                 this.x = x;
  4.                 this.y = y;
  5.         }
复制代码

不过要加 this 关键字应该是你还没有学到这儿

3

Point p 就是 Point类的引用 他指向整个类就跟 String 是一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-9 13:12:29 | 显示全部楼层
小伤口 发表于 2022-3-9 11:03
1

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

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

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

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

  2. }
复制代码


4. Math.sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));里的x和y是哪里的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-9 13:32:50 | 显示全部楼层    本楼为最佳答案   
1 可以不用public修饰
没有修饰就是package型的,同一个包的中其他类可以构造此类的对象,
用public修饰的构造方法,是为了让外部能够使用new来创建对象,你也可以用 private
protect 来修饰这是来决定此构造方法的访问权限的

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

3 x y 就是当前类的实例变量 p.x 和p.y是另一个实例化的类实例变量,换言之就是同时实例化两个相同的类进行计算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-5 16:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表