@Sarah
2015-11-05T17:43:23.000000Z
字数 7499
阅读 1294
java笔记
面向对象 OOP
java c++ OC
类:模板
对象:实现
类似电脑包括硬盘/cpu/软盘,要制作硬盘有个模板(类),不同的硬盘具体不一样(对象)
主程序→ 发消息→ 【对象】→ 发消息→ 【对象】
⬇
发消息
⬇
【对象】
class 名称{第一个字母大写 多个英文词成员 【变量定义:多个】【函数定义:多个】}
这里的变量之后还要实例化
每个新的对象都包括变量 和函数
变量:类型 名称;类型 名称=初始;函数:返回值类型 名称 ([参数]){代码}
大案例:
定义二位坐标点类point
class point{int x,y;//改变点的数值setX(int x){}setY(int y){}//求两点距离distance(){}//求关于原点对称点getApoint(){}//两点是否相等equals(){}
piont p ←发消息← p赋值
构造函数:名称=类名,无返回说明
函数重载:同名的两个函数
封装:内部的数据、代码
override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法。
重写(覆盖)的规则:
1、重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载.
2、重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)。
3、重写的方法的返回值必须和被重写的方法的返回一致;
4、重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类;
5、被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。
6、静态方法不能被重写为非静态的方法(会编译出错)。
overload是重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。
重载的规则:
1、在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样);
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
多态的概念比较复杂,有多种意义的多态,一个有趣但不严谨的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法。
一般,我们使用多态是为了避免在父类里大量重载引起代码臃肿且难于维护。
构造函数是一个计算机术语,是一种特殊的方法,主要用来在创建对象时初始化对象,构造函数的命名必须和类名完全相同,而一般方法则不能和类名相同。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。一个班级有学生,有的是TA有的是拿奖学金的,为了能够把每一个学生类型匹配,需要构造函数来建立不同的参数把他们对应起来。
1构造方法必须与所在的类有相同的名字
2构造方法没有返回类型,连void也没有
3构造方法的调用是创建一个对象时使用new进行的,构造方法的作用是初始化对象。构造方法(constructor )是一种特殊的方法
• 用来初始化(new)该类的一个新的对象
• 构造方法和类名同名,而且不写返回数据类型。
Person( String n, int a ){name = n;age = a;}
一般情况下,类都有一个至多个构造方法
• 如果没有定义任何构造方法,系统会自动产生一个构造方法,称为默认构造方法(default constructor)。
• 默认构造方法不带参数,并且方法体为空。
equals() 判断是否相等
toString() 转换成字符串输出
public class Point {int x,y;Point(){}Point(int bb){}Point(int xx,int yy){x=xx;y=yy;}void setX(long xx){x=(int)xx;}void setX(int xx){x=xx;}void setY(int yy){y=yy;}Point getApoint(){Point q=new Point(-x,-y);return q;}double distance(Point p2){double d=0;d=Math.sqrt((x-p2.x)*(x-p2.x)+(y-p2.y)*(y-p2.y));return d;}boolean equals(Point p3){if (p3.x==x && p3.y==y) {return true;}else {return false;}}public String toString(){return "("+x+","+y+")";}}//不要再这里输出打印任何东西
public class Main {public static void main(String[] args) {Point p;p=new Point(10);// System.out.println("x="+p.x+"\ty="+p.y);p.setX(100l);// System.out.println("x="+p.x+"\ty="+p.y);p.setY(-100);System.out.println("p:"+p.toString());Point t=p.getApoint();System.out.println("ttttt:"+t);Point q=t.getApoint();System.out.println("q.x="+p.x+"\tq.y="+p.y);System.out.println( q.distance( t) );System.out.println(p.equals(t));System.out.println(p.equals(q));}}
关于圆的关系
我写的有错误的代码
package Circle;import java.awt.Point;public class Circle {int x, y;int r;Point center;int radius;Circle() {center = new Point();radius = 1;}Circle(int x, int y) {radius = 0;}Circle(int xx, int yy, int r) {center = new Point(xx, yy);radius = r;}Circle(Point p, int r) {center = p;radius = r;}Point setCenter(Point p1) { // 设置圆心坐标x = p1.x;y = p1.y;return p1;}void setR(int rr) { // 设置圆的半径radius = rr;}double getArea(int r) { // 求面积return radius * radius * 3.1415926;}int relation(Circle c) {double distance = Math.sqrt((x - c.x) * (x - c.x) + (y - c.y)* (y - c.y));int k = 0;if (distance > r + c.r) {return k = 0;} else if (distance == r + c.r) {return k = 1;} else if (r - c.r < distance && distance < r + c.r) {return k = 2;} else if (distance == r - c.r) {return k = 3;} else {return k = 4;}}boolean equals(Circle c2) { // 判断两个圆是否相等if (c2.x == x && c2.y == y && c2.r == r) {return true;} else {return false;}}public String toString() {return "(" + x + "," + y + "," + r + ")";}}
package Circle;import java.awt.Point;public class Main {public static void main(String[] args) {Point p1 = new Point();p1.x=5;p1.y=4;Point p2 = new Point();p2.x=6;p2.y=7;int r1 = 5;Circle c1 = new Circle(p1, 8);Circle c2 = new Circle();c2.x=5;c2.y=6;c2.r=9;Circle c3 = new Circle();c3.x=5;c3.y=6;c3.r=7;// p1.setCenter(p2); 有错// System.out.println("P1:"+p1);// c3.setR(9); 有错// System.out.println("C3:"+c3.toString());// System.out.println(c2.getArea(r1)); 有错System.out.println(c2.relation(c1));System.out.println(c1.equals(c2));System.out.println("C2:"+c2.toString());}}
package Circle;import java.awt.Point;public class Circle {int x, y;Point center;int radius;Circle() {}Circle(int xx, int yy) {x=xx;y=yy;radius = 0;}Circle(int xxx, int yyy, int rr) {x=xxx;y=yyy;radius = rr;}Circle(Point p, int rrr) {x = p.x;y=p.y;radius = rrr;}Point setCenter(Point p1) { // 设置圆心坐标x = p1.x;y = p1.y;return p1;}void setR(int rr) { // 设置圆的半径radius = rr;}double getArea(int radius) { // 求面积return radius * radius * 3.1415926;}int relation(Circle c) { //求两圆关系double distance = Math.sqrt((x - c.x) * (x - c.x) + (y - c.y)* (y - c.y));int k = 0;if (distance > radius + c.radius) {return k = 0;} else if (distance == radius + c.radius) {return k = 1;} else if (radius - c.radius < distance && distance < radius + c.radius) {return k = 2;} else if (distance ==radius - c.radius) {return k = 3;} else {return k = 4;}}boolean equals(Circle c2) { // 判断两个圆是否相等if (c2.x == x && c2.y == y && c2.radius == radius) {return true;} else {return false;}}public String toString() {return "(" + x + "," + y + "," + radius + ")";}}
package Circle;import java.awt.Point;public class Main {public static void main(String[] args) {Point p1 = new Point();p1.x=5;p1.y=4;Point p2 = new Point();p2.x=6;p2.y=7;int radius = 5;Circle c1 = new Circle(p1, 8);Circle c2 = new Circle();c2.x=5;c2.y=6;c2.radius=9;Circle c3 = new Circle();c3.x=4;c3.y=8;c3.radius=7;// p1.setCenter(p2);// System.out.println("P1:"+p1);c3.setR(5);System.out.println("C3: "+c3.toString());System.out.println("圆的面积是: "+c2.getArea(c2.radius));System.out.println("两个圆的关系: "+c2.relation(c1));System.out.println("两圆是否相等: "+c1.equals(c2));System.out.println("C2: "+c2.toString());}}
更改以后的答案
package Circle;public class Circle {Point center;int radius;//不要设置乱七八糟的x y变量了!因为圆里的center引用的点对象包括了x y,所以只要设点对象就好,之后召唤的时候用center.x/center.y即可Circle() {center=new Point(0,0);}Circle(int xx, int yy) {center=new Point(xx,yy);//这里需要new出一个新的内存空间,否则会没地方存储数据(null)radius = 0;}Circle(int xx, int yy, int rr) {center=new Point(xx,yy);radius = rr;}Circle(Point p, int rrr) {center=p;radius = rrr;}void setCenter(Point p1) { // 设置圆心坐标center=p1;}void setR(int rr) { // 设置圆的半径radius = rr;}double getArea() { // 求面积return radius * radius * 3.1415926;}int relation(Circle c) { //求两圆关系double distance = center.distance(c.center); //重要 ※ 记住if (equals(c))return 5;else if (distance > radius + c.radius) {return 0;} else if (distance == radius + c.radius) {return 1;} else if (radius - c.radius < distance && distance < radius + c.radius) {return 2;} else if (distance ==radius - c.radius) {return 3;} else {return 4;}}boolean equals(Circle c2) { // 判断两个圆是否相等if (c2.center.x == center.x && c2.center.y == center.y && c2.radius == radius) {return true;} else {return false;}}public String toString() {return "{" + center + "," + radius + "}";}}
package Circle;public class Point {int x,y;private Point(){this(0,0);}public Point(int bb){}public Point(int x,int y){this.x=x;this.y=y;}Point getPoint(){Point p=new Point();p.setX(-x);p.setY(-y);return p;}public void setX(long xx){x=(int)xx;}void setX(int xx){x=xx;}void setY(int yy){y=yy;}Point getApoint(){ //新函数 返回值是pointPoint q=new Point(-x,-y);return q;}public double distance(Point p2){ //point是原来的点坐标,p2是另一点的坐标double d=0;d=Math.sqrt((x-p2.x)*(x-p2.x)+(y-p2.y)*(y-p2.y));return d;}public boolean equals(Point p3){if (p3.x==x && p3.y==y) {return true;}else {return false;}}public String toString(){return "["+x+","+y+"]";}public int getX(){return x;}public int getY() {return y;}}
package Circle;public class Main {public static void main(String[] args) {Point p1 = new Point(0, 4);//这里new出了新空间p1.x = 5;p1.y = 4;Point p2 = new Point(6, 7);//new出空间存放数据// p2.x=6;// p2.y=7;int radius = 5;Circle c1 = new Circle(p1, 8);Circle c2 = new Circle();System.out.println(c2.center);System.out.println(c2.center.x);c2.setCenter(new Point(5, 6));c2.radius = 9;Circle c3 = new Circle(10, 10);c3.radius = 7;c3.setCenter(p2);System.out.println("P1:" + p1);//是圆里的这点c3.setR(5);System.out.println("C3: " + c3.toString());System.out.println("圆的面积是: " + c2.getArea());System.out.println("两圆是否相等: " + c1.equals(c2));System.out.println("C2: " + c2.toString());System.out.println("C1: " + c1.toString());int r = c1.relation(c2);System.out.print("c1,c2两个圆的关系: ");switch (r) { //用switch语句打印,能针对不同情况打印出更多的内容case 0:System.out.println("相离");break;}}}