糊里糊涂地用了Java快三年多了,一直没有很系统地读过一本Java的经典书籍。借到一本<<Core Java ,8th>>,记下来自己在里面领悟到的细节点滴。
1. 抽奖程序算法。
很简单的一个应用,由于抽奖的结果不能出现重复。以前会每次来查看Math.Random()的结果是不是在已经抽出的列表中,如果有的话重新抽一次。看到书中巧妙的实现,很灵活。记录如下:
//抽奖的样本总量数组
int[] numers=new int[allSeek];
for(int i=0;i<numers.length;i++){
numers[i]=i+1;
}
//抽奖得到的结果存储数组
int[] result=new int[pickerSeek];
for(int i=0;i<result.length;i++){
//随机抽取
int r=(int)(Math.random()*allSeek);
//存储抽奖结果
result[i]=numers[r];
//由于已经抽出一个,下次抽奖的问题将减一,将当前被抽出的位置的样本用样本问题中的最后一个样本值替换
numers[r]=numers[allSeek-1];
//抽奖样本问题减一
allSeek--;
}
2. 封装中访问器的实现
特别注意不应该编写返回引用可变对象的访问器方法。这样的话会破坏类的封装性。如下代码
class Person{
private Date birthday;
public Date getBirthday(){
return this.birthday;
}
}
初步来看的话,是没有问题的,但如果使用以下代码来访问:
Person p1=new Person();
Date birthday=p1.getBirthday();
birthday.setTime(birthday.getTime()-1);
此时,在我们去访问p1.getBirthday()时就会发现当前的birthday发生了变化。这是因为birthday与p1.birthday引用的是同一个可变对象。所以,我们如果需要返回一个可变对象的引用 ,就应用首先对它进行克隆(clone),如下代码:
class Person{
private Date birthday;
public Date getBirthday(){
return (Date)this.birthday.clone();
}
}
3. 基于类的访问权限
我们知道,方法可以访问所调用对象的私有数据。一个方法可以访问所属类的所有对象的私有数据,这点有点拗口,看下面的代码。
class Person{
private String name;
public boolean equals(Person otherPerson){
return this.name.equals(otherPerson.name);
}
}
代码没什么问题,我们在使用中的一种典型的使用形式如下:
if(zhangsan.equals(boss)){
//zhangsan's name is the same as boss
}
我们类方法中的代码在访问zhangsan的私有域name时没有问题。但是,它还访问了boss的私有域,有点奇怪。但这是合法的,它的原因是boss是Person类的对象,而Person类的方法可以访问Person类的任何一个对象 的私有域。
4. Java程序设计语言总是采用值调用。
这也就是说,方法得到的是所有参数值 的一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容。如下:
- 一个方法不能修改一个基本数据类型的参数
- 一个方法可以改变一个对象参数的状态
- 一个方法不能实现 让对象参数引用 一个新的对象
对于第三点,我们用下面的代码来说明:
public class Person{
private String name;
public Person(String name){
this.name=name;
}
public String getName(){
return this.name;
}
public static void swap ( Person p1, Person p2){
Person temp=p1;
p1=p2;
p2=temp;
}
public static void main(String[] args){
Person p1=new Person("zhangsan");
Person p2=new Person("lisi");
Person.swap(p1,p2);
System.out.println(p1.getName()+","+p2.getName());
}
}
上面代码的执行结果:
zhangsan,lisi
这是因为,在static方法中的参数p1与p2被初始化为两个对象引用的拷贝,这个方法交换的是两个拷贝。在方法执行完毕后,参数变量p1与p2都被垃圾回收器给回收了。原来的变量p1与p2仍然引用 的是方法调用之前引用的对象。
5. final的用法
通常,我们将final关键字应用于局部变量,实例变量及静态变量。在所有这些情况下,它们的全部定义都是:在创建这个变量之后,只能够为其赋值一次。此后,再也不能修改它的值了。
注意两点:
- 局部类的方法只可以引用 定义为final的局部变量。这就是为什么我们在局部类中引用外部类的一些方法参数时,必须将相应的参数的修饰符改为final
- 有时候 ,final限制显得并不太方便,如我们想更新在一个封闭作用域内的计数器。这里想要统计一下在排序过程中调用 compareTo方法的次数,如下代码所示:
int counter=0;
Date[] dates=new Date[100];
for(int i=0;i<dates.length;i++){
dates[i]=new Date(){
public int compareTo(Date other){
counter++; //Error
return super.compareTo(other);
}
};
}
Array.sort(dates);
System.out.println(counter+" comparisons.");
由于我们很清楚地知道counter需要更新,所以不能将counter声明为final。由于Integer对象是不可变的,所以也不能用Integer代替它。所以,我们应该使用一个长度为1的数组,代码如下:
final int[] counter=new int[1];
Date[] dates=new Date[100];
for(int i=0;i<dates.length;i++){
dates[i]=new Date(){
public int compareTo(Date other){
counter[0]++;
return super.compareTo(other);
}
};
}
Array.sort(dates);
System.out.println(counter[0]+" comparisons.");
在此,数组变量仍然被声明为final,但是这仅仅表示 不可以让它引用 另外一个数组。数组中的数据元素可以自由地更改。
分享到:
相关推荐
当年如猪八戒吃人生果般的读了java编程思想,只是知道这是本好书,但是具体细节,真是不知所云,很多都是工作中用到哪些,然后翻《think in java 》和《core java》,有了这么多实际java编程经验之后,再翻这部著作...
1. Aa在重读闭音节中通常发/æ/的音,如在"cat"中。 2. Uu在重读闭音节中通常发/ʌ/的音,如在"but"中。 3. Oo在重读闭音节中通常发/ɒ/的音,如在"box"中。 4. Ii在重读闭音节中通常发/ɪ/的音,如在"bit"中。 5. ...
1. 当虚词或be动词在句子中起到强调作用时,例如"We saw him playing by the river"中的"we"和"him",如果要强调是由"我们"而不是其他人看到,可以重读"we"。 2. 位于句首的介词通常要重读,如"On my way to school,...
英语发音规则(重读音节和非重读音节).pdf
在英语发音中,音节划分和元音字母在重读及非重读音节中的发音是关键要素。音节是英语单词发音的基本单位,它由一个或多个字母组成,其中至少包含一个元音。理解这一概念有助于准确地读出单词,并且在口语中表达清晰...
这篇文档实际上是一篇以“重读冰心,感受母爱”为主题的作文,而非与IT行业相关的知识内容。文章通过描述作者对冰心作品的理解,尤其是冰心对母爱的赞美,来表达作者对母爱的深刻感悟和个人经历。母爱在文中被视为最...
重读南京百科知识竞赛题及答案.doc
1. 在非重读音节中,元音字母通常会简化发音。例如,"China"和"another"中的"a"发[ ]音,"orange"和"village"中的"e"发[i]音,"chicken"和"pocket"中的"i"可能发[i]或[ ]音,"second"和"tonight"中的"o"发[ ]音,...
1. 双音节词的重读规则: a) 大多数双音节词的第一个音节重读,如 "letter"、"sorry"。 b) 带有特定前缀的词,如 "a-", "be-", "de-" 等,第二个音节通常重读,例如 "a'bout", "be'lieve"。 c) 一些词根据前缀和...
它是一种深度阅读的方式,让人们有机会更深入地理解文本,发现以前未曾留意的细节,甚至改变对故事或主题的理解。例如,随着人生经历的丰富,我们对角色的选择、作者的观点可能会有不同的看法,这使得每次重读都是一...
音节划分元音字母在重读非重读中发音.ppt
Java8处理List的双层循环问题 Java8处理List的双层循环问题是Java开发中常见的问题之一。在处理List的双层循环时,通常是当两个List中的某个值满足某条件时,进行相应的处理。这种情况下,我们可以使用Java8中的...
【音节划分与音节重读】是英语学习中的重要概念,主要涉及到单词发音的准确性。音节划分是将单词分解成若干个发音单位,每个单位由一个或多个字母组成,至少包含一个元音字母。以下是对音节划分规则的详细解释: 1....
由于提供的文件内容为乱码,并且文件标题为"消费行业四大行业消费趋势电·重读消费者.pdf",但无法从乱码内容中提取实际信息,我将基于文件的标题和描述来猜测内容,并生成相关知识点。 【标题】"消费行业四大行业...
在英语学习中,音节划分、重读规则和读音规则是至关重要的基础部分,它们直接影响到单词的发音和语句的理解。以下是对这些规则的详细解释: 首先,我们来看单词的重读规则: 1. 双音节词: a) 通常第一个音节重读...
在教师资格证初中英语语音试讲中,重点是教授如何理解和使用正确的语音技巧,特别是重读和语调。试讲稿中的内容展示了一个日常生活场景,爷爷找不到他的眼镜,请求孙女李兰帮忙,但因为听力问题,他们之间发生了一些...
【开音节与重读音节】 在英语发音中,开音节是一个重要的概念,它涉及到单词中的元音字母如何发音。开音节是指以一个元音字母结尾,且这个元音字母在其后没有受到其他辅音字母的影响,能够自由地发出其基本音,也...
"英语音节重读规则" 英语音节重读规则是英语语言中一个非常重要的概念,它对英语词汇的读音和理解产生了深远的影响。英语音节重读规则的主要内容是关于英语词汇中重读音节和非重读音节的分布规律。 英语音节重读...
英语中的重读闭音节规则是英语学习中的一个重要部分,主要涉及到动词的变化形式,特别是现在分词、过去式和过去分词的构成。在英语中,闭音节是指一个元音字母后面跟着一个或多个辅音字母,并且这个音节在单词中是...