本文为对《Java编程思想》一书内容的总结,旨在加深自己对于java语言的特性和语法的了解。
第1章 对象导论接口确定了某一特定对象所能发出的请求。但是,在程序中必须有满足这些请求的代码。这些代码与隐藏的数据一起构成了实现。
Java用三个关键字在类的内部设定边界:public、private、protected。
复用具体实现:可以使用现有的类作为成员合成新的类,这种概念被称为组合。组合反映了"has-a"关系。
继承:Java不支持多继承,只保持单继承。在OOP中,程序采用了后期绑定的概念。当向对象发送消息时,被调用的代码直到运行时才能确定(判断具体是哪个类,基类还是派生类)。
Java将全部对象存储在堆中。每当想要创建新对象时就要使用new关键字来构造此对象的动态实例。(Java依然可以将确定值的简单类型存储在栈上)
在堆上创建对象,编译器就会对它的生命周期一无所知。不过Java提供了”垃圾回收器“来处理这个问题。
Java内置了异常处理,将异常视为一种对象,不会忽略异常。
第2章 一切都是对象Java将一切都视为对象,不过操纵的标志符实际上是对象的一个“引用”。
一旦创建了一个引用,就希望它能与一个新的对象相关联。通常用new操作符来实现这一点。
Java对象存储位置:
栈:储存对象引用和直接简单变量(int、char等且非类成员变量的单独变量)
堆:储存对象
基本类型:boolean、char、byte、double、void等
其并非引用。这个变量直接储存值,放置在栈里。
对象的作用域:引用会随着作用域变化而消失,对象却将始终存在,因此需要垃圾回收器进行处理。回收器监视用new创建的所有对象,并将不会再被引用的对象释放以释放这些对象的内存空间。
名字可见性:java通过包名对不同文件的相同名字函数进行区分
static关键字
当声明一个事物是static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起。所以,即使从未创建过某个类的任何对象,也可以直接通过类名访问其static方法或static域。
例如下面代码StaticTest不需要创建对象就可以直接调用static方法
创建多个对象时也会共享i的值
public class StaticTest {
static int i=47;
static void increment(){
System.out.println("I++");
}
}
public class hello {
public static void main(String[] args){
StaticTest.increment();
}
}
(可以直接System.out.println的原因是java创建项目时默认引入java.lang)
开发时使用javadoc不仅便于其他人接手代码,也可用于生成项目描述文件。
编码规则:首字母大写,多单词连续而无需下划线
第3章 操作符对基本类型的赋值是很简单的。基本类型存储了实际的数值,而并非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到了另一个地方。
对对象赋值的时候,情况发生了变化。对一个对象进行操作时,我们实际操作的是一个引用,因此如果对对象使用"c=d",那么c和d都将指向原本只有d指向的那个对象。
如果想修改对象的值,最好用c.a1=d.a1的形式以避免引用指向对象合一。
--a会先运算再生成值,a--会先生成值在运算。
int i=1; System.out.println(i--); //1 i=1; System.out.println(--i); //0
对于基础变量而言,==和!=比较的是值;对于对象而言,比较的则是对象引用。
如果想要比较对象,注意使用equals()
值得注意的是,string不是基本变量
java所有数据类型在不同机器的大小都是一样的,因此不像C那样需要sizeof()。
第4章 控制执行流程Java并不支持goto语句,不过也有类似的跳转机制,比如continue label; break label等。
java简洁的foreach方法:
for(float f : iterator) {}
第5章 初始化与清理
许多C程序的错误都源于程序员忘记初始化变量。
Java引入了构造器概念。
构造器与类采用相同的名称,可以出现多个。
如果编程人员没有自己声明构造器的话,java会自动生成无参数默认构造器。
与之相似,java也支持通过不同参数列表对函数进行方法重载。
方法内部通过this指向当前对象。
static方法就是没有this的方法,不过static静态方法不应该多次出现。多次出现就需要考虑自己的设计是否合理了。
static变量存储在哪里,垃圾回收机制具体如何,有待后续看Java虚拟机深入理解。
可变参数列表:string... str表示一个长度不定的string iterator(可以理解为数组之类的)。
可以通过enum来更好使用switch等机制。



