java学习笔记知识点整理01

1.java中后期绑定的实现:java使用一小段特殊的代码来替代绝对地址的调用。这段代码使用在对象中存储的信息来计算方法体的地址,而在c++中是使用virtual关键字来实现的。非面向对象编程的编译器产生的函数调用会引起前期绑定。

2.堆栈中没分配一个空间,栈顶指针向下移动一位,每释放一个空间,栈顶指针向上移动一位。

3.java中==和equals方法默认的都是比较的对象的引用,如果想实现比较对象的内容,则需要在自己的类中覆盖equals方法。java类库都实现了equals方法,用来比较对象的内容而非对象的引用。

4.java中没有允许操作符的重载,而C++和C#这些语言允许。

5.java中在对double和float转型为整型时执行的截尾,如果想得到舍入结果调用java.long.Math中的round()方法。

6.java中没有sizeof,原因是java的所有数据类型在所有机器中的大小都是相同的,而对于c,c++为了考虑移植,不同的数据类型在不同的机器上有不同的大小,需要使用这个方法来获取数据类型的大小。

7.java中在使用this()调用构造器时需要注意,不同同时调用二个构造器;并且将构造器调用放在最起始处。

8.java虚拟机在未面临内存耗尽的情形是不会浪费时间去执行垃圾回收以恢复内存的。System.gc()用于强制垃圾回收

9.finalize()的存在是为了释放在分配内存中采用类似C语言中的做法的内存,因为在java中可能存在原因是java中调用非java代码的本地方法,而在本地方法使用了上述的内存分配方式。

10.java中对堆中内存的分配做了一定的优化,它工作时一面回收空间,一面使对中的对象紧凑排列,垃圾回收器对对象重新排列,实现一种高速的,有无限空间可供分配的堆模型。

11.Java中的垃圾回收机制:并不是简单的引用计数,而是采用停止-复制和标记-清扫相互自适应的垃圾回收机制,停止-复制就是先标记有引用的对象然后复制到新堆中一个挨一个排列,然后释放原来的堆,标记-清扫标记有引用的对象,对于没有标记的对象进行回收(因为在程序运行的过程中可能只会产生少量垃圾的情况)。

12.java对于类中数据成员默认会初始化为零,,对象引用初始化为null,但是对于方法中的局部变量java中采用的方式则是提示一条尚未初始化的错误。

13.java中初始化的顺序,变量的定义顺序决定了初始化的顺序,但是会在任何方法(包括构造方法)被调用之前得到初始化。初始化顺序是先静态对象后非静态对象,构造函数实际也是静态方法。java中允许多个初始化语句组成一个静态块来初始化。

14.java中增加了对数组越界的检查,而在c++等语言中并没有,因而经常出现越界错误。

15.并不能用可变参数列表来实现方法的重载,比如f(int ...args)和f(String ... args)当都存在参数时可以很好的区分,但是当都不给参数时,则编译器就无法知道该调用哪一个方法了。

16.对于处于相同目录中的文件,java将这样的文件看做是隶属该目录的默认包中,这样的文件都不具有明确的package声明。

17.java中的类只能是public和包访问权限,不存在private和protected的类。

18.单例对象的构造:构造方法设置为private,并提供一个静态的方法来构造这个唯一的对象。

19.访问控制的目的:第一为了使用户不要触碰那些他们不该触碰的部分,这些部分对类内部的操作是必要的,并不属于客户端程序员所需接口的一部分;第二类库的设计者可以更改类内部的工作方式而不必担心会对客户端产生重大的影响。专注于类库创建者和类库使用者之间的关系。

20.java中允许重载基类中的方法,如果想重写基类中的某个方法,为防止意外的写成重载的形式,可以在写这个方法前加上@Override注解,防止不留心重载而非覆写该方法。

21.组合和继承的选择:组合一般用于想在新类中使用现有类的功能而非它的接口的情形,重要就是区分is-a(继承)和has-a(组合)之间的区别。在选择继承时的最清晰的办法就是判断是否需要从新类向基类进行向上转型。

22.java中final的使用,类似c++的顶层const,对于一个用final修饰的对象引用,不能再将其指向其他的对象,但是对象自身的内容却可以改变。对于用static和final同时修饰的变量采用大写表示并使用下划线分隔各个单词。java中允许空白final的存在。final方法,主要是防止在继承中被覆盖,另外就是为了效率(这个的原因可以结合c++中内联来理解这里的效率优化,不过一般对于不太复杂的方法),在java的高级版本中这个原因渐渐弱化。类中的所有private的方法都隐式为final,因为子类无法覆盖

23.加载和初始化,所有的static对象和static代码段都是在加载时依据在程序中的顺序被初始化。

24.讲一个方法调用同一个方法主体关联起来被称作绑定,若在程序执行前进行绑定(由编译器和连接程序实现)叫做前期绑定;java中除掉static方法和final方法全是动态绑定,只有普通额方法调用时多态的,对于同名的字段则不表现为多态,原因是分配为不同的域,对于父类中的private,在子类中是无法覆盖的,当用父类的引用指向子类对象,然后调用相应的方法时并不能表现出多态。实现多态中只能对子类重写的方法表现出多态。对于子类自己新增的方法父类的引用并不能调用,但是这时可以对该引用向下转型。

25.编译器之所以强制每个导出类必须调用构造器的原因是一般父类中成员导出类不能访问,只有父类才有权限,为了正确的构造完整的对象。

26.对象构造的顺序:1调用基类的构造器 2 按照声明顺序初始化成员 3 调用导出类构造器的主体。

27.编写构造器的准则:用尽可能简单的方法使对象进入正常状态;如果可以的话,避免调用其他方法。在构造其中唯一能够安全调用的就是基类中final方法或private方法。

28.抽象类是类和接口的一种中庸之道。包含抽象方法的类一定是抽象类,但是抽象类不一定包含抽象方法。

29.接口中的方法默认都是public的,原因在于接口的实现类必须实现,不然默认只有包访问权限,无法去实现对应的方法。接口中的成员变量都是static & final类型的。

30.java中没有任何与接口有关的存储。注意一种特殊的情况,就是当父类和接口有同名的并且同样参数列表的函数,在子类中这个方法是该定义为对父类的覆盖还是对接口的实现?个人理解应该属于接口的实现,但是又实现了父类的覆盖。使用接口的二个原因一是为了可以向上转型为多个基类型,二是为了和抽象类一样创建该类的对象。抽象类和接口的选择看时候需要在该类中给出某个方法的具体实现。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值