[if !supportLists]1. [endif]java中可以使用标号来进行标注,标号可以用来标识除了变量声明语句之外的任何有效语句。
[if !supportLists]2. [endif]八皇后问题的java实现:
8X8国际象棋上摆放八个皇后,任意两个皇后不能处于同一行,同一列,同一个对角线上,一共有多少种摆法?
Java实现:
Size来表示皇后数目和棋盘大小,下面的算法适用于任意数目的皇后。
·location数组:皇后在棋盘每行上列的位置。数组长度为size,location[i] = j,表示在第i行,第j列摆放了一个皇后。
·colsOccupied数组:皇后在棋盘上占据的列,数组长度是size,colsOccupied[j]=1,表示皇后占据了第j列。
·cross1Occupied数组:皇后在棋盘上占据的正对角线,数组长度为2*size,cross1Occupied[i-j+size-1] = 1表示皇后占据了某一条正对角线。
·cross2Occupied数组:皇后在棋盘上占据的反对角线,数组长度为2*size。
cross1Occupied[i+j]=1,表示皇后占据了一条反对角线。
判断流程:
循环测试从第0列到第size-1列能否摆放皇后,在每一次的巡皇中,先测试当前位置(i,j)是否被占领,即所在列和对角线上是否有其他的皇后。如果当前位置没有被占领,就宣布占领
[if !supportLists]3. [endif]每个对象都可以拥有内部数据和方法,并且每一个对象东欧可以唯一地与其他对象区分开来,具体来说,就是每一个对象在内存中拥有唯一的地址。
[if !supportLists]4. [endif]面向对象程序的设计方式:
[if !supportLists](1) [endif]万物皆是对象。
[if !supportLists](2) [endif]程序是对象的集合,他们通过发送消息来告知彼此要做的。
[if !supportLists](3) [endif]每个对象都有自己的由其他对象所构成的存储。
[if !supportLists](4) [endif]每个对象都拥有其类型。
[if !supportLists](5) [endif]某一特定类型的所有对象都可以接受同样的消息。
[if !supportLists]5. [endif]所有的程序设计语言都使用class这个关键词来表示数据类型。
[if !supportLists]6. [endif]面向对象的挑战之一:在问题空间的元素和解空间的对象之间创建一对一的映射。
[if !supportLists]7. [endif]在良好的面向对象的语言中,每个对象都可以很好的完成一项任务,但是它并不试图做更多的事情。
[if !supportLists]8. [endif]访问限制:
[if !supportLists](1) [endif]Public关键字表示紧随其后的元素对任何人都是可用的。
[if !supportLists](2) [endif]Private表示除了类型创建者,和类型的内部方法之外的任何人都不能访问的元素。
[if !supportLists](3) [endif]Protected和private的作用一样,区别在于,继承的类可以访问protected成员,但是不能访问private成员。
[if !supportLists](4) [endif]Java提供了一种默认访问权限,当没有使用前面提到的任何访问指定词时,它将发挥作用:类可以访问一个包中其他的类的成员,但是在包之外,这些成员就和指定了private一样。
[if !supportLists]9. [endif]代码复用是面向对象程序设计语言所提供的最了不起的一个优点之一。
[if !supportLists]10. [endif]当继承现有类型时也就创建了新的类型,这个新的类型包括现有类型的所有成员,而且更重要的是它复制了基类的接口,也就是说“所有发送给基类对象的消息同时也可以发送给导出类的对象”。
[if !supportLists]11. [endif]导出类与基类具有相同的类型,也就是说三角形是一个几何形。
[if !supportLists]12. [endif]使基类和导出类之间产生差异的方法:
[if !supportLists](1) [endif]直接在导出类中添加新的方法。
[if !supportLists](2) [endif]覆盖。
[if !supportLists]13. [endif]非面向对象编程的编译器产生的函数调用会引起所谓的前期绑定,这意味着编译器将产生一个对具体的函数名字的调用,而运行时将这个调用解析到将要被执行的代码的绝对地址。
[if !supportLists]14. [endif]面向对象程序设计语言采用了后期绑定的概念。当向对象发送消息时,被调用的代码直到运行时才确定。在java中动态绑定是默认的,在c++中,则要使用virtual关键字。
[if !supportLists]15. [endif]向上转型:把将导出类看作是它的基类的过程称为向上转型。
[if !supportLists]16. [endif]Java中所有的类都继承自一个单一的基类,这个类是object。单根继承结构带来了很多的好处:
[if !supportLists](1) [endif]所有的对象都有一个共用的接口。所以他们都是相同的基本类型。C++没有共用接口,但是它受限很小,有巨大的灵活性。
[if !supportLists](2) [endif]能够保证所有对象都具有某些功能。你可以在每个对象上执行某些基本的操作,所有对象都很容易在堆上创建,参数的传递也得到了极大的简化。
[if !supportLists](3) [endif]使得垃圾回收器的实现变得容易的多。所有对象都有其类型的信息,所以不会因为无法确定对象的类型而陷入僵局,这对于系统级操作显得尤为重要,特别是异常处理,并且给编程带来了更大的灵活性。
[if !supportLists]17. [endif]容器:创建另一种对象类型,这种新的对象类型,持有对其他对象的引用。
[if !supportLists](1) [endif]不同容器提供了不同类型的接口和外部行为。
[if !supportLists](2) [endif]不同的类型对于某些操作具有不同的效率,例如arraylist和linkedlist具有相同的接口和外部行为的简单序列。
[if !supportLists]① [endif]Arraylist和linkedlist的区别:
[if !supportLists]1. [endif]ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
[if !supportLists]18. [endif]JAVASE5出现之前,容器存储的对象都只具有java中的通用类型,单根继承模式意味这所有的东西都是object类型。JavaSE5出增加了参数化转型,在java中称其为泛型。一对尖括号中间包含类型信息,通过这个特征就可以识别对泛型的使用。
ArrayList shapes = new ArrayList();
[if !supportLists]19. [endif]java采用了动态内存的分配方式。没当想要创建新的对象时,就要使用new关键字来构建此对象的动态实例。
[if !supportLists]20. [endif]Java把内存分成了两种。一种是堆内存,一种是栈内存。
[if !supportLists](1) [endif]一些基本的类型的变量和对象的引用变量都是在函数的栈内存中分配。
[if !supportLists]① [endif]在代码块中定义了一个变量时,java就在栈中为这个变量分配内存空间 ,当超过变量的作用域之后,java会自动释放掉为该变量分配的内存空间。
[if !supportLists](2) [endif]堆内存中存放由new创建的对象和数组。
[if !supportLists]l [endif]堆中分配内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆中内训的首地址,作为引用变量。以后就可以在栈内存中用引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名。
按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的.
静态存储分配要求在编译时能知道所有变量的存储要求,栈式存储分配要求在过程的入口处必须知道所有的存储要求,而堆式存储分配则专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例.堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放.