您的位置:首页 > 编程语言 > Java开发

JAVA学习之《JAVA核心技术》 学习笔记

2015-08-11 11:29 513 查看
第一章~第三章 基本知识和结构

1、关于可移植性
与 C 和 C++ 不同,Java 规范中没有“依赖具体实现”的地方。基本数据类型的大小以及有关算法都做了明确的说明。

例如,Java 中的 int 永远为 32 位的整数,而在 C/C++ 中,int 可能是 16 位整数、32 位整数,也可能是编译器提供商指定的其他大小。

唯一的限制只是 int 类型的大小不能低于 short int,并且不能高于 long int。

在 Java 中,数据类型具有固定的大小,这消除了代码移植时令人头痛的主要问题。

二进制数据以固定的格式进行存储和传输,消除了字节顺序的困扰。字符串是用标准的 Unicode 格式存储的。

2、Java 成功地推出后不久,微软就发布了一个叫做 J++ 的产品,它与 Java 有相同的编程语言以及虚拟机。

现在,微软不再支持 J++,取而代之的是另一种被称为 C# 的语言。

C# 与 Java 有很多相似之处,然而使用的却是完全不同的虚拟机。甚至还有一种 J#语言可将 J++ 的应用迁移到使用 C# 的虚拟机上。

3、当 applet 首次出现时,人们欣喜若狂。

许多人相信 applet 的魅力将会导致 Java 迅速地流行起来。然而,初期的兴奋很快就淡化了。

不同版本的 Netscape 与 Internet Explorer 运行不同版本的 Java,其中有些早已过时。这种糟糕的情况导致更加难于利用 Java 的最新版本开发 applet。

今天,当需要在浏览器中显示动态效果时,大多数网页都直接使用 JavaScript 或Flash。

另外,Java 已经成为用来开发服务器端应用程序的最流行的语言,使用这些服务器端应用程序可以产生网页、运行后端逻辑。

4、关键字 public 称为访问修饰符(access modifier),它用于控制程序的其他部分对这段代码的访问级别。

5、Java 中定义类名的规则很宽松。

