分享我的JAVA笔记

1、所有的对象都是在堆中构造的。

2、不要在构造器中定义与实例域重名的局部变量。

3、只要方法是私有的,类的设计者就可以确信:它不会被外部的其它类操作调用,可以将其删除。如果方法是公有的,就不能删去,因为其它的代码可能调用它。

4、在下面两种情况下使用静态方法:
(1) 一个方法不需要访问对象状态,其所需参数都是通过显示参数提供(例如:Math.pow)。
(2) 一个方法只需访问类的静态域

5、返回类型不是方法签名的一部分。也就是说,不能有两个名字相同、参数类型也相同却返回不同类型的方法。

6、初始化数据域的方法
(1) 在构造器中设置值。
(2) 在声明中赋值。
(3) 初始化块。

7、首先运行初始化块,然后才运行构造器的主体部分。

8、调用构造器的具体处理步骤:
(1) 所有数据域初始化为默认值(0,false或null)。
(2) 按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块。
(3) 如果构造器第一行调用了第二个构造器,则执行第二个构造器主体。
(4) 执行这个构造器主体。

9、类设计技巧
(1) 一定将数据设计为私有。
(2) 一定要对数据初始化。
(3) 不要在类中使用过多的基本数据类型。
(4) 不是所有的域都需要独立的域访问器和更改器。
(5) 使用标准格式进行类的定义。
(6) 将职责过多的类进行分解。
(7) 类名和方法名要体现它们的职责。
10、动态绑定与静态绑定
对象方法的执行过程
(1) 编译器查看对象的声明类型和方法名。
(2) 接下来,编译器将查看调用方法时提供的参数类型。
(3) 如果是private方法、static方法、final方法或者构造器,那么编译器将可以准确地知道该调用哪个方法,我们将这种调用方法称为静态绑定。与此对应的是,调用方法依赖于隐式参数的实际类型,并且在运行时实现动态绑定。
(4) 当程序运行,并且采用动态绑定调用方法时,虚拟机一定调用与所引用对象的实际类型最合适的那个类的方法。
[color=red]Note:虚拟机预先为每个类创建了一个方法表,其中列出了所有方法的签名和实际调用的方法。在真正调用方法的时候,虚拟机仅查找这个表就行了。


11、反射:能够分析类能力的程序被称为反射。可以用反射机制作如下事情:
(1) 在运行中分析类。
(2) 在运行中查看对象,例如,编写一个toString供所有类使用。
(3) 实现数组的操作代码。
(4) 利用Method对象,这个对象很像C++中的函数指针。

12、程序的内存分配:一个由C/C++编译的程序占用的内存分以下几个部分:
(1) 栈区(stack)----由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
(2) 堆区(heap)----一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。它与数据结构中的堆是两回事,分配类似于链表。
(3) 全局区(静态区)----全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
(4) 文字常量区----常量字符串就是放在这里的。程序结束后由系统释放。
(5) 程序代码区----存放函数体的二进制代码。

13、Map<Integer, Object> map = new HashMap<Integer, Object>();
    ArrayList<Object> list = new ArrayList<Object>();
    将list的值映射到map中,若想改变list的值而不影响map的值,map映射的时候保存list的克隆。
即map.peu(1,list.clone());

14、继承设计的技巧
(1) 将公共操作和域放在超类。
(2) 不要使用受保护的域。
(3) 使用继承实现"is-a"关系。
(4) 除非所有继承的方法都有意义,否则不要使用集成。
(5) 在覆盖方法时,不要改变预期的行为。
(6) 使用多态,而非类型信息。
(7) 不要过多的使用反射。

15、Arrays类中的sort方法承诺可以对对象数组进行排序,但对象所属的类必须实现了Comparable接口,并且元素之间必须是可比较的。

16、任何实现了Comparable的类都需要包含compareTo方法,并且这个方法的参数是一个Object对象,返回一个整型数值。

17、对象克隆
(1) 为了实现深拷贝,必须实现所有可变的实例域。
(2) 对于每一个类,都需要作出下列判断:
    <1> 默认的clone方法是否满足要求。
    <2> 默认的clone方法是否能够通过调用可变子对象的clone得到修补。
    <3> 是否应该是有clone
实际上,选项<3>是默认的。如果要选择<1>或<2>,类必须实现:1>实现cloneable接口;2>使用public访问修饰符重新定义clone方法。

18、使用内部类的原因有以下三点:
(1) 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据。
(2) 内部类可以对同一个包中的其它类隐藏起来。
(3) 当想定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。

19、代理
(1) 要想创建一个代理对象,需要使用Proxy类的newProxyInstance方法。这个方法有三个参数:
    1> 一个类加载器。目前用null表示默认的类加载器。
    2> 一个class对象数组,每个对象都是需要实现的借口。
    3> 一个调用处理器。
(2) 使用代理的原因:
    1> 路由对远程服务器的方法调用。
    2> 在程序运行期间,将用户接口事件与动作关联起来。
    3> 为调试,跟踪方法调用。

20、集合List,Set,Queue,Map(后面将发表文章,JAVA数据结构与算法的学习心得,更加深入地理解)
(1) List属于线性结构,它里边有ArrayList和LinkedList两个分支,ArrayList主要用于查询(一般用于不经常添加删除的程序),LinkedList主要用于添加和删除较频繁的程序。
(2) Set包含的元素没有重复的,里边主要有HashSet,TreeSet,LinkedHashSet。HashSet查询速度快,但顺序是被打乱的,TreeSet按照字典排序排列但速度较慢,LinkedHashSet按照添加的顺序排列元素并且具有HashSet一样的查询速度。
(3) Queue,先进先出,一般用LinkedList实现。
(4) Map是映射集,一般形式为Map<key,value>。
[/color]

你可能感兴趣的:(java,数据结构,c,虚拟机,算法)