J2SE之重学面向对象
给自己放了一个长长的假期,感觉以前学到的有关软件编程的好多知识已经淡忘了,正好现在借着学习J2SE的机会重新复习一下,也让自己的记忆更加深刻。用了两天时间将面向对象的知识快速的学习了一下,大多数知识还都是以前学过的,但也有少数的知识是与当时不一样的,还有就是由于我自己学艺不精没有明白的,在这里就整理补充一下。
1、类和对象的概念:
对象通过“属性”和“方法”来分别对应事物所具有的静态属性和动态属性。
类是用于描述同一类形的对象的一个抽象的概念,类中定义了这一类对象所因具有的不同的静态属性和动态属性。类可以看成一类对象的模板,对象可以看成该类的一个具体事例。Java中类的定义跟以前学过的c#是差不多的,再此不在多说。
2、类(对象)之间的关系:
这部分内容在以前学UML的时候就学过,但是有点淡忘,再此只是复习回忆。
几种关系分别是:关联关系、继承关系(一般和特殊的关系)、聚合关系(整体和部分的关系,可分开的整体和部分)、组合关系(不可分开得整体和部分的关系)、实现关系、多态等。
3、内存解析:
视频中老师一直强调内存解析,一定要弄清楚内存是如何存放的。看一下例子:
class Point{ //定义了一个点类
double x,y,z;
Point(double _x,double _y,double _z){
x=_x;
y=_y;
z=_z;
}
void setX(double _x){
x=_x;
}
double getDistance(Point p){ //求距离的方法
return(x - p.x)*(x - p.x)+(y - p.y)*(y - p.y)+(z - p.z)*(z - p.z);
}
}
public class TestPoint{
public static void main(String[] args){ //主程序入口
Point p=new Point (1.0,2.0,3.0);
Point p1=new Point(0.0,0.0,0.0);
System.out.println(p.getDistance(p1));
p.setX(5.0);
System.out.println(p.getDistance(new Point(1.0,1.0,1.0)));
}
}
从程序入口void main开始分析:
第一句:
前两句话都是实例化Point类的对象,都是属于引用类型的,需要分配两块内存,局部变量放在栈上,实例化出来的对象放在堆上。如图所示。
接着下一条语句:
此时的p是一个临时变量,是局部分配的,所以要放在栈中,将P1中的值复制到p中,所以此时p和P1指向的应该是同一块内存,如图:
下面开始执行GetDistance方法,执行完以后,返回一个数值。返回的数值会重新在栈中开辟一块空间,临时存放在栈中:
当执行完打印输出之后,也就是方法调用完之后,临时存放在栈中的返回值和临时变量就没有了。如图:
同理:下一条语句:
执行完成之后的内存情况:
下一条语句:因为没有指定new出来的(1.0 1.0 1.0)的局部变量,所以就由方法GetDistance中的P来接受,在栈中出现一个p,指向新new出来的对象。
接着计算出来结果后又存放在栈中临时存放空间中,调用完成之后消失,同样,p也属性临时变量,也会消失。
最后,在堆中开辟出来的(1.0 1.0 1.0)的空间也会由垃圾回收机制回收。
等main方法执行完之后,再栈和堆中的所有的空间都会被垃圾回收机制回收,一切又回归原始。
到此就是整个程序的内存分析过程。4、 Package和Import语句
为了便于管理大型软件系统中数目众多的类,解决类的命名冲突问题,Java引入包(package)机制,提供类的多重类命名空间。
Package语句格式:
如果写的类在一个包中,编程是用到这个类,这个类的目录一定要写对,和包的目录层次一致。如上边的例子。另外还要把这个类文件放在相应的目录(文件夹)下边。如果在其他类中药执行一个包中的类,需要写包全名,还要添加引入语句。
引入包中类的简写:
Import包名.类名
讲对象的时候讲的内容挺多的,听得我也有点不知所云。。。多总结总结应该就会好点了,这里先总结这些,以后再继续吧。