名字必须以字母开头,后面可以跟字母和数字的任意组合。长度基本上没有限制。但是不能使用 Java 保留字(作为类名。

6、从类名 FirstSample 可以看出,标准的命名规范为:

类名是以大写字母开头的名词。如果名字由多个单词组成,每个单词的第一个字母都应该大写

(这种在一个单词中间使用大写字母的方式称为骆驼命名法。以其自身为例,应该写成 CamelCase)。

7、在 Java 中,整型的范围与运行 Java 代码的机器无关。

这就解决了软件从一个平台移植到另一个平台,或者在同一个平台中的不同操作系统之间进行移植给程序员带来的诸多问题。

与此相反,C 和 C++ 程序需要针对不同的处理器选择最为有效的整型,这样就有可能造成一个在 32 位处理器上运行很好的 C 程序在 16 位系统上运行却发生整数溢出。

由于 Java程序必须保证在所有机器上都能够得到相同的运行结果,所以每一种数据类型的取值范围必须固定。

8、从 Java 7 开始,加上前缀 0b 就可以写二进制数。

例如,0b1001 就是 9。另外,同样是从Java 7 开始,还可以为数字字面量加下划线,如用 1_000_000(或 0b1111_0100_0010_0100_0000)

表示一百万。这些下划线只是为了让人更易读。Java 编译器会去除这些下划线。

9、Java 没有任何无符号类型(unsigned)

10、

int 4 字节 - 2 147 483 648 ~ 2 147 483 647(正好超过 20 亿)

short 2 字节 - 32 768 ~ 32 767

long 8 字节 - 9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807

byte 1 字节 - 128 ~ 127

float 4 字节 大约 ±3.402 823 47E + 38F(有效位数为 6 ~ 7 位)

double 8 字节 大约 ±1.797 693 134 862 315 70E + 308(有效位数为 15 位)
11、Unicode 编码单元可以表示为十六进制值,其范围从 \u0000 到 \Uffff。

例如:\u2122 表示注册符号( TM ),\u03C0 表示希腊字母 p。

12、在 Java 中,必须使用 final定义常量。

13、一定不能使用 == 运算符检测两个字符串是否相等!这个运算符只能够确定两个字符串是否放置在同一个位置上。

当然,如果字符串放置在同一个位置上,它们必然相等。

但是,完全有可能将内容相同的多个字符串的拷贝放置在不同的位置上。用使用 equals 方法检测两个字符串是否相等,不区分大小写,可以使用 equalsIgnoreCase 方法

14、首先要检查 str 不为 null。如果在一个 null 值上调用方法,会出现错误。

15、

CodePointString.codePointCount(0,CodePointString.length()); //True Length
CodePointString.length();


16、StringBuffer支持多线程,在单线程下优先使用StringBuilder:

    As of release JDK 5, this class has been supplemented with an equivalent class designed for use by a single thread, StringBuilder. 

    The StringBuilder class should generally be used in preference to this one, as it supports all of the same operations but it is faster, as it performs no synchronization.

17、当使用的类不是定义在基本 java.lang 包中时,一定要使用import 指示字将相应的包加载进来。

如果使用的是lang里面的包,在intellij IDEA 里面,会自动删除这种引用。注意到并不是IDEA出问题,而是它认为这个是默认导入的。

18、与 C++ 不同,Java 没有提供运算符重载功能。程序员无法重定义 + 和 * 运算符,使其应用于 BigInteger 类的 add 和 multiply 运算。

Java 语言的设计者确实为字符串的连接重载了 + 运算符,但没有重载其他的运算符,也没有给 Java 程序员在自己的类中重载运算符的机会。

19、Java 中的 [ ] 运算符被预定义为检查数组边界,而且没有指针运算,即不能通过 a 加1 得到数组的下一个元素。

20、在 Java 应用程序的 main 方法中,程序名并没有存储在 args 数组中。args[0]就是第一个参数。

而 C语言程序的 main 中,程序名是args[0]。注意两种语言的区别。

第四章 对象与类
1、构造器,构造器的名字和类名相同,构造一个类的新对象,如: Date mData = new Date(); 对象也被初始化了。

2、所有的Java对象存储在堆中。

3、new 就是创建一个对象,getInstance是生成一个实例对象,大部分类(非抽象类/接口/屏蔽了constructtor的类)都可以用new来创建一个新对象

     getInstance是少数类拥有的方法,在单实例模式的类中常见,用来生成唯一的实例,getInstance通常是static的。

4、实例域应该标注为private,对它的存取采用get和set的方法来进行。称之为域访问器和域更改器。但是并不是所有的域都需要,视情况而定。

5、如果需要返回一个可变数据域的拷贝,就应该使用clone。
public Date getHireday() {
//        return hireday;
return (Date)hireday.clone();
}

6、方法可以访问所调用对象的私有数据。一个方法可以访问所属类的所有对象的私有数据。

public boolean myEquals(Employees other){
return name.equals(other.name);
}


7、final是指定义的变量是不可变的,比如final String choose = "aaa";之后,就不能使choose指向其他的字符串对象。

另外,final String[] ab = new String[]{"12","23"}; ab 只能指向这个数组,不能被其他变量赋值修改。

!!!但是:ab数组内部的字符串的值是可以改变的。

以下举例:

final String[] ab = new String[]{"12","23"};
ab[1] = "df1";
ab[0] = "df2";  // Can change in this way
String[] b = new String[]{"er1","er2"};
//        ab = b;     // Error for " can not assign a value to final variable 'ab' "


8、static 属于类里面但是不属于任何类对象的变量或者方法,称之为静态变量和静态方法。

尽量使用类名而不是对象(类对象)来调用静态方法。

9、面向对象三大特征:封装、继承、多态;

10、如果类中提供了至少一个构造器,但是没有提供无参数的构造器,则在构造对象时如果没有提供参数就会被视为不合法。

11、jar文件使用ZIP格式组织文件和子目录,可以使用所有zip实用程序查看内部的rt.jar以及其他的JAR文件。

第五章 继承

1、Java中所有的继承都是公有继承,而没有C++里面的私有继承和保护继承

子类继承超类

2、一个对象变量可以指示多种实际类型的现象称为多态。

在运行时能够自动地选择调用哪个方法的现象称为动态绑定。

Managers boss = new Managers("boss",900,2017,7,7);
boss.setBonus(500);

Employees[] stuffs = new Employees[3];
stuffs[0] = boss;
stuffs[1] = new Employees();
stuffs[2] = new Employees("harry",200.999,2016,8,8);

for(Employees e : stuffs){
System.out.println(e.getName()+" : "+e.getSalary());
}


3、方法的名字和参数列表称为方法的签名。返回类型不是签名的一部分。因此在覆盖方法时要保证返回类型的兼容性。

4、final 修饰:不能扩展的类,不能覆盖的方法(final类的方法自动成为final方法,但不包括域)

5、如果方法很简短,被频繁调用且没有被真正的覆盖,那么即时编译器就会将这个方法进行内联处理。

6、ArrayList是一个采用类型参数的泛型类。
/** ArrayList **/
ArrayList<Employees> staffList = new ArrayList<>();

staffList.add(new Employees());
staffList.add(new Employees("harry", 1234.56, 2000, 9, 0));
for(Employees e : staffList){
System.out.println(e.toString());
}
staffList.set(0, new Employees("alter", 234.678, 1027, -1, 8));
for(Employees e : staffList){
System.out.println(e.toString());
}

//Alter ArrayList to Array
Employees[] a_storage = new Employees[staffList.size()];
staffList.toArray(a_storage);
System.out.println(Arrays.toString(a_storage));

第六章  接口与内部类

1、接口中所有的方法都自动地属于public,因此在接口中声明方法时,不必提供关键字public。但是在实现接口时必须把方法声明为public。

2、接口不能含有实例域,也不能在接口中实现方法。

3、java中每个类只能有一个超类,单继承的,但是可以实现多个接口。

第十章 部署应用程序和applet

1、手工打包类程序成为jar包而且可以运行
$ javac HelloWorld.java
$ l
HelloWorld$1TimePrinter.class  HelloWorld.class  HelloWorld.java
$ jar cvf my-clean.jar HelloWorld*.class
已添加清单
正在添加: HelloWorld$1TimePrinter.class(输入 = 979) (输出 = 569)(压缩了 41%)
正在添加: HelloWorld.class(输入 = 847) (输出 = 593)(压缩了 29%)
$ jar ufm my-clean.jar MANIFEST-ADD.MF
$ java -jar my-clean.jar
$ cat MANIFEST-ADD.MF
Main-Class: HelloWorld   //add Manifest

第十一章 异常,断言、日志和调试

1、finally 子句
try{

}
catch{

}
finally{

}

不管异常有没有被捕获,finally子句中的代码都将被执行。

即使try语句中有return表达式。

能确保某一个功能的完成或者是资源的回收。

private static int tryTest() {

try{
return 1;
}
finally {
return 2;
}
}


但是如果finally语句也有异常,那么将覆盖try语句的异常。

带资源的try语句  try(资源语句),可以解决这个问题。

2、启用和禁用断言
assert 5 < 0;
//assert 5 < 0 : "hello";

默认是禁用断言的,

启用断言: 

$ java -enableassertions HelloWorld

或者

$ java -ea HelloWorld

禁用断言:

$ java -da HelloWorld

第十四章  多线程

1、后台线程,间隔心跳似运行。

/** Thread Methods **/
Thread mThread = new Thread(new Runnable() {
@Override
public void run() {
while(true){
System.out.println("HeartBeat~!");

try {
Thread.sleep(500);

//                       while(!Thread.currentThread().isInterrupted()){
//                           System.out.println("Thread is interrupted!");    //  Blocked by sleep
//                       }
} catch (InterruptedException e) {
e.printStackTrace();
}

}
}
});
mThread.start();


2、线程状态:

New,Runable,Blocked,Waiting,Timed waiting,Terminated.

第二卷  

第二章   XML

1、Extensible Markable Language 可扩展标记语言

2、XML文档结构

(1)文档头:

<?xml version="1.0"?> 或者 <?xml version="1.0" encoding="UTF-8"?>   非必须

(2)文档类型定义:(Document Type Definition,DTD) 非必须

如:

<!DOCTYPE ...>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java