为什么构造函数一定要用getX()或者setX?

bbs0422 2008-03-25 05:05:08
class Point {
private double x;
private double y;
Point(double x1, double y1) {
x = x1;
y = y1;
}
public double getX() { return x; }
public double getY() { return y; }
public void setX(double i) { x = i; }
public void setY(double i) { y = i; }
}

class Circle {
private Point o;
private double radius;
Circle(Point p, double r) {
o = p;
radius = r;
}
Circle(double r) {
o = new Point(0.0, 0.0);
radius = r;
}

boolean contains(Point p) {
double x = p.getX() - o.getX();
double y = p.getY() - o.getY();
if(x*x + y*y > radius * radius) return false;
else return true;
}


public void setO(double x, double y) {
o.setX(x);
o.setY(y);
}
public Point getO() { return o; }
public double getRadius() { return radius;}
public void setRadius(double r) { radius = r;}
public double area() {
return 3.14 * radius * radius;
}
}

public class TestCircle {
public static void main(String args[]) {
Circle c1 = new Circle(new Point(1.0,2.0), 2.0);
Circle c2 = new Circle(5.0);
System.out.println("c1:("+c1.getO().getX()+","
+c1.getO().getY()+"),"+c1.getRadius());
System.out.println("c2:("+c2.getO().getX()
+","+c2.getO().getY()+"),"+c2.getRadius());
System.out.println("c1 area = "+c1.area());
System.out.println("c1 area = "+c2.area());
c1.setO(5,6);
c2.setRadius(9.0);
System.out.println("c1:("+c1.getO().getX()+","
+c1.getO().getY()+"),"+c1.getRadius());
System.out.println("c2:("+c2.getO().getX()+","
+c2.getO().getY()+"),"+c2.getRadius());
System.out.println("c1 area = "+c1.area());
System.out.println("c1 area = "+c2.area());

Point p1 = new Point(5.2, 6.3);
System.out.println(c1.contains(p1));
System.out.println(c1.contains(new Point(10.0,9.0)));

}
}
其实有时候不用也没有关系!
...全文
486 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
武者 2011-08-29
  • 打赏
  • 举报
回复
楼主,我遇到了一道和你一样的题目:

写一个MyPoint完全封装类,其中含有私有的int类型的x和y属性,分别用公有的getX和setX、getY和setY方法访问,定义一个toString方法用来显示这个对象的x、y的值,如显示(1, 2),如显示(1, 2),最后用main方法测试。
//getX(),getY()获取鼠标位置。

public class MyPoint
{
private int x,y;
public int getX(){
return x;
}
public int getY(){
return y;
}
public void setX(int a){
x=a;
}
public void setY(int b){
y=b;
}
public String toString(){
return "("+x+","+y+")";
//System.out.println("("+x+","+y+")");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MyPoint point = new MyPoint();
point.setX(2);
point.setY(3);
point.getX();
point.getY();
System.out.println(point);
System.out.println(point.getX());
System.out.println(point.getY());
System.out.println(point.toString());
}
}
hoszone 2008-03-26
  • 打赏
  • 举报
回复
看看书,就知道了,呵呵
private Point o;
private double radius;
这两个就是全局的变量
bbs0422 2008-03-26
  • 打赏
  • 举报
回复
谢谢大家!那么在class Circle{}中哪个变量是局部哪个是全局?
BD_zhu 2008-03-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bentu610 的回复:]
个人觉得get/set挺方便的阿,比构造函数灵活多了
[/Quote]

同意 !!!
BD_zhu 2008-03-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sixme 的回复:]
数据封装啊。。。
不能直接访问或修改数据成员。。。
[/Quote]

这个就是保护 数据 的安全性
bentu610 2008-03-25
  • 打赏
  • 举报
回复
个人觉得get/set挺方便的阿,比构造函数灵活多了
zjh527 2008-03-25
  • 打赏
  • 举报
回复
为了数据安全,可以对其他程序只提供你允许它访问的数据。
schumiXsuse 2008-03-25
  • 打赏
  • 举报
回复
楼主要慢慢适应方法可访问,属性不可访问的做法。
fuyou001 2008-03-25
  • 打赏
  • 举报
回复
数据封装!方便外在访问!
seu_cose 2008-03-25
  • 打赏
  • 举报
回复
一句话 :
java都这样,C++也这样,,,,,

面向对象的都这样~~
dracularking 2008-03-25
  • 打赏
  • 举报
回复
这是VO(值对象)及其他一些专用对象的特性
提供对外服务或访问的专有途径或方式
nihuajie05 2008-03-25
  • 打赏
  • 举报
回复
不是构造函数....
是设置函数...
是为了数据的安全性啊
不然你要设置话,就只能通过构造函数,而构造函数只在创建对象时调用.或者你要把私有变量设置成public才能更改...这样不好,怎么说呢,也不是特别不好,这是封装是否完整的问题
设计上的要求
lookhang 2008-03-25
  • 打赏
  • 举报
回复
数据封装啊。。。
不能直接访问或修改数据成员。。。
  • 打赏
  • 举报
回复
没明白是那里的问题
1) 下面是“平面上点”类的定义: class CPoint { private: int x, y; static int nCount; // nCount用于保存点的个数 public: CPoint(int px=0, int py=0); CPoint(CPoint&); ~CPoint(); int GetX(); int GetY(); void SetX(int); void SetY(int); void ShowPoint(); }; 请完成该类中各成员函数的定义。 2) 下面是“平面上线段”类的定义: class CLine { private: CPoint pt1, pt2; //pt1和pt2分别代表该线段的起点和终点 public: CLine(); CLine(int x1,int y1,int x2,int y2); CLine(CPoint p1,CPoint p2); double Distance(); //计算该线段长度的成员函数 void ShowLine(); }; 请完成该类中各成员函数的定义。并利用VC调试工具观察含有组合关系类的构造函数和析构函数的执行情况。 3) 下面是“空间中点”类的定义: class CThreePoint:public CPoint { private: int z; public: CThreePoint(); CThreePoint(int, int, int); int GetZ(); void SetZ(int pz); virtual void ShowPoint(); }; 请完成该类中各成员函数的定义。并利用VC调试工具观察含有继承关系类的构造函数和析构函数的执行情况。分析为什么要把ShowPoint()函数设置为虚函数?有什么作用?请在main()函数中做测试。 4) 定义一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?把age改为保护成员变量呢?编程试试看。 5) 定义一个车(vehicle)基类,具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。从bicycle和motorcar派生出摩托车(motorcycle)类,它们都有Run、Stop等成员函数。观察虚函数的作用。在继承过程中,注意把vehicle设置为虚基类。如果不把vehicle设置为虚基类,会有什么问题?编程试试看。 6) 参考题目2中Cline类的编写,编写一个空间中线段CThreeLine类。并在该类中观察构造函数的执行顺序。(选做)

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