Java编程思想读书笔记.docx
- 文档编号:2785560
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:114
- 大小:48.84KB
Java编程思想读书笔记.docx
《Java编程思想读书笔记.docx》由会员分享,可在线阅读,更多相关《Java编程思想读书笔记.docx(114页珍藏版)》请在冰点文库上搜索。
Java编程思想读书笔记
Java编程思想读书笔记-1(第5-7章)
作者:
未知时间:
2005-07-2421:
15出处:
JR责编:
MyFAQ
摘要:
Java编程思想读书笔记-1(第5-7章)
第2章万事万物皆对象
一.所有对象都必须由你建立
1.存储在哪里
1.寄存器:
我们在程序中无法控制
2.stack:
存放基本类型的数据和对象的reference,但对象本身不存放在stack中
,而是存放在Heap中
3.Heap:
存放用new产生的数据
4.Staticstorage:
存放在对象中用static定义的静态成员
5.Constantstorage:
存放常量
6.NON-RAM:
硬盘等永久存储空间
2.特例:
基本型别
基本类型数据存放在Stack中,存放的是数据。
而产生对象时,只把对象的
reference存放在stack中,用于指向某个对象,对象本身存放在Heap中。
3.Java中的数组
当你产生某个存储对象的数组时,真正产生的其实是存储reference的数组。
引
数组建立后,其中的每一个reference都会被自动设为null,表示“不指向任何对
象”。
二.建立新的数据型别:
Class
1.数据成员和函数
1.1基本成员的缺省值
1)当class的某个成员属于基本型别时,即使你没有为它提供初值,Java仍保
证它有一个缺省值。
2)只有当变量身份是“class内的成员时,Java才保证为该变量提供初值。
三.函数(Mehtods),引数(arguments),返回值(returnvalues)
1.引数列
当引数传递的是对象时,传递的是对象的reference。
四.注解用内嵌式文档
Java提供两种注解风格:
/*XXXX*/、//XXXX
第3章控制程序流程
一.使用Java运算符
1.关系运算符
1.)当对两个对象运用关系运算符进行比较时,比较的是objectreference,如:
java/lang/Integer.java.html"target="_blank">Integern1=new
java/lang/Integer.java.html"target="_blank">Integer(3);
java/lang/Integer.java.html"target="_blank">Integern2=new
java/lang/Integer.java.html"target="_blank">Integer(3);
java/lang/System.java.html"target="_blank">System.out.println(n1==n2);
结果为false,因为两个objectreference(n1和n2)值是不同的
2)quals()的缺省行为也是拿referenct来比较。
不过Java中的class覆写了equals方
法,如:
java/lang/Integer.java.html"target="_blank">Integern1=new
java/lang/Integer.java.html"target="_blank">Integer(3);
java/lang/Integer.java.html"target="_blank">Integern2=new
java/lang/Integer.java.html"target="_blank">Integer(3);
java/lang/System.java.html"target="_blank">System.out.println(n1.quals(n2));//值为
true
2.逻辑运算符
1)只能将and、or、not施用于boolean值身上。
如果逻辑运算符两边的值存在
non-boolean值,将会出错,如:
inttest1=1;
java/lang/System.java.html"target="_blank">System.out.println((test&&1<2);//编
辑出错,test是non-boolean值
3.位移运算符
如果所操作的位移对象是char、byte、short,位移动作发生之前,其值会先被
晋升为int,运算结果会是int。
二.流程控制
1.迭代(iteration)
1.1逗号运算符
逗号运算符只能用于for循环的控制表达式中的initialization和step两部分中,如
:
for(inti=0,j=I+1;I<5;i++,j=I*2)
1.2break和continue
break表示退出循环;continue表示退出本次循环,回来循环起始位置。
1.3label
label只有放在迭代语句之前才起作用,在label和迭代语句之间插入任何语句都
不会起作用。
2.Switch
switch中的选择器必须是int或char型,如:
floati=2;
switch(i)//将出错,因为i不是int或char之一
3.计算细节
1)从float或double转为整数值,总是以完全舍弃小数的方式进行。
4.Math.random()的输出范围是[0,1]。
第4章初始化和清理
一.以构造函数(constructor)确保初始化的进行
如果某个class具备构造函数,Java便会在对象生成之际,使用者有能力加以操
作之前,自动调用其构造函数,于是便能名确保初始化动作一定被执行。
二.函数重载(Methodoverloading)
1.区分重载函数
由于只能从函数名和函数的引数列来区分两个函数,而重载函数具有相同的函
数名称,所以每个重载函数都必须具备独一无二的引数列。
2.Default构造函数
1)default构造函数是一种不带任何引数的构造函数。
如果你所开发的class不
具任何构造函数,编译器会自动为你生成一个default构造函数。
2)如果你自行定义了任何一个构造函数(不论有无引数),编译器就不会为
你生成default构造函数。
3)如果定义了一个class,如
classBush{
Bush(intI){}
}
当想用newBush();来产生class的实例时,会产生错误。
因为在定义class时已定
义了构造函数,所以编译器就不会为class生成default构造函数。
当我们用new
Bush()来产生实例时,会尝试调用default构造函数,但在class中没有default构造
函数,所以会出错。
如:
classSundae
{
Sundae(inti){}
}
publicclassIceCream
{
publicstaticvoidmain(java/lang/String.java.html"target="_blank">String[]args)
{
//Sundaex=newSundae();会编译出错,无构造函数Sundae()
Sundaey=newSundae
(1);
}
}
*:
在定义一个class时,如果定义了自己的构造函数,最好同时定义一个
default构造函数
3.关键字this
1)this仅用于函数之内,能取得“唤起此一函数“的那个objectreference。
2)在构造函数中,通过this可以调用同一class中别的构造函数,如
publicclassFlower{
Flower(intpetals){}
Flower(java/lang/String.java.html"target="_blank">Stringss){}
Flower(intpetals,Stingss){
//petals++;调用另一个构造函数的语句必须在最起始的位置
this(petals);
//this(ss);会产生错误,因为在一个构造函数中只能调用一个构造函数
}
}
**:
1)在构造调用另一个构造函数,调用动作必须置于最起始的位置
2)不能在构造函数以外的任何函数内调用构造函数
3)在一个构造函数内只能调用一个构造函数
4.Static的意义
无法在static函数中调用non-static函数(反向可行)。
为什么不能呢,我们看下
面的例子。
例4.2.4.1
假设能在static函数中调用non-static函数,那么(a)处就将出错。
因为在没有
产生Movieclass实例之前,在就不存在Movieclass内的name实例,而在getName
()中却要使用name实例,显然的错误的。
classMovie{
java/lang/String.java.html"target="_blank">Stringname=“”;
Movie(){}
publicMovie(java/lang/String.java.html"target="_blank">Stringname){this.name
=name;}
publicstaticjava/lang/String.java.html"target="_blank">StringgetName(){return
name;}
}
publicclassTest{
publicstaticvoidmain(java/lang/String.java.html"target="_blank">String[]args){
//下面两名先产生实例后再调用getName()没有问题
//Moviemovie1=newMovie(“movie1”);
//Stringname1=movie1.getName();
//下面一名将出错
//Stringname2=Movie.getname();(a)
}
}
三.清理(cleanup):
终结(finalization)与垃圾回收(garbagecollection)
1)你的对象可能不会被回收
只有当程序不够内存时,垃圾回收器才会启动去回收不再被使用的对象的内存
空间。
某个对象所占用的空间可能永远不会被释放掉,因为你的程序可能永远
不会逼近内存用完的那一刻,而垃圾回收器完全没有被启动以释放你的对象所
占据的内存,那些空间便会在程序终止时才一次归还给操作系统
3)只有在采用原生函数(nativemethods)时,才使用finalize()。
四.成员初始化(memberinitialization)
1)函数中的变量不会被自动初始化,如
voidf(){
inti;
i++;
}
将发生编译错误,因为i没有被初始化。
2)class的数据成员会被自动初始化,具体情况如下(见P220例子):
基本型别:
boolean:
false、char:
null(\u0000)、byte:
0、short:
0、int:
0、
long:
0、float:
0、double:
0
对象(reference):
null
1.初始化次序
1)所有变量一定会在任何一个函数(甚至是构造函数)被调用之前完成初始
化(见P233例子)
2)在产生一个class的对象(包含static成员的class的代码被装载)时,首先自
动初始化class中的static成员变量,再执行所有出现于static数据定义处的初始化
动作,最后执行staticblock,所有这些初始化操作只在第一次生成该对象时进
行。
3)自动初始化class中的其它成员变量。
4)执行所有出现于数据定义处的初始化动作。
如:
inti=1;的执行顺序是先
把I自动初始化为0,再执行数据定义处的初始化动作,初始化为1。
5)执行non-staticblock
6)调用构造函数。
例:
classCup{
Cup(intmarker){
java/lang/System.java.html"target="_blank">System.out.println("Cup("+marker
+")");
}
voidf(intmarker){
java/lang/System.java.html"target="_blank">System.out.println("f("+marker+
")");
}
}
classCups{
staticCupc1=newCup(11);
staticCupc2;
Cupc3=newCup(33);
Cupc4;
{
c3=newCup(3);
c4=newCup(4);
}
static{
c1=newCup
(1);
c2=newCup
(2);
}
Cups(){
java/lang/System.java.html"target="_blank">System.out.println("Cups()");
}
}
publicclassExplicitStatic{
publicstaticvoidmain(java/lang/String.java.html"target="_blank">String[]args){
java/lang/System.java.html"target="_blank">System.out.println("Insidemain()");
Cups.c1.f(99);
}
staticCupsx=newCups();
staticCupsy=newCups();
}
结果为:
Cup(11)
Cup
(1)
Cup
(2)
Cup(33)
Cup(3)
Cup(4)
Cups()
Cup(33)
Cup(3)
Cup(4)
Cups()
Insidemain()
f(99)
2.Array的初始化
1)定义数组时不能指定大小。
如int[4]iArr={0,1,2,3};,由于指定了数组的
大小,会编译出错。
2)数组只是存放reference的数组。
Array与non-array的结构图如下:
a)对于基本型别数据,存放的是数据。
如
inti=5;
b)对于class变量,存放的是reference,这个reference指向一个存有class实例的内
存空间。
如
java/lang/String.java.html"target="_blank">Strings=“hello”;
变量s存放的是一个reference,这个reference指向一个存有String实例的内存空间
。
c)对于基本型别数组,存放的是reference数组,数组中的每一个reference都指
向一个class实例的内存空间。
如
int[]ia={10,11,12};
数组ia存放的是一个reference数组,数组中的每一个reference都指向一个的int实
例的内存空间。
d)对于class数组,存放的是reference数组,数组中的每一个reference都指向一
个的class实例的内存空间。
如
java/lang/String.java.html"target="_blank">String[]sa={“hello1”,“hello2”,“
hello3”};
数组sa存放的是一个reference数组,数组中的每一个reference都指向一个的String
实例的内存空间。
3)任何数组都要进行初始化,使用没有进行初始化的数组会产生运行时错误
,如:
int[]iArr;
java/lang/System.java.html"target="_blank">System.out.pritnln(iArr[0]);//产生错误
,因为iArr还未初始化
数组初始化可在任何地方,可用以下方法来对数组进行初始化:
a)int[]iArr={1,1,1,1};//数组的长度为{}元素的个数
b)inti=10;
int[]iArr=newint;//数组的长度可为变量(这在C/C++中不行)
java/lang/System.java.html"target="_blank">System.out.println(iArr[0]);//iArr[0]是
一个int,自动初始化值为0
java/lang/Integer.java.html"target="_blank">Integer[]iArr2=new
java/lang/Integer.java.html"target="_blank">Integer;
java/lang/System.java.html"target="_blank">System.out.println(iArr2[0]);//iArr[0]是
一个reference,自动初始为null
I)对于基本型别数组,new产生的是用于存放数据的数组;否则,产生的只
是存放reference的数组。
II)new可用来初始化基本型别的数组,但不能产生non-array的 基本型别
数据。
c)int[]iArr=newint[]{1,1,1,1};
java/lang/Integer.java.html"target="_blank">Integer[]iArr2=new
java/lang/Integer.java.html"target="_blank">Integer[]{new
java/lang/Integer.java.html"target="_blank">Integer
(1),new
java/lang/Integer.java.html"target="_blank">Integer
(2)};
3.多维数组(Multidimensional)arrays
多维数组每一维的大小可以不一样,如:
java/lang/Integer.java.html"target="_blank">Integer[][][]a5;
a5=newjava/lang/Integer.java.html"target="_blank">Integer[3];
for(inti=0;i a5=newjava/lang/Integer.java.html"target="_blank">Integer[i+1]; for(intj=0;j a5[j]=newjava/lang/Integer.java.html"target="_blank">Integer[i+j+1]; 第5章隐藏实现细节 一.Java访问权限饰词(accessspecifiers) Java有public、protect、friendly、private四种访问权限,并且这四访问权限的访 问范围越来越小。 1.friendly 1)果一个class内的数据成员或方法没有任何权限饰词,那么它的缺省访问权 限就是friendly。 同一个package内的其它所有classes都可以访问friendly成员,但 对package以外的classes则形同private。 2) 对于同一个文件夹下的、没有用package的classes,Java会自动将这些 classes初见为隶属于该目录的defaultpackage,可以相互调用class中的friendly成 员。 如以下两个class分别在同一个文件夹的两个文件中,虽然没有引入package ,但隶属于相同的defaultpackage。 classSundae{ //以下两个方法缺省为friendly Sundae(){} java/lang/Void.java.html"target="_blank">Voidf(){java/lang/System.java.html" target="_blank">System.out.println(“Sundae.f()”); } publicclassIceCream{ publicstaticvoidmain(java/lang/String.java.html"target="_blank">String[] args){ Sundaex=newSundae(); x.f(); } } 2.public: 可以被任何class调用 3.private: private成员只能在成员所属的class内被调用,如: classSundae{ privateSundae(){}//只能在Sundaeclass中被调用 Sundae(inti){} staticSundaemakASundae(){ returnnewSundae(); } } publicclassIceCream{ publicstaticvoidmain(java/lang/String.java.html"target="_blank">String[]args){ //Sundaeclass中构造函数Sundae()是private, //所以不能用它进行初始化 //Sundaex=newSundae(); Sundaey=newSundae (1);//Sundae(int)是friendly,可以在此调用 Sundaez=Sundae.makASundae(); } } 4.protected: 具有friendly访问权限的同时,又能被subclass(当然包括子孙类 ,即子类的子类)所访问。 即,既能被同一package中的classes访问,又能被 protected成员所在class的subclass访问。 二.Class的访问权限 1.Class同样具有public、protect、friendly、private四种访问访问权限: 1)public: 在任何地方都可被使用 2)protect、private: 除了它自己,没有任何class可以使用,所以class不能是 protected或private(innerclass除外) 3)friendly: 同一个package中的classes能用 2.如何调用构造函数被声明为private的class
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 编程 思想 读书笔记