Java编程思想读书笔记
此笔记仅仅是作者的阅读此书时,发现自己错误认识和不牢固的知识,用来完善作者的知识框架,其列出重点不具有参考性,代码也是为了省工作量,简写代码,能看懂即可,语法并不规范
第一章 对象导论
第二章 一切都是对象
2.1 用引用操控对象
在java
语言中操作内存的方式是通过“引用”,因为java中一切可以看做对象,而操作对象只需要对象的一个引用。
例如
String s
为 String的引用
**注意:**它只是一个地址,并没有分配任何的存储空间,所以现在向s发送信息(调用 s )会出现空指针错误。
因此安全的做法是在创建这个引用是同时为它初始化
String s = "aadf";
String的初始化可以通过 “字符串” 来实现,还有其他的基本数据类型初始化方式也是不相同的,这是Java语言的一个特性,但是一般对象的初始化不是这样的。
2.2 必须由你创建对象
通过new
关键字来创建对象,new可以理解为“给我一个新的对象”。
通常我们创建一个引用就得和一个对象关联起来。这时候通过new出一个对象就可以和引用关联起来。
例如:
Stirng s = new String("aadf");
new 不仅表示给我一个新的字符串,也给出了如何产出这个字符串的信息(String("aadf")为构造方法
)。
构造方法后边会涉及到,现在看不懂可以略过,只要记住 这个语句会有什么信息即可。
2.2.1 对象存储到什么地方
在计算机中有地方可以存储数据分别是 寄存器、堆栈、堆、常量存储、非RAM存储
**寄存器:**位于处理器内部、数量少,是最快的存储器,不能直接控制,俗称内存。
**堆栈:位于通用RAM(随机访问存储器)中,读取速度仅次于寄存器,可以用堆栈指针进行控制。 堆栈指针向下移动分配内存,向上移动释放内存。通常存储一些对象的引用,**但是对象 不存放在这里。
**堆:**一种通用内存池,位于RAM区 ,用于存储所有的Java对象,当 new 一个对象时,会自动在 堆中进行存储分配,编译的时候编译器不需要知道存储的数据需要存活多长时间,会有 Java的垃圾处理机制去处理一些不需要用的对象。
**常量存储:**常量值直接放在代码块中,他们永远不会被改变,这样做非常安全。
非RAM存储:主要是对数据的存储,数据的持久化和持久化对象。 JDBC
2.2.2 基本数据类型
有一些基本类型的对象是非常小的简单的变量,这些对象存放在堆中往往效率不是很高,所以把这些基本类型的对象存放在堆栈中。基本类型对象的不用new关键字来声明。
基本数据类型
基本类型 | 大小 | 最小值 | 最大值 | 包装器类型 |
---|---|---|---|---|
boolean | - | - | - | Boolean |
char | 16-bit | Unicode o | Unicode 2^16 -1 | Character |
byte | 8 bits | -128 | +127 | Byte |
short | 16 bits | -2^15 | +2^15 -1 | Short |
int | 32 bits | -2^31 | +2^31 -1 | Integer |
long | 64 bits | -2^63 | +2^63 -1 | Long |
float | 32 bits | IEEE754 | IEEE754 | Float |
double | 64 bits | IEEE754 | IEEE754 | Double |
void | - | - | - | Void |
基本类型创建对象和初始化的方法:
例如:
boolean b = true;
// boolean类型所占的空间大小没有给出,所以只取字面值 true和false
int i = 1;
chart c = 'a';
double = 3.14;
每个类型都用它们对应的包装器类型,这可以让基本类型的对象通过包装器类型创建在堆中,来表示对应的基本类型。
例如:
char c = 'x';
Character ch = new Character(c);
//也可以这样用
Character ch = new Character('x');
//java 5开发的自动装包功能,基本类型和对应的包装类型可以互相转换
Character ch = 'x';
char c = ch;
高精度数字
Java中提供了两个高精度计算的类,他们属于包装类,但是没有对应的基本类型,不过包含的方法和操作与对基本类型所执行的操作相似
BigInteger 支持任意精度的整数,在运算中可以准确表示任意大小的整数值,而不会丢失信息
BigDecimal 支持任意精度的定点数,
Java数组
创建一个Java数组对象其实是创建了一个引用,并且引用的默认值为null
2.3 永远不要销毁一个对象
作用域
Java的作用域是用{}的位置决定的,基本类型只能再其作用域中调用,而对象直至销毁才消失,但是对象的引用只能在作用域中有效。
例如:
{
String s = new Stirng("a string");
}
//当出了{}的作用域,s引用就无效了,但是 new String()的这个对象不会消失还存在堆中。
2.4 创建新的数据类型:类
通过 class
关键字创建新的数据类型:‘类’ ,一个类通常包含字段和方法
字段可以是基本类型,也可以是其他自定义的类,通过new
关键字可以创建这个类的对象。
每个对象都有存储字段的空间,普通字段不能再对象间共享
对象访问成员属性的方法 “对象名.属性名”
例如:
Class Hhh {
int i;
}
Hhh data = new Hhh();
data.i //访问对象的属性i
基本成员的默认值
若类的某个成员为基本数据类型,即使没有被初始化,Java也会给一个默认值,但是不适用与局部变量,局部变量必须初始化。
基本类型 | 默认值 |
---|---|
boolean | false |
char | ‘\uoooo’(null) |
byte | (byte)0 |
short | (short)0 |
int | 0 |
long | 0L |
double | 0.0f |
2.5方法、参数和返回值
方法的基本组成包括:名称、参数、返回值、和方法体。返回类型描述的是在调用方法后返回的值。参数列表给出了要传给方法的信息的类型和名称。Java中方法通过对象来调用。
方法名和参数列表唯一地标识出某个方法
ReturnType methodNmae(/*Argument list*/){
/*Method Body*/
}
int x = a.f();
通过a对象调用f()方法,把返回值传给x;这种行为叫做发送消息给对象, 消息是f(),对象是a
f()的返回类型必须是 int 类型
int storage(String s){
return s.length() * 2;
}
return关键字的作用:
1.此方法已经执行完,要离开此方法
2.返回 return关键字后面的数据
2.6 构建一个Java程序
2.6.1 名字可见性
Java中采用域名反转的方式来避免命名冲突。
import
关键字来导入一个包,也就是类库
2.6.3 static关键字
在Java中只有通过new创建对象才能分配存储空间,调用方法,这样两个问题解决不了,
- 只想为某特定域分配单一存储空间,而不考虑要创建多少个对象
- 希望某个方法不于包含他的类的任何对象关联在一起,也就是说即使没创建这个对象也能调用方法
通过static关键字就可以实现这两个需要。
当声明一个事物是static时,就意味着这个域或方法不会与包含他的那个类的任何对象关联在一起
类方法:带有static关键字的方法
类数据:带有static关键字的成员变量
其可以通过类名直接调用,也可以通过对象调用
class StaticTest{
static int i = 47;
static void test(){
}
}
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
st1.i=10; //通过对象名调用静态成员
StaticTest.test(); //通过类名调用静态方法
注意在这里st1.i 和st2.i指向的是同一个存储空间,这也就是static关键字开辟出来的空间它是唯一的,无论创建多少个对象,它都是唯一的。
2.7 你的第一个Java程序
java.lang
是一个特定的包,它会被自动导入每一个Java文件中
2.7.1 编译和运行
想要编译和运行Java程序就必须需要Java开发环境 也就是JDK,切记安装完后要配置环境变量
2.8 注释和嵌入式文档
Java有两种注释风格:多行注释和单行注释
/*
*多行注释
*
*/
//单行注释
2.8.1注释文档
Java通过javadoc
作为提取注释的工具,它采用就Java编译器的某些技术,查找程序内的特殊注释标签,不仅解析由这些标签标记的信息,也将毗邻注释的类名或方法抽取出来,生成注释文档。
2.8.2 语法
javadoc
命令只能在 /**注释中出现 以 */结尾,使用方式有两种:嵌入HTML或者使用文档标签,独立文档标签:以@字符开头,且要位于注释最前面,行内文档标签 则可以出现在javadoc
注释的任何地方,也是以@开头 但要在{}中。
注意javadoc
注释只能为public 和protected 成员进行文档注释。private 不进行提取
2.8.4 常用标签示例
/**
*@author
*@param
*@return
*/
其他看书 34页
2.9 编码风格
类采用大驼峰式:所有单词首字母大写
变量和方法采用小驼峰式:第一个单词小写,其余单词首字母大写
第三章 操作符
3.4.1 方法中别名的问题
class Letter{
char c;
}
public class PassObject{
static void f(Letter y){
y.c ='z';
}
public static void main (String[] args){
Letter x = nwe Letter();
x.c = 'a';
print(x.c); //结果为 a
f(x);
print(x.c); // 结果为 z
}
}
在调用方法时,给方法传递参数只是传递了 对象的一个引用 x ,也就是执行了这个操作
y = x;
所以 到了方法里面y操作的还是具体的 Letter 对象 ,将其改变也就把原来的值给抹去了。