20145306张文锦

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

20145306 《Java程序设计》第3周学习总结

教材学习内容总结

第四章和第五章是java程序设计的核心知识。内容更为复杂抽象难懂。在看完课本内容的同时也要书上代码自己写一遍,多次的学习,使自己对代码有更深刻的了解。

例如书上的例子: class clothes { String color; char size;} new clothes(); clothes c1; clothes c1=new clothes(); 用class关键词来定义类,例如课本上的例子:名称是 clothes。在建立衣服实例要用new关键词。对象与实例在java中几乎是等义的名词。在clothes类中定义了color与size两个变量,叫作定义两个值域成员,这将表示每个新建的clothes实例可以拥有各自的size与color数据成员。 只要有一个类定义,编译程序就会产生一个.class文档。一个.java 文档中可以同时定义多个类,但只有一个公开类,并且公开类名称必须与主文档名称相同。如果想在建立对象时,一并进行某个初始流程,像是指定数据成员值,则可以定义构造函数。构造函数是与类名称同名的方法。当参数color与数据成员color同名时,可以写this color=color,来进行初始化数据成员。这表示将color参数的值指定给这个对象的color成员。

javaSE提供了标准API,这些API就是由许多类组成的。我们可以直接取用这些标准类,省去撰写程序时重新打造基础的需求。书上介绍了两个标准类:java.util.Scanner与java.math.BigDecimal。使用java.util.Scanner类使变量的值可以由用户输入。Scanner的nextInt()方法会看看标准输入中,有没有输入下一个字符串,有的话则将之剖析为int型,Scanner对于每个基本类型,都会有个对应的nextxxx()方法,如nextbyte(),nextchar()...  直接取得上一个字符串,则可以用next(),使用nextline()可以取的用户输入的一整行字符。习惯上,包名称为java开头的类,表示标准API提供的类。由于java遵守IEEE754浮点数运算规范 1.0—0.8=0.2答案则是0.199999999996。因为使用分数与指数来表示浮点数导致计算结果不是0.2。如果要求精度,那就要小心使用浮点数,而且别用==直接比较浮点数运算结果。可以用java.math.BigDecimal类,它能有效解决浮点数计算和比较时的误差问题。equals()是比较两个BigDecimal实质上是否相同,这个类中还有许多方法。当=用于基本类型时,是将值复制给变量,当==用于基本类型时,是比较两个变量储存的值是否相同。如果你在操作对象,=是用在指定参考名称参考某个对象,而==是用在比较两个参考名称是否参考至同一对象。若想比较两个类的内容是否相同可以使用用equals()。 1.打包基本类型

使用Long、Integer、Double等来打包基本类型。这些就是所谓的打包器。这些类主要目的就是提供对象实例作为“壳”,将基本类型打包在对象之中,这样就可以操作这个对象,就像是将基本类型当成对象操作。从J2SE5.0之后提供了自动装箱功能。可以这样打包基本类型:Integer wrapper=10。自动装箱与拆箱的功能事实上是编译程序蜜糖,也就是编译程序让你撰写程序时吃点甜头,编译时期根据所撰写的语法,决定是否进行装箱与拆箱动作。编译程序蜜糖虽然提供了方便性,但也因此隐藏了一些细节。我们可以通过反编译后的程序代码来观察更多语法蜜糖的细节。

数组基础 数组在java中就是对象,使用int[]声明,各个数组空间都给予索引编号,索引由0开始。使用for循环可以依次访问数组成员。数组的length属性可以取得数组长度,也就是数组的元素个数。一维数组使用一个索引存取数组元素,也可以声明二维数组,二维数组使用两个索引存取数组元素。增强式for循环(程序蜜糖)在程序中会显得比较简洁。如果不知道元素值,只知道元素个数,可以使用new关键词指定长度来建立数组。例如预先建立长度为10的数组: int[] scores =new int[20]。使用java.util.Arrays的fill()方法可以设定新建数组的原始值。int[][] cords=new int[2][3],在某些书籍里的说法是,这建立了2X3的数组,每个索引都是默认值,但这只是简化的说法,这个语法实际上建立了一个int[][]类型的对象,里面有两个int[]类型的索引,分别是参考长度为3的一维数组对象,初始值都是0。如果将int[] []中的int[]看作一个整体,将其视为一个类X,实际上是在声明X的一维数组,也就是X[],java中的多维数组基本上都是由一维数组组成的。当然没有人规定二维数组一定要是矩阵,你也可以建立不规则数组。例如书上101页的例子,范例中 new int[2] []仅提供了第一个[]的数值,这表示arr参考的对象会有两个索引,但暂时参考到null。 Integer[] scores=new Integer[3];这个程序片段里建立的Integer对象数为0!,因为如果是类类型,这个片段的写法建立的数组,每个索引都是参考至null!int[] scores1={88,81,74,68,78,76,77,85,95,93};int[] scores2 = scores1; 在类类型中,这是代表将scores1参考的数组对象与scores2参考对象相同,而不是数组的复制。如果要实现数组复制的功能,先建立一个与scores1相同的新数组,再逐一访问scores1每个索引元素,并指定给scores2对应的索引位置。也可以使用System.arraycopy()和Arrays.copyOf()方法。System .arraycopy()还是Arrays.copyOf(),用在类类型声明的数组时都是浅层复制。浅层复制:将A所参考的对象,也给B参考,并没有实际复制对象。深层复制:就是在实际上A索引参考的对象会被复制,指定给B索引。

字符串对象 在java中,字符串本质是打包字符数组的对象,是java.lang.String类的实例。我们可以使用+运算来连接字符串.在java中以“”包括的字符串,只要内容相同,无论在程序代码中出现几次JVM都只会建立一个String实例,并在字符串池中维护。使用equals()比较字符串实际字符内容是否相同。字符串对象一旦建立,无法更改对象中的内容。使用+连接字符串,会变成建立java.lang.StringBuilder对象,使用其append()方法来进行+左右两边字符串附加,最后再转换为toString()返回。java支持Unicode,所以写下一个英文字符或写下一个汉字字符,都是双字节。JVM在加载.class之后,就是读取Unicode编码并产生对应的字符串对象,而不是最初在原始码中写下的内容。

第五章

结合书上范例,在CashCard类中,定义了store(),charge(),exchange()方法。在类中定义方法如果不用返回值,方法名称前可以声明void。即使改变了store()流程,CashCard用户也无需修改程序。方法要求返回值,须在方法前声明返回值的类型。在java的命名习惯中,方法名称首字母是小写。 在java中可以使用private关键字定义。如果没有提供方法存取private成员,那用户就不能存取。在CashCard的例子中,如果想修改balance或bonus,就一定得通过store()、charge()、exchange()等方法,也就是说一定要通过你定义的流程。除非你愿意提供方法,让用户可以取得number、balance、bonus的值,否则用户一定无法取得。基于你的意愿,CashCard类上定义了getNumber()、getBalance()、getBonus()等取值方法。取值方法的名称形式是固定的,也就是以get开头,之后接上首字母大写的单词。所以你封装了什么?封装了类私有数据,让用户无法直接存取,而必须通过你提供的操作方法,经过你定义的流程才有可能存取私有数据。 public权限修 如果想在其他包的类程序代码中存取某包的类或对象成员,则该类或对象成员一定是公开成员,在java中要使用public加以声明!这表示它是个公开类,可以在其它包的类中调用。没有定义任何权限关键字的时候,就是包权限。在java中其实有private、protected与public三个权限修饰。如果类上没有声明public权限关键字,类中的方法声明就算是public,也等于是包权限。 关于构造函数 在定义类时,可以使用构造函数定义对象建立的初始流程。视使用情景或条件的不同,创建对象时也许希望有对应的初始流程。可以定义多个构造函数,只要参数类型或个数不同,这称为重载构造函数。定义方法时也可以进行重载,可为类似功能的方法提供统一名称,但根据参数类型或个数的不同调用对应的方法。比如以String类为例,其valueOf()方法就提供了多个版本,但根据传递的自变量类型不同,会调用对应的方法。 static类成员 被声明为static的成员属于类。我们也是通过类名称与“.”运算符,就可以取得static成员。我们一直在用的System.in与System.out中的in与out都是static成员。 不定长度自变量 在调用方法时,若方法的自变量个数事先无法决定该如何处理,在JDK5之后就可以用不定长度自变量来解决这个问题。要使用不定长度自变量,声明参数列时要在类型关键字后加上...,实际上不定长度自变量是编译程序蜜糖。方法上声明的不定长度参数必须是参数列最后一个,使用两个以上不定长度自变量也是不合法的。 7.内部类 可以在类中再定义类,这称为内部类。内部类可以定义在类区块中。要使用some中的other类,必须先建立some实例,内部类也可以使用public、protected、private声明。内部类本身可以存取外部类的成员,通常非静态内部类会声明为private,这类内部类是辅助类中某些操作而设计的,外部不用知道内部类的存在。内部类也可以声明为static。一个被声明为static的内部类,通常是将外部类当作名称空间。被声明为static的内部类,虽然将外部类当作名称空间,但算是个独立类,它可以独立存取外部类static成员,但不可存取外部类非static成员。

教材学习中的问题和解决过程

代码会马上托管在git@osc上。

posted on 2016-03-20 13:51  20145306张文锦  阅读(123)  评论(2编辑  收藏  举报