- 当某个对象被java虚拟机察觉不会被使用到,该对象就会被标记成可回收的。如果内存开始不足,垃圾收集器就会启动来清理垃圾、回收空间,让空间能够再次被利用。
- 任何变量只要加上public、static和final,基本上都会变成全局变量取用的常数。
- 事实上没有对象变量这样的东西存在,只要引用到对象的变量,对象引用变量保存的是存取对象的方式。
- 数组是个对象,不管里面放的是不是primitive主数据类型。
- java是通过值传递的,也就是通过拷贝传递,方法无法改变调用方所传入的参数。
- 在创建一个类之前我们需要写出下面三种东西:伪码、测试码、真实码。
- 标准版的扩展都以javax作为包名称的开头。
- import和C的include并不相同,运用import只是帮你省下每个类前面的包名称而已。程序不会英文用来import而变大或变慢。
- 抽象类的产生源于有些类不应该被初始化,比如动物类应该是什么?
- 任何从
ArrayList<Object>
取出的东西都会被当作Object类型的引用而不管它原来是什么。而且编译器是根据引用类型来判断哪些方法可以调用,而不是根据Object实际的类型。 - 多重继承会产生“致命方块"问题,即两个及以上的直接父类拥有相同的方法,子类不知道应该调用哪个方法。
- 接口解决致命方块的方法很简单:把全部方法设为抽象的,如此一来,子类就得实现这个此方法,因此java虚拟机在执行期间就不会搞不清楚要用哪一个继承版本。
- 在java中,程序员会在乎内存中的两个区域:对象的生存空间堆(heap)和方法调用及变量的生存空间(stack)。
- 不管对象是否声明或创建,如果局部变量是个对该对象的引用,只有变量本身会放在栈上,对象本身只会存在于堆上。
- 实例变量声明在类中方法之外的地方,局部变量声明在方法或方法的参数上。
- 构造函数在执行的时候,第一件事是去执行它的父类的构造函数,这会连锁反应到Object这个类为止。因为如果我们没有调用super(),编译器会帮我们加上super()的调用。
- 基本数据类型有默认值,而包装类则没有默认值。
- 编译器不会注意RuntimeException类型的异常,它所关心的是称为检查异常的异常。
- 内部类可以使用外部所有的方法和变量,就算是私有的也一样可以使用。
- 如果某实例变量不能或不应该被实例化的,因为有些变量要在执行期当场创建才有意义。这个时候需要把它标记为transient(瞬时)的,transient的引用变量会以null返回,而不管存储当时它的值是什么。恢复时会被赋值为null的对象引用或基本数据类型的默认值。
- 一个不可序列化的父类,其子类可以是可序列化的。
- 解序列化时新的对象会被配置到堆上,但构造函数不会执行,不然会抹去对象的状态。
- 静态变量不会被序列化,因为所有对象都是共享同一份静态变量值。当对象还原时,静态变量会恢复成类中原本的样子,而不是存储时的样子。
- 将FileWriter链接到BufferedWriter可以提升效率,因为BufferedWriter可以暂存一堆数据,然后到满的时候再实际写入键盘,这样可以减少对磁盘的操作。
- File对象代表文件的路径,而不是文件本身。
- 对象的状态并非只能用序列化来存储,也可以使用transient修饰存储。
- java的好处就在于大部分的输入/输出工作并不在乎链接串流的上游实际是什么。也就是说可以使用BufferedReader而不管是来自串流来自文件或socket。
- 调度器在不同的java虚拟机上有不同的做法,就算是同一个程序在同一台机器上运行也会有不同的遭遇。
- 对泛型来说,extends这个关键词代表"是一个......",且适用于类和接口。
- hashcode是用来缩小寻找成本的,但最后还是要用equals()才能认定是否真的找到了相同的项目。如果两个对象有相同的hashcode值,它们不一定是相等的。但若两个对象相等,则hashcode值一定要相等。
- 数组的类型是运行时检查的,但集合的类型检查只会发生在编译期间。
- JAR就是JavaARchive,这种文件是个pkzip格式的文件,它能让你的一组类文件包装起来,所以交付时只需一个JAR文件。
- JWS(Java Web Start)程序由两个部分组成:可执行的JAR文件和.jnlp文件。.jhlp文件是用来描述JWS应用程序的XML文件,它有target指定JAR的名称和位置,以及带有main()的类名称。