声明:由于版权等原因,本文隐藏了部分内容,由此造成的不便请大家谅解。
如果你觉得本文对你有所帮助,请回贴支持,谢谢。
授课教师:牟勇
课时:100分钟
l 本章技能目标
n 掌握String的基本用法
u 定义,初始化字符串
u 计算字符串长度
u 比较,连接,提取字符串
n 会使用带参数的方法
n 会使用StringBuffer类的方法对字符串进行操作
l 本章重点
n掌握String的常用方法
n掌握编写带参数的方法
l 本章难点
n如何编写带参数的方法
n调用带参数的方法
l 本章工作任务
升级Java应用程序HelloAccp
n实现学员注册密码验证
n打印学员成绩单
n实现文件名和邮箱ID的合法性验证
回顾上一章: [5分钟]
阅读下面代码,哪个有错误?说明理由
double[ ] a = new double[ ];
double[ ] a = new double[5]{1,2,3,4,5,};
double a = {1,2,3,4,5};
填代码:逆序输出数组中的元素
int[ ] a = new int[ ] {1,2,3,4,5};
for (int i=a.length-1;i>=0;i-- ){
System.out.println(a[i]);
}
预习检查: [5分钟]
如何定义一个字符串?
使用什么方法可以获得字符串的长度?
如何定义一个StringBuffer类的对象?
课程知识点讲解:
授课思路:
本章依次讲解4个问题:字符串的使用,带参数的方法,StringBuffer类的使用以及Java语言特点的总结。
字符串的使用:主要讲解String类提供的操作字符串的常用方法,包括计算字符串的长度,比较两个字符串,连接字符串以及提取字符串。
带参数的方法:这是继第7章讲解类的方法后,讲解带参数的方法。进一步讲解定义方法的优点,以及如何编写带参数的方法和调用带参数的方法。
StringBuffer类的使用:讲解另一种存储字符串的类:StringBuffer。讲解它的toString方法和append方法。强调它比String类更高效。
教员最好现场演示,逐行敲打并解释代码,课堂练习题教员可以巡视全班,给学员指导,一定要让学员充分讨论并动手练习。
字符串的使用:[40分钟]
生活和编程中都频繁使用字符串
告诉学员:String类是一个Java类库中最常用的类,我们在前面的学习中已经在频繁使用了。让学员回忆之前我们是如何使用String的,之后再回顾以前已经学过的String类的equals方法。最后引出String其实还有很多常用的方法。
计算字符串的长度
问题:随机输入你心中想到的一个名字,然后输出它的字符串长度
答案:(注意强调String的length()方法,并与数组的length属性相比较,强调String类是方法,要打小括号,数组是属性,不打小括号)
package s1java.sg.chap9; import java.util.*; public class HelloAccp1 { public static void main(String[ ] args) { System.out.print("请随机输入你想到的名字: "); Scanner input = new Scanner(System.in); String name = input.next(); System.out.println("这个名字的长度是: /" " + name.length()+ "/" "); } } |
字符串比较
问题:两个学员输入各自最喜欢的课程名称,判断是否一致
答案:(教员先写出代码,然后让学员来输入他们喜欢的课程名称,引导学员观察结果)
//判断课程名称是否相同 if(favCourse1.equals(favCourse2)){ System.out.println("最喜欢的课程相同"); }else{ System.out.println("最喜欢的课程不相同"); } |
接着教员输入Java,和java,这时学员一定会觉得很奇怪,于是引出下面的提问。
提问:为什么Java和java不是同一门课呢?这要从eqauls的实现说起。
答案:eqauls方法是把两个字符串(一个是它自己,另一个是传入的参数)逐字符的按ASCII码进行比较,每一个字符都完全相等才认为两个字符串是相同的,J和j的ASCII码是不一样的,所以,eqauls方法认为Java和java是不相等的。
提问:那如何解决这个问题呢?
答案:两个方案。
方案一:使用String的另一个方法eqaulsIgnoreCase()。(强调这个方法将忽略大小写)
if(favCourse1.equalsIgnoreCase(favCourse2)){ System.out.println("最喜欢的课程相同"); }else{ System.out.println("最喜欢的课程不相同"); } |
方案二:首先使用toUpperCase()方法或者toLowerCase(),之后再用eqauls()比较(在使用这两个方法之前,教员可以先使用输出语句输出一下两个方法的返回结果,让学员实际看到大小写转换的效果)
if(favCourse1.toUpperCase().equals(favCourse2.toUpperCase())){ System.out.println("最喜欢的课程相同"); }else{ System.out.println("最喜欢的课程不相同"); } |
小结1:
学员进行入学注册,输入两次密码,如果相同,提示注册成功,如果不相同,提示重新输入密码
/** *HelloAccp3.java 学员注册,检查输入密码是否一致 */ package s1java.sg.chap9;
import java.util.*;
public class HelloAccp3 {
/** * @param args */ public void checkPassword(){ // 从键盘接收密码 System.out.println("---欢迎进入员注册系统---"); Scanner input = new Scanner(System.in); System.out.println("请输入您的密码:"); String psw1 = input.next(); System.out.println("请确认您的密码:"); String psw2 = input.next();
// 比较两次输入的密码是否一致 if (psw1.equals(psw2)) { System.out.println("恭喜您!注册成功!"); } else { System.out.println("密码不一致,请重新注册!"); }
} public static void main(String[] args) { checkPassword(); } } |
字符串连接
某学员的Java成绩如表所示,格式化输出他的成绩单。
答案:方法一:使用”+”(教员在演示完以下代码后,说明这样显示不是很直观,能不能改变一下格式,让别人能一目了然?然后给代码中加入转义字符,并对转义字符进行讲解:转义字符是把那些在Java里已经被定义的字符,或者那些无法用可视字符来表达的操作转义为字符串来进行输出的办法。如:双引号已经被Java定义为字符串的标志字符,如果我们需要输出一个双引号字符,就必须写为”/””,如果我们希望输出的字符串换到另一行,我们就必须写为“/n”。)
int sqlScore = 80; //sql成绩 int javaScore = 90; //java成绩 double htmlScore = 86.7; //html成绩 //创建成绩单 String scoreSheet = "SQL:" + sqlScore + " Java:" + javaScore + " HTML:" + htmlScore; //打印成绩单 System.out.println("*****令狐冲成绩单*****"); System.out.println(scoreSheet); |
方法二:使用String类的concat()方法
String s = new String("你好,"); String name = new String("张三!"); String sentence = s.concat(name); System.out.println(sentence); |
字符串常用提取方法
问题引入:使用作业提交系统提交Java作业,输入java源代码文件名,并输入自己的邮箱,提交前对Java文件名以及邮箱有效性进行检查。编码实现
分析:
合法的文件名应该以.java结尾
合法的邮箱名中至少要包含“@”和“.”, 并检查“@”是否在“.”之前
解决方案:看看String有没有什么方法能帮助我们。
常用提取方法列表:
方法 | 说明 |
public int indexOf(int ch) | 搜索第一个出现的字符ch(或字符串value) |
public int indexOf(String value) | |
public int lastIndexOf(int ch) | 搜索最后一个出现的字符ch(或字符串value) |
public int lastIndexOf(String value) | |
public String substring(int index) | 提取从位置索引开始的字符串部分 |
public String substring(int beginindex, int endindex) | 提取beginindex和endindex之间的字符串部分 |
public String trim() | 返回一个前后不含任何空格的调用字符串的副本 |
出示答案:作业提交系统(教员可以在这里先使用带参数的方法,为后面的内容埋下伏笔,重点讲解String的提取方法的使用方法,让学员明白如何使用带参数的方法)。
public class HelloAccp5 { public boolean checkEmail(String email){ boolean emailCorrect = false; // 检查你的邮箱格式 if (email.indexOf('@') != -1 && email.indexOf('.') > email.indexOf('@')) { emailCorrect = true; } else { emailCorrect=false; } return emailCorrect; } public boolean checkFileName(String filename){ boolean fileCorrect = false; // 检查Java文件名 int index = fileName.lastIndexOf("."); if (index != -1 && index != 0 && fileName.substring(index + 1, fileName.length()).equals("java")) { fileCorrect = true; } else { fileCorrect=false; } return fileCorrect; } /** * @param args */ public static void main(String[] args) { System.out.println("---欢迎进入作业提交系统---"); Scanner input = new Scanner(System.in); System.out.println("请输入Java文件名: "); String fileName = input.next(); System.out.println("请输入你的邮箱"); String email = input.next(); // 输出检测结果 if(checkFileName(fileName)){ if(cheEmail(email)){ System.out.println(“作业提交成功!”); }else{ System.out.println(“email名称有误,请检查”); } }else{ System.out.println(“作业名称有误,请检查”); } } |
小结2:如果要打印输出“小鱼儿”,应填入的代码是什么?
String word = "Hello, ";
word = word.trim();
String s = word.concat("小鱼儿!");
int index1 = s.indexOf(',');
int index2 = s.indexOf('!');
System.out.println(s.substring(______, _______));
带参数的方法:[25分钟]
今天我们接触了几个新的方法,它们和我们前面学过的方法有什么区别?
public String concat(String str)
public int indexOf(String value)
public String substring(int index)
很明显,这里方法与我们前面学习的方法有一个明显的区别,就是在方法的小括号里有一个或多个变量,这些变量有什么用处呢?这些变量我们称为参数,它可以让我们把方法所需要的材料传给方法,让它进行加工处理,然后返回给我们希望得到的结果,这就象我们生活中的榨汁机一样。
生活案例:榨汁机
特征:如果你给它苹果,它就返回给你苹果汁,如果你给它梨,它就返回给你梨汁。如果你苹果和梨一起给它,它就给你苹果梨汁。
如何使用带参数的方法
我们来用程序代码模拟一下吧。
public class Zhazhi{ //定义带参数的zhazhi方法 public String zhazhi ( String fruit ) { String juice = fruit + "汁"; return juice; } } |
我们应该怎么使用这个方法呢?
/*调用zhazhi方法*/ Zhazhi myZhazhi = new Zhazhi(); String myFruit = "苹果"; String myJuice = myZhazhi.zhazhi(myFruit); System.out.println(myJuice);
|
使用带参数方法的好处:
可以用更少的代码完成重复的工作,提高代码的效率,省时省力。
问题:输入学期代码,输出学期课程。
如果我们不仔细观察和考虑,可能会得到这样的代码:
/** *HelloAccp7.java *从控制台输入学期代号,根据代号输出每学期课程信息(复杂版) */ package s1java.sg.chap9; import java.util.*; public class HelloAccp7 { /** * @param args */ public static void main(String[] args) { // 声明每学期课程信息 String[] s1 = { "进入软件编程世界", "使用Java语言理解程序逻辑" }; String[] s2 = { "SQL Server数据库设计和高级查询", "深入.Net 平台" }; String[] y2 = { "用JSP开发动态网站", "前沿技术课" }; System.out.println("请输入学期代码(1/2/3):"); Scanner input = new Scanner(System.in); int courseCode = input.nextInt(); if (courseCode == 1) { System.out.println("第1学期的课程是:"); for (int i = 0; i < s1.length; i++) { System.out.println(s1[i]); } } else if (courseCode == 2) { System.out.println("第2学期的课程是:"); for (int i = 0; i < s2.length; i++) { System.out.println(s2[i]); } } else if (courseCode == 3) { System.out.println("第3学期的课程是:"); for (int i = 0; i < y2.length; i++) { System.out.println(y2[i]); } } else { System.out.println("课程代码输入错误!"); } } } |
如果我们仔细思考一下,我们会发现,这多个if语句里面的代码都是及相似的,都是一个输出语句和一个for循环,不同的地方只有输出的内容和课程数组,非常的有规律。
有规律的代码,就可以合并!
怎么合并呢?基本原则就是:把变化的部分从不变化的部分提取出来。
下面是优化之后的代码:以带参数的方法实现。
public class AccpSchool { public void courseInfo(int courseCode, String[ ] course){ System.out.println(courseCode + "的课程是:"); for(int i = 0; i < course.length; i++){ System.out.println(course[i]); } } } |
如何使用呢?
AccpShool school = new AccpSchool(); school.courseInfo(courseCode, s1); |
小结:实现MP3播放器:1)播放录入的音乐名称2)外放正在播放的歌曲
教员应先让学员写,之后教员手敲代码,重点说明参数的传入,代码执行顺序。
package s1java.sg.chap9; import java.util.Scanner; public class MP3 { /** * 播放 * * @param song 歌曲名称 * @return 播放的歌曲 */ public String play(String song) { return song + "......"; } /** * 外放 * * @param info 声音 */ public void audio(String sound) { System.out.println(sound); } public static void main(String[] args) { MP3 mp3 = new MP3(); System.out.print("想听什么歌? "); Scanner input = new Scanner(System.in); String song = input.next(); mp3.audio(mp3.play(song)); } } |
StringBuffer类:[10分钟]
引入:前面我们学习了带参数的方法,学会使用带参数的方法,可以大大提高我们编码的效率。带参数的也是在各种编码语言中最最常用的一种方法。下面我们再来学习Java中的一个类,StringBuffer类,看看带参数的方法是如何应用的吧。
StringBuffer:String的增强版
有了String,为什么Java还要搞一个StringBuffer呢?这是因为String的效率不够高,而且String是不可改变的,这样造成如果我们对一个字符串进行操作,需要声明许多的变量,很不方便。而StringBuffer可以改变它自身,所以它的效率大大的被提高了。
学习一个类使用,首先我们要学习的就是如何声明和实例化它。
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer("aaa"); |
大家可以看到,StringBuffer有两种方法进行实例化。第一种不传入参数。可以得到一个含有空字符串的StringBuffer,第二种传入一个String参数,可以得到一个含该String参数的StringBuffer。
StringBuffer的使用
学习一个类的使用,其实就是熟悉它有那些常用的方法可以供我们使用。
如果要输出一个StringBuffer所含有的String可以调用它的toString()方法。
如果要追加字符串到StringBuffer里,可以调用它的append()方法。
System.out.println(sb.toString()); sb.append("**");//追加两个星到尾部 |
StringBuffer的用武之地
问题:从控制台接收课程信息,不断累加直到输入“#”键结束,并输出全部课程信息
//声明课程信息字符串 StringBuffer course = new StringBuffer(); System.out.println("请输入S1课程信息: "); Scanner sc = new Scanner(System.in);
//循环从键盘接收字符串 String input; while(!(input = sc.next()).equals("#")){ course.append(input); course.append("/n"); } System.out.println("s1的课程信息是:" + course);
|
教员可以引导学员,让二至三个学员上机,其他学员用纸写,完成这个练习。
Java语言特点总结:[5分钟]
引入:学到这里,我们第一学期的Java课程已经结束,对于Java,我们有了一些初步的了解,对于Java的高级应用,我们将在二学期进行学习,这里我们小结一下,看看Java语言有些什么特点:
简单易学
丰富且功能强大的类库(Java Doc——我们的法宝)
java.lang.*:提供利用 Java 编程语言进行程序设计的基础类
java.util.*:提供集合框架,Collection类,日期,实用工具等类
java.io.*:提供强大的系统输入和输出
javax.sql.*:
javax.xml.*:
……
提供强大的网络支持(后续课程:深入OOP、JSP B/S开发技术)
本章总结 [10分钟]
如何定义一个String类的实例?
使用什么方法可以实现以下功能:
获得字符串的长度
在原始字符串后追加另一个字符串
如何比较两个字符串的内容是否相等
如何定义和使用带参数的方法?
使用StringBuffer的优点是什么?
考核点
String方法的使用
带参方法的声明和调用
StringBuffer
扩展部分:
暂无
学员问题汇总:
暂无
作业:
习题1:224页至225页选择题
习题2:226页第1,2,3,4题
习题3:总结:这门课,我学到了些什么?
习题4:预习HTML第一章