一、 java的基本程序设计结构
(一) java共有8种基本类型:4种整型,2种浮点类型,1种char,1种boolean。
1) 4种整型:byte(1)、short(2)、int(4)、long(8)。
2) int最常用,byte和short常用在底层的文件处理或者需要控制占用存储空间量的大数组。
3) 浮点类型:float(4)、double(8)。Float后缀F,不加后缀默认为double(D)。
4) char类型表示单个字符,通常用来表示字符常量。
5) boolean类型有两个值:false、true。
(二) 声明一个变量之后,必须用赋值语句对变量进行显式初始化,千万不要使用未初始化的变量。
(三) 关键词final表示该变量只能被赋值一次。一旦赋值,不可更改。在Java中,经常用final来定义类常量,这样,可以使该常量在一个类中的多个方法中使用。
(四) 正数被0除将会产生异常,浮点数被0除将会得到无穷大或NaN。
(五) 字符串的不可变性有一个优点:可以让字符串共享。
(六) 检测字符串是否相等使用equals而不用==。后者要求两个字符串的存放地址必须也相同。
(七) 输入输出例子:
(八) While循环语句首先检测循环条件,因此循环体中的代码可能不被执行。如果希望循环体至少执行一次,则应该将检测条件放在最后,使用do..while.
(九) case标签可以是:类型为char、byte、short、int的常量表达式;枚举常量;
1) 从Java7开始,case可以支持字符串字面量。
2) 如果case分支语句的末尾没有break,那么会接着执行下一个分支语句。
(十) 中断控制流程语句:break、continue。
(十一) 数组
1) 创建一个数组时,所有元素初始化为0;
2) boolean数组元素初始化为false。
3) 对象数组元素初始化为null(表示这些元素未存放任何对象)。
4) Arrays.sort()可以对数组进行快速排序。
二、 对象与类
(一) 类之间最常见的关系:
1) 依赖(uses-a):A类的方法操纵B类的对象(B类的对象是A类的方法的入参),则A类依赖B类。
2) 聚合(has-a):A类的对象包含B类的对象(B对象是A的成员变量)。
3) 继承(is-a):A继承自B,A is a B。
(二) 要想使用对象,就必须首先构造对象,并制定其初始状态。然后对对象应用方法。
1) 使用构造器构造新实例。
(三) 一个对象变量只是引用一个对象,而不是包含一个对象。
1) 如:Date deadline = new Date(); new Date()构造了一个Date类型的对象,该对象的值是一个引用该对象的地址,而这个地址存放在变量deadline中。
2) 如果一个对象为null,就等于没有指向任何对象,就不能调用该对象的任何方法。比如:
Brithday birth = null;
birth.toString();
这样会报错。
(四) 在一个源文件中,只可以有一个公共类,可以有多个非公共类。
1) 比如,EmployeeTest.java除了一个公共类EmployeeTest(包含main方法)之外,还有一个非公共类Employee。
2) 当编译这段源代码时,编译器会在目录下创建两个类文件:EmployeeTest.class和Employee.class。
3) 然后将程序中包含main方法的类名(EmployeeTest)提供给字节码解释器,以便启动该程序:java EmployeeTest
(五) 关于构造器
1) 构造器与类同名。
2) 每个类可以有一个以上的构造器。
3) 构造器可以有多个参数。
4) 构造器没有返回值。
5) 构造器总是伴随着new操作一起调用。
(六) 在每一个方法中,关键词this表示隐式参数,表示当前对象实例。比如:
public void raiseSalary(double percent){
double raise = this.salary +percent;
this.salary +=raise;
}
而percent就是显式参数。
(七) 如果一个类有final实例变量,那么初始化该类时必须初始化该变量。即:必须确保在每一个构造器执行之后,该变量的值被设置,并且在后续操作中不能够对它再修改。
(八) final修饰符大都应用于基本类型变量或者不可变类型的变量(如果类中的每一个方法都不会改变其对象,这种类就是不可变的类。例如String类。)
(九) 静态变量属于类,不属于任何对象。比如:
每一个Test对象拥有自己的size变量,但是无论新建多少对象,它们共享age变量。
(十) System.out就是一个使用静态变量的例子。
(十一) 按值调用表示方法提供的是调用者提供的值。按引用调用表示方法接收的是调用者提供的变量地址。Java总是采用按值调用。
1) 很多人根据下面的例子得出结论:Java对对象的传递采用按地址调用,因为调用函数后,对象的属性值发生了变化:
实际上,49行的方法的引用x只是harry的一个拷贝,此时,x和harry都是一个数值,该数值都等于Employee对象指向的地址。即:x和harry同时指向Employee对象的地址。你改变了对象的属性,但x、harry各自代表的那个地址数值并没有发生改变。
2) 通过下例来说明Java对对象采用的也是按值传递:
swap方法对x、y进行置换,导致x和y引用的地址发生了变化。但是a、b没有发生任何变化。
(十二) 如果多个方法有相同的名字、不同的参数,便发生了重载。
1) 要完整的描述一个方法,需要指出方法名以及参数类型。这叫做方法的签名。
2) 返回值类型不是方法签名的一部分。也就是说,不能有两个名字相同、参数类型也相同却返回不同类型值得方法。下面的写法错误:
(十三) 如果在编写一个类时没有编写构造器,那么系统就会提供一个无参构造器。这个构造器将所有的实例域(成员变量)设置为默认值。于是,实例域的数值数据设置为0、布尔型数据设置为false、所有对象变量设置为null。(仅当类没有提供任何构造器的时候,系统才会提供一个默认的构造器。)
(十四) 关键词this的双重意义:
1) 首先,this引用方法的隐式参数(即,一个函数除了多个入参外,还有一个没有写出的this参数,该参数总是指向当前调用该方法的对象实例。)
2) 第二个,如果构造器的第一个语句形如:this(…),这个构造器将调用同一个类的另一个构造器。