基础班其实知识都挺基础的,给了零基础的一个缓冲时间。我自己也趁着这点时间看了点纸质资料并且也整理了一点点觉得重要的;下面就附上我看的《java核心技术I卷》的一点笔记。第一章 Java白皮书 1.java“白皮书”关键术语 1)简单性:一方面是C++的“纯净版”,另一方面是小 2)面向对象:一种程序设计技术;将重点放在数据(对象)和对象的接口上, 3)分布式:java应用程序能够通过URL打开和访问网络上的对象,便捷程度如同访问本地文件 4)健壮性:java设计目标之一;与C++最大的不同在于java采用的指针模型可以消除重写内存和损坏数据的可能性 5)安全性 6)体系结构中立:java编译器通过生成与特定计算机系统结构无关的字节码指令来实现;字节码可以很容易地在任何机器上解释执行,还可以动态地翻译成本地机器代码 7)可移植性:基本数据类型以及运算都有明确的说明不可改变;作为系统组成的部分类库,定义了可移植的接口 8)解释型:java解释器可以在任何移植了解释器的机器上执行Java字节码 9)高性能:字节码可以在运行时刻动态地翻译成对应运行这个应用的特定CPU的机器码 10)多线程:通过时间切割 11)动态性:库中可以自由地添加新方法和实例变量,而对客户端却没有任何影响 第二章 初窥Java程序 1.java简单程序解析 关键字public:称为访问修饰符,修饰符用于控制程序的其他部分对这段代码的访问级别,修饰类时可以被任意的类使用 Private定义的部分只能被定义他们的类使用 默认的修饰符可以被同一个包中的所有方法调用 关键字class:表明java程序中的全部内容都包含在类中。类相当于一个加载程序逻辑的容器,程序逻辑定义了应用程序的行为 类名:大驼峰规则命名(程序设计中所有的命名规则区分大小写);源代码的文件名必须与公共类的名字相同,并用.java作为扩展名 main方法:JVM将从指定类中的main方法开始执行,因此为了代码能够执行,在类的源文件中必须包含一个main方法。Java中的所有函数都属于某个类的方法。因此Java中的main方法必须有一个外壳类。Java中的main方法必须是静态的 System.out.println:使用了System.out对象并调用了println方法。Java的通用语法是:object.method(parameters);等价于方法的调用。 还有一个print方法输出不换行 数据类型:基本类型,引用类型(C中的指针) 第三章 基础语法 变量声明:尽可能的靠近变量的第一次使用的地方,这是一种良好的编程风格 常量:在Java中,常量使用final修饰,只能被赋值一次,习惯上常量名用全大写; 类常量:希望在一个类的多个方法中使用该常量,可以用static final设置一个类常量;需要注意的是:类常量需要定义在main方法的外部;如果一个类常量被定义为public则其他类也可以使用(与C++区别,constant是java的保留关键字,但是并没有使用,在java中必须使用final) 运算符:需要注意的是整数被0整除时会产生一个异常,而浮点数被0除时会得到无穷大或者NAN Math类中包含了各种数学函数;采用静态方法处理的不是对象 字符串的比较:一定不要使用==运算符检测两个字符串是否相等!这个运算符只能确定两个字符串是否放置在同一个位置上 空串与null串:空串””是长度为0的字符创;String变量可以存放一个特殊的的值(null),这表示目前没有任何对象与该变量关联if(str == null)检测是否为null,if(str.length != 0)检测是否为空串。如果在一个null值上调用方法会出现错误。 当使用的类不是定义在基本的java.lang中时,一定要使用import将相应的包加载进来。 格式化输出沿用了C语言库函数中的printf方法(如System.out.printf(”%8.2f”,x) 小数点也计算在8位里面) 可以使用静态的String.format 方法创建一个格式化的字符串, 而不打印输出: String message = String.format ("Hello, %s.Next year , you'll be %d", name , age) ; 不能在嵌套的两个块中声明同名的变量。例如,下面的代码就有错误,而无法通过编译: public static void main(String口args) { int n; ... int k; int n; // Error can't redefine n in inner block } } 警告: 在循环中,检测两个浮点数是否相等需要格外小心。下面的for 循环for (double x= 0; x != 10; x += 0 . 1) . . .可能永远不会结束。由于舍入的误差, 最终可能得不到精确值。例如, 在上面的循环中, 因为0.1 无法精确地用二进制表示, 所以,x 将从9.999 999 999 999 98 跳到10.099 999 999 999 98。 当在for 语句的第1 部分中声明了一个变量之后,这个变量的作用域就为for 循环的整个循环体。特别指出, 如果在for 语句内部定义一个变量, 这个变量就不能在循环体之外使用。因此, 如果希望在for 循环体之外使用循环计数器的最终值, 就要确保这个变量在循环语句的前面且在外部声明! 第四章 类 要想使用OOP, —定要清楚对象的三个主要特性: •对象的行为(behavior)—可以对对象施加哪些操作, 或可以对对象施加哪些方法? •对象的状态(state )—当施加那些方法时,对象如何响应? •对象标识(identity )—如何辨别具有相同行为与状态的不同对象? 一定要认识到: 一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。 在Java 中,任何对象变量的值都是对存储在另外一个地方的一个对象的引用。new 操作符的返回值也是一个引用。 局部变量不会自动地初始化为null,而必须通过调用new 或将它们设置为null 进行初始化。 所有的Java 对象都存储在堆中。当一个对象包含另一个对象变量时, 这个变量依然包含着指向另一个堆对象的指针。 Java中, 必须使用clone 方法获得对象的完整拷贝 警告: 注意不要编写返回引用可变对象的访问器方法。如果需要返回一个可变对象的引用, 应该首先对它进行克隆( clone )。对象clone 是指存放在另一个位置上的对象副本。 final关键字修饰引用时,对象引用不会再指向其他对象,但是内容可以改变 static:属于类且不属于类对象的变量和函数,区别于C++ 静态变量:它属于类,而不属于任何独立的对象。在绝大多数的面向对象程序设计语言中, 静态变量被称为类变量。术语“ static” 只是沿用了C++ 的叫法, 并无实际意义。相反实例变量,每一个类对象都有自己的一份拷贝。 静态方法是一种不能向对象实施操作的方法。例如, Math 类的pow 方法就是一个静态方法。表达式Math.pow(x, a)(x的次幂),在运算时,不使用任何Math 对象。换句话说,没有隐式的参数。可以认为静态方法是没有this参数的方法(在一非静态方法的方法中,this参数表示这个方法的隐式参数)。 在下面两种情况下使用静态方法: 1.一个方法不需要访问对象状态,其所需参数都是通过显式参数提供 2.一个方法只需要访问类的静态变量 工厂方法:静态方法的另外一种常见用途;通常情形为:一方面无法命名构造方法,另一方面是当使用构造方法时,无法改变构造对象类型。 这是成员变量与局部变量的主要不同点。必须明确地初始化方法中的局部变量。但是,如果没有初始化类中的成员变量, 将会被自动初始化为默认值( 0、false 或null )。 成员变量初始化的三种方法:其一,通过构造函数;其二,在声明中赋值;其三,通过初始化块 this引用的两种用法:this引用相当于C++的this指针,引用方法时this()将调用同一类的另一个构造函数(多态中) 包:使用包的原因是确保类名的唯一性;从编译器的角度看,嵌套包之间没有任何关系;一个类可以使用所属包中的所有类,以及其他包的共有类(public class);一个类使用共有类两种方式:一是在类之前加完整的包名(在类名有冲突时使用,如Date类在两个公共包中都有对应的存在),而是在类之前import; 类的设计几点简单技巧: 1. 一定要保证数据私有这是最重要的;绝对不要破坏封装性。有时候,需要编写一个访问器方法或更改器方法,但是最好还是保持实例域的私有性 2. 一定要对数据初始化。 Java 不对局部变量进行初始化, 但是会对对象的成员变量进行初始化。最好不要依赖于系统的默认值, 而是应该显式地初始化所有的数据, 具体的初始化方式可以是提供默认值, 也可以是在所有构造器中设置默认值;依赖系统的默认值可能出现null调用 3. 不要在类中使用过多的基本类型 就是说,用其他的类代替多个相关的基本类型的使用。这样会使类更加易于理解且易于修改。例如, 用一个称为Address 的新的类替换一个Customer 类中以下的实例域: private String street; private String city; private String state; private int zip; 这样, 可以很容易处理地址的变化, 例如, 需要增加对国际地址的处理。 4. 不是所有的成员变量都需要独立的成员变量访问器和成员变量更改器。在有些对象中,常常包含一些不希望别人获得或设置的成员变量 5. 将职责过多的类进行分解;这样说似乎有点含糊不清, 究竟多少算是“ 过多” ? 每个人的看法不同。但是, 如果明显地可以将一个复杂的类分解成两个更为简单的类,就应该将其分解(但另一方面, 也不要走极端。设计10 个类,每个类只有一个方法,显然有些矫枉过正了)。 6. 类名和方法名要能够体现它们的职责 与变量应该有一个能够反映其含义的名字一样, 类也应该如此(在标准类库中, 也存在着一些含义不明确的例子, 如: Date 类实际上是一个用于描述时间的类)。命名类名的良好习惯是采用一个名词( Order )、前面有形容词修饰的名词( RushOrder)或动名词(有“ -ing” 后缀)修饰名词(例如, BillingAddress )。对于方法来说,习惯是访问器方法用小写get 开头( getSalary ), 更改器方法用小写的set 开头(setSalary ) 7. 优先使用不可变的类 LocalDate 类以及java.time 包中的其他类是不可变的—没有方法能修改对象的状态。类似plusDays 的方法并不是更改对象,而是返回状态已修改的新对象。 更改对象的问题在于, 如果多个线程试图同时更新一个对象, 就会发生并发更改。其结果是不可预料的。如果类是不可变的,就可以安全地在多个线程间共享其对象。 因此, 要尽可能让类是不可变的, 这是一个很好的想法。对于表示值的类, 如一个字符串或一个时间点,这尤其容易。计算会生成新值, 而不是更新原来的值。当然,并不是所有类都应当是不可变的。 第五章 继承 继承( inheritance )。利用继承,人们可以基于已存在的类构造一个新类。继承已存在的类就是复用(继承)这些类的方法和成员变量。在此基础上,还可以添加一些新的方法和成员变量, 以满足新的需求。Is-a关系的两个类。 Java 与C++ 定义继承类的方式十分相似。Java 用关键字extends 代替了C++中的冒号(:)。在Java 中, 所有的继承都是公有继承, 而没有C++ 中的私有继承和保护继承. 父类并不优于子类或者拥有比子类更多的功能。实际上恰恰相反,子类比超类拥有的功能更加丰富。 在通过扩展超类定义子类的时候, 仅需要指出子类与超类的不同之处。因此在设计类的时候,应该将通用的方法放在超类中, 而将具有特殊用途的方法放在子类中,这种将通用的功能放到超类的做法,在面向对象程序设计中十分普遍 Super关键字:虽然子类继承了父类的成员变量、成员方法;但是每个具体子类都会有自己的一份成员变量;子类的方法并不能直接访问父类的私有成员;父类中的私有成员只有自己的方法才能直接访问;如果子类一定要访问父类的私有成员,就必须通过共有的接口;则我们应该具体指出调用的是子类方法还是父类方法;super则是解决这个问题的关键字。 有些人认为super 与this 引用是类似的概念, 实际上, 这样比较并不太恰当。这是因为super 不是一个对象的引用, 不能将super 赋给另一个对象变量, 它只是一个指示编译器调用超类方法的特殊关键字 在子类中可以增加域、增加方法或覆盖超类的方法, 然而绝对不能删除继承的任何域和方法。 子类构造方法,因为子类不能直接访问父类的私有成员,所以必须利用父类的构造方法对父类这部分私有成员进行初始化;我们可以使用super实现对父类构造方法的调用(super(…))。 如果子类的构造方法没有显式地调用父类的构造方法, 则将自动地调用超类默认(没有参数)的构造器。如果超类没有不带参数的构造器, 并且在子类的构造器中又没有显式地调用超类的其他构造器,则Java 编译器将报告错误。 调用构造器的语句只能作为另一个构造器的第一条语句出现。构造参数既可以传递给本类( this ) 的其他构造器, 也可以传递给超类(super ) 的构造器 一个对象变量(例如, 变量e ) 可以指示多种实际类型的现象被称为多态( polymorphism)。在运行时能够自动地选择调用哪个方法的现象称为动态绑定( dynamic binding)。在Java 中, 不需要将方法声明为虚拟方法。动态绑定是默认的处理方式。如果不希望让一个方法具有虚拟特征, 可以将它标记为final(该方法不能被重写)。 Java 不支持多继承。Java多继承通过接口实现。 在继承中,is-a的关系表明了子类的对象也是父类的对象;换言之则是置换法则,它表明程序出现父类对象的任何地方都可以使用子类对象置换。因此在Java中,子类数组的引用可以转换成超类数组的引用,而不需要采用强制类型转换,这种应用可能会导致出现不存在的实例域;为了确保不发生这类错误,所有数组都要牢记创建他们的元素类型,并负责监督仅将类型兼容的引用存储到数组中。
|