21天学通Java6》第121天.docx
- 文档编号:23273557
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:78
- 大小:55.61KB
21天学通Java6》第121天.docx
《21天学通Java6》第121天.docx》由会员分享,可在线阅读,更多相关《21天学通Java6》第121天.docx(78页珍藏版)》请在冰豆网上搜索。
21天学通Java6》第121天
《21天学通Java6》(活动)
第1章Java基础
这一章没什么特别详细的内容,对Java语言和面向对象进行一个简单的介绍。
这是第三版的目录,涉及的内容比我这本第五版要多
唯一需要注意的是类的层次结构问题。
“继承”实现了代码的重(chong)用,我们可以根据需要对其进行扩展(final关键字修饰的类除外)。
超类是对其所有子类公有属性和行为的抽象。
类的对象可以实现同类事物的多样性,而子类是对其超类的扩展。
同一超类的不同分支间的共同属性和行为可以通过接口来进行限定。
覆盖原理:
调用方法的时候,Java解释器是从子类开始往上查找,如果子类中没有找到这个方法,就去查看其上层超类,如果其上层超类中没有这个方法,就去更上层的超类中查找。
所以在子类中定义一组与超类同名(名称,返回值,参数)的方法之后就会覆盖上层超类的同名方法。
简单的总结:
用类来模拟真实的世界的事物(甚至是一些抽象的概念),然后通过传参来实现事物间的交互(你可以在类中定义一些用来接收参数的方法)。
所有类和接口的管理(如分类和访问控制)通过包来进行管理。
顺便说下,当使用继承之后,父类对象和子类对象是两个完全独立的对象,它们在虚拟机上是平等的,没有依赖关系(比如,可以在父类中定义一个私有方法来操作子类。
这在逻辑上似乎说不通,因为,儿子还没生出来怎么能去操作它呢?
情况恰恰就是这样,因为我考虑的是对象间的关系而不是类之间的关系,在对象创建完成之后它们就是相互独立的事物,之间可以进行交互。
父亲可以具有一些儿子所没有的能力:
如,儿子做错了事,父亲可以给与一定的教育。
不过现实中的这种生育关系和面向对象编程(OOP)的继承是有区别的,现实中的父亲和儿子各具特色,是同一层面上的,它们的超类是“人”。
在所有类默认的顶层超类“Object”的源代码中就有这样的代码来处理子类。
知识扩展:
java.lang包是JVM(Java虚拟机)系统自动引入的包(里面的类可以直接使用而无需用import关键字导入),这个包里有3个特殊的类:
Object,Class,ClassLoader。
其中Object是所有类的父类。
ClassLoader用来将类加载到JVM中。
而Class的对象用来描述对象的类型,属性和行为,它在创建对象的时候由JVM通过ClassLoader的defineClass方法自动构造并与此对象绑定,这样就使得每个对象知道自己是什么和能做什么,并且通过反射机制(此技术大家可以另作讨论)来显示出这些描述并进行一些应用。
例如有个特殊用法:
类名·class(如String.class,Integer.class)用来表示此类的类型。
这个特殊用法,我们可以用来比较某一对象是不是我们需要的某类对象,从一系列对象中筛选出这类对象。
以下是一个例子
publicbooleancompare(Classc,Objecto){
booleanbool=false;
//c获取它的名称,o获得其Class对象然后获得它的名称,如果两个名称相同,将bool设置为true
if(c.getName().equals(o.getClass().getName()))bool=true;
returnbool;
}
而用上述方法传参的时候可以这样compare(Integer.class,"冲啊")在此,将返回false,前者为Integer类,后者为字符串
也许有人会问:
用关键字instanceof来判断某对象是不是属于某类不就行了,比如,if(oinstanceofString),但是,如要有必要通过传参来实现这种比较呢,所以这种方法有它的灵活性!
二进制名称:
在帮助文档中的ClassLoader类中会看到这个名词(大概就是通常的符合语法规定的“字符串”)。
网上没找到这个名词的解释,不过在维基百科上有:
二进制文件(Binaryfiles)一般指包含ASCII及扩展ASCII字符中编写的数据或程序指令的文件。
所以我想,这种叫法跟ASCII编码有关系。
第2章Java编程基础
第二章主要内容是基础语法,具体内容大家可以去参考此书目录,在此我不一一列举。
仅对一些新手可能遇到的问题和精华内容作一些说明。
一、Java中以分号(;)标志语句结束,如果在一些莫名其妙的报错可能会是这个原因引起,由于现在IDE(集成开发环境)的语法纠错都比较好,这种错误不容易犯。
不过会有这种情况,由于分号缺少导致的其它语句报错可能会让新手百思不得其解,所以应当注意。
除了以分号结束语句以外,“块”(用一对花括号{}表示)语句也可以成为单独的语句,并且具有局部变量范围的限制(即,块中的变量仅属于此块),也就是说,你在块中定义的变量是不能在外面使用的,所以要在外面使用某个变量,需要在块外表示。
块语句可以出现在任何可以使用单条语句的地方。
以下是一个特例(知识扩展):
static{
//内容
}
这个static块是一个特殊用法,它是在使用类(如,Math.random())或者其对象的时候自动执行。
如使用类变量或类方法(用static关键字定义)的时候或创建对象。
也就是说只要涉及到这个类,这个块就会自动执行。
这种用法一般在JDK类库的底层类的源代码中比较常用,用来注册一些本地代码(用native关键字定义,是用其它语言C,C++等编写)。
对于我们来说一般不会去使用,在此作个了解。
二、单目运算符:
++,--的问题,不论是新手还是老鸟,除非你对此运算符非常熟练(自己用代码测试过多次),应尽量避免在复杂的表达式中使用,因为可能会出现意外的结果。
如果出现这种情况,解决办法是将这个表达式拆成多个语句(分步运算),以对其进行简化。
三、拼接运算符:
+
将数值转换成字符串最简单的办法就是:
””+5
将两个数字拼接起来而不要其执行加号运算:
5+””+6
四、字面量
数字、字符、字符串和布尔值(true和false)都是字面量,另外八进制和十六进制表示的数字也称为字面量。
也就是一眼就能看出它们的内容
指数表示法:
doubley=19E-95;//19乘以10的负95次方
小数点的问题:
.5 //这个“点5”其实就是0.5,前面的0可以省略
默认类型:
整数默认是int,带小数的默认是double。
要将一个超过int类型精度范围的数表示成long就必须在后面加上小l或大L。
最好用大写L,把小l和数字1从视觉上区分开。
五、写注释的习惯
这点特别重要,当你程序代码量越来越大的时候,注释尤为重要。
这既关系到别人阅读你代码的效率,也关系到你自己阅读自己代码并进行debug的效率(分步骤检查),并且会帮助你理清程序的逻辑思路。
在写程序的时候,一般都是将代码进行分步骤书写(比如某段代码合在一起是什么作用),然后把注释写在这段代码的上面。
第3章对象
这一章讲了对象的基本知识,从创建对象,访问和设置类变量和实例变量,调用方法,对象的引用,类型转换,到对象的比较。
Java真的是简单的,因为在这个语言里,一切都是类的对象。
线程(Thread)是类,数据结构是类(如最流行的Vector)我们日常使用的类库的所有东西都是类和接口。
而接口的使用方式在很多方面跟类是相似的。
很多Java程序员说到类时,常常指的是“类或接口”。
因此,用从一开始就用面向对象的思维方式去学习也是必须掌握的方法。
当你创建自己的类时,就要把你的程序抽象成一个个独立的事物并能与外界交互。
当你掌握了类的使用以及对象与对象之间的交互,那么剩下的只是对类库的熟悉而已了。
你可以根据自己的方向去选择自己所需要使用的类(它们会给你提供很多方便),然后开始创建自己需要的类,书写自己程序。
一、创建对象
new是一个神奇的关键字,它能创造我们所需要的事物。
使用new后会有两个关键步骤:
为实例分配内存,实例化完毕之后就会调用构造方法。
也就是说构造方法时对象创建过程的最后一步(即使你没有定义构造方法,系统会自动隐式的调用空构造方法,更详细的内容在第5章)
补充:
Java中的对象是在堆(Heap)中分配内存空间,而基本数据类型以及对象的“引用”是分配到栈(stack)上。
创建对象其实有很多方法,具体的方法我会在2楼进行整理。
二、内存管理
Java中的内存管理是动态的,自动的。
你不必显式的去分配内存,也不需要自己去释放内存。
在某些类中(比如流和组件方面),你可以间接的通过调用方法来释放资源,这常常是必要。
三、类变量-类方法和实例变量-实例方法
类变量-类方法是属于整个类的,而不是属于某个对象。
它们由关键字static定义,在程序编译时就可以确定它们所需的内存空间,并且它们的内存分配方式也有些不一样。
String.valueOf()就是一个调用静态方法的例子。
注:
修改类变量的值会影响所有该类对象。
实例变量-实例方法是属于对象的,包含在对象独自的内存空间。
调用方法和变量都是用点(.)运算符:
有返回值的方法,打点调用之后把它看成一个整体,可以继续在后面打点调用其方法。
System.out.println();就是一个典型的例子,其中out是一个静态对象,属于类PrintStream,是一个输出流对象。
四、类型转换
基本数据类型:
低精度可以直接向高精度转换,比如int类型赋值给long类型。
基本数据类型可以“封装”成对象,比如Integerk=newInteger(15);
而要拆封装可以调用方法inta=k.intValue();
对于那些自动封装和拆封装的情况将在2楼讨论。
对象间的转换:
要注意的就是两个对象间必须具有父子关系,并且,子类转换成父类之后,对象不变,也就是内存空间不变。
这时新的引用不能调用子类专有的方法和变量。
而父类转换成子类之后就等于是进行了扩展(对象和接口的转换问题到第6章时讨论)
五、对象的比较,判断其所属类
“==”是用来比较基本数据类型的,所以如果把对象的引用放上去,那木就是比较对象的内存首地址是否一样。
从这里可以看出:
对象的引用实际上是个“基本类型”,代表对象的内存首地址。
关键字instaceof(如kinstaceofInteger)左边是对象的引用,右边是类名。
使用这个关键字有两层意思,1:
告诉你这个对象是不是属于这个类或其子类。
2:
如果是,那么就可以进行强制转换。
说简单点就是告诉你能不能进行强转。
第4章数组、逻辑和循环
基本内容大家自己去找资料看,以下我都是对此书内容的扩展。
数组
数组是一种最简单的容器类。
与它绑定的Class对象是由Java根据需要自动创建。
如果数组元素为基本类型,那么“此基本数据类型数组没有类加载器(ClassLoader)”。
使它在执行上更接近于基本数据类型。
这也是数组的执行速率优于其它容器的重要原因之一。
缺点:
1.本身缺少操作其元素的方法(只有一个很简单的接口)
2.长度固定,因此无法在不确定存储数量的范围时定义数组
3.元素容易被更改,无法像其它集合框架那样可以根据需要控制其元素是否允许被替换
优点:
1.其执行速度比java.util包中的任何容器速度更快
2.存入基本数据类型时无需将其包装成对象
利用数组的执行速度:
在你不知道要存入多少元素时,可以先用ArrayList(可变数组)进行存储,然后转存到一个数组中:
importjava.io.*;
importjava.util.*;
publicclassTest{
publicstaticvoidmai(String[]args){
//创建File对象,代表当前文件夹中的obj文件夹下的double.dat
Filefile=newFile(“obj\\double.dat”);
//创建文件输入流,然后交给数据输入流
DataInputStreaminput=newDataInputStream(newFileInputStream(file));
//以字节为单位,返回文件的长度(long类型),然后转成int并赋值给length
intlength=(int)file.length();
//如果长度不是8字节的整数倍,抛出IO异常
if(lenth%8!
=0)
thrownewIOException(“文件损坏!
”);
//得到文件的字节数
intnumRecords=lenth/8;
//创建可变数组对象并转换成List接口(仅以接口方式使用对象)
Listlist=newArraList();
//返回输入流的下8个字节的double值→封装成Double对象→加入可变数组
for(inti=0;i list.add(newDouble(input.readDouble())); //得到可变数组的长度→创建数组 double[]values=newdouble[list.size()]; //将可变数组将可变数组交给迭代器(接口Iterator) Iteratoritrator=list.iterator(); //初始化下标变量 intindex=0; //如果可变数组还有有元素,就把下个元素转回Double类型并提取其double值,然后赋值给数组元素 while(iterator.hasNext()) values[index++]=((Double)iterator.next()).doubleValue(); } } 对于对象数组,有必要说明的是,它内存空间里面存储的实际上是一系列到这些对象的“引用”,将这个元素赋值给其它引用,传递的其实只是引用,而不是复制这个对象。 第5章创建类和方法 这章讲了类的基本语法,讲的都是基础语法,我暂时没想到该讲什么好。 所以,贴点书上代码上来,并附以注释供新手参考。 之前我写的一些内容由于写得还比较乱,暂时保留另作它用。 ------------------------------------------------------------------------- classRangeLister{ //此方法的作用是: 通过参数传入一个下限值(lower)和一个上限值(upper) //然后返回lower<=值<=upper之间的所有整数的数组 int[]makeRange(intlower,intupper){ int[]range=newint[(upper-lower)+1];//这里加1是必要的 for(inti=0;i range=lower++; } returnrange; } //主方法 publicstaticvoidmain(String[]arguments){ int[]range; RangeListerlister=newRangeLister(); range=lister.makeRange(4,13); System.out.println("Thearray: ["); for(inti=0;i System.out.print(range+""); } System.out.println("]"); } } ------------------------------------------------------------------------- classPasser{ //此方法将字符串数组的所有字符串统一成大写 void toUpperCase(String[]text){ for(inti=0;i //这里赋值是必须的,虽然String是对象,但是它是不变的,这个方法将产生新的字符串 text=text.toUpperCase(); } } //主方法 publicstaticvoidmain(String[]arguments){ Passerpasser=newPasser(); passer.toUpperCase(arguments);//将命令行输入的参数传递给方法 for(inti=0;i System.out.print(arguments+""); } System.out.println();//最后换一次行(这步在这里可以不必) } } ------------------------------------------------------------------------- classCircle{ //坐标和半径(此类没写主方法) intx,y,radius; //构造方法一 Circle(intxPoint,intyPoint,intradiusLength){ //由于参数名和实例属性没有同名,所以this可以去掉 this.x=xPoint; this.y=yPoint; this.radius=radiusLength; } //构造方法二 Circle(intxPoint,intyPoint){ //用this来引用本类的其它构造方法,以提高代码的重用。 基础类中的方法重载常用这种方式 //注: this()方法只能用在构造方法中 this(xPoint,yPoint,1);//这里默认创建一个半径为1的虚拟圆(因为这个类只有圆的属性) } } 第6章包、接口和其他类特性 类用于创建对象。 初学者先把类的基本语法了解清楚,然后就是熟练传参。 传参是对象间的交流。 熟练以上知识之后,接下来,这一章简单讲了如何去组织和管理你的多个类。 Java语言提供了4种访问控制: 公有、私有、受保护和默认(不适用限定符)。 给变量和方法设定访问控制。 这就是封装: 对象控制外部世界对它的了解程度,以及如何与它进行交互。 封装的意义(个人总结,高手们多发表下意见) 1、防止类中的变量和方法被其它类以非法的方式使用。 2、减少程序员在开发大型程序中犯错的机率,并缩小dubug的范围。 3、有利于程序员间的分工,提高代码的重用性。 外部接口: public定义的变量和方法称为外部接口,通过它们来实现封装后的类与外界的交互。 说明: 使用JDK命令行的新手,在你的硬盘中创建文件夹结构: 示例D: \myshop\org\cadenhead\ecommerce\ 然后将D: \myshop加入环境变量classpath。 将后两个类放入这个目录。 含有主方法的类不能放在你import的目录中。 ---------------------------------------------------------------------------------------------------------------------------------------------------- importorg.cadenhead.ecommerce.*; publicclassGiftShop{ publicstaticvoidmain(String[]args){ //创建商店库 Storefrontstore=newStorefront(); //添加商品 store.addItem("C01","MUG","9.99","150"); store.addItem("C02","LGMUG","12.99","82"); store.addItem("C03","MOUSEPAD","10.49","800"); store.addItem("D01","TSHIRT","16.99","90"); //按销售价格排序 store.sort(); //循环显示商品信息 for(inti=0;i //从链表中获取Item对象 Itemshow=(Item)store.getItem(i); System.out.println("\nItemID: "+show.getId()+ "\nName: "+show.getName()+ "\nRetailPrice: $"+show.getRetail()+ "\nPrice: $"+show.getPrice()+ "\nQuantity: "+show.getQuantity()); } } } 代码: packageorg.cadenhead.ecommerce; import
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 21 天学通 Java6 121