第五周课程总结&试验报告(三)
实验三 String类的应用
实验目的
掌握类String类的使用;
学会使用JDK帮助文档;
实验内容
###1.已知字符串:"this is a test of java".按要求执行以下操作:(要求源代码、结果截图。)
统计该字符串中字母s出现的次数。
统计该字符串中子串“is”出现的次数。
统计该字符串中单词“is”出现的次数。
实现该字符串的倒序输出。
实验代码
package 作业;
public class zifu {
public static void main(String[] args) {
String s = "this is a test of java"; 定义赋值
int n = s.indexOf("s",3); 定义,查找指定位置字符"s"
System.out.println(+n); 输出s数量
int a = s.indexOf("is"); 定义,查找指定位置字符"is"
System.out.println(+a); 输出is数量
int b = (s.split(" is ")).length - 1; 用拆分字符串的方法来求单词"is"的数量,也就是当初现前后有空格的"is"时,对字符串进行拆分
System.out.println("单词is出现的次数" + b); 并把计算拆分好的字符串的数量,在其基础是减一,就获得了前后又空格的"is"的数量;
StringBuffer r = new StringBuffer ("this is a test of java"); 利用StringBuffer reverse方法,对字符串内容进行反转保存
System.out.println(r.reverse());
}
}
本来是想把空格作为拆分条件对字符串进行拆分,定义赋值b='is”然后用equals把b与拆分后的字符串进行比较,如果相等,则count++,以此来求出单词is的数量,但输出错误了,刚好看到StringBuffer reverse
方法觉得这种方法更加便利和简洁,所以换StringBuffer reverse方法来求单词is。本题总体来说还是很简单的,灵活运用String和StringBuffer的构造方法就能解决。
2.请编写一个程序,使用下述算法加密或解密用户输入的英文字串。要求源代码、结果截图。
package 作业;
import java.util.Scanner;
public class psw {
public static void main(String[] args) {
@SuppressWarnings("resource") 代码没问题,只是取消一些特定代码段中的警告
Scanner s = new Scanner(System.in); 定义scanner,等待输入
System.out.println("输入字符串:");
String r = s.nextLine(); 读取输入内容
char t[] = new char[r.length()]; 创建字符数组t
t=r.toCharArray(); 将用户输入的字符串通过toCharArray()转化为字符数组存到t中
int i;
for (i=0;i<t.length;i++) {
t[i]=(char)(t[i]+3); 将一般的数组字符直接加3然后强制类型转化为char类型
}
String c=" "; 定义字符串并使其赋值为空
for (i=0;i<r.length();i++) { 将字符数组转化为字符串
c=c+t[i];
}
System.out.println("改变后的字符串:
"+c); 输出
}
}
在前面发现自己定义的字符串s出现了警告,结果发现代码没问题,最后用@SuppressWarnings("resource")消除了警告,在写代码时,
for循环里;i<t.length,我之前多加了一个等号,所以输出时出现了错误,最后发现并改正,代码就没问题了,本题没有什么做题思路,以为思路都已经给了出来。
3.已知字符串“ddejidsEFALDFfnef2357 3ed”。输出字符串里的大写字母数,小写英文字母数,非英文字母数。
package 作业;
public class 输出 {
public static void main(String[] args) {
String s = "ddejidsEFALDFfnef2357 3ed"; 定义赋值
int small=0,big=0,i,not=0;
for (i=0;i<s.length();i++) { 利用for循环对字符串进行沥遍
char c=s.charAt(i); 从中依次取出字符,并转换赋值给数组c
if (Character.isLowerCase(c)) { 利用Character.isLowerCase判段取出来的字符是否为小写
small++;
}
else if (Character.isUpperCase(c)){ 利用Character.isUpperCase(c)判断字符是否为大写
big++;
}
}
not=s.length()-small-big; 求出非英文字母数
System.out.println("大写字母个数:"+big);
System.out.println("小写字母个数:"+small); 输出
System.out.println("非英语字母个数:"+not);
}
}
错误的时候还没完全来了解Character.isLowerCase和Character.isUpperCase,我出错的地方是我填了i,这两个方法里面要填数组名,之后去百度了解了,定义一个数组c,并把s的内容转换赋值给数组c,
char c=s.charAt(i);用这个语句取出每一个字符元素,并执行if和else if语句,求出答案。
总结
这是我本周自学了一小点,学习了Stringbuffer和大小写字符的判断。
Character character = 'A';
// isDigit方法判断字符是否为数字
boolean isDigit = Character.isDigit(character);
System.out.println("isDigit="+isDigit);
// isLetter方法判断字符是否为字母
boolean isLetter = Character.isLetter(character);
System.out.println("isLetter="+isLetter);
// isLowerCase方法判断字符是否为小写
boolean isLowerCase = Character.isLowerCase(character);
System.out.println("isLowerCase="+isLowerCase);
// isUpperCase方法判断字符是否为大写
boolean isUpperCase = Character.isUpperCase(character);
System.out.println("isUpperCase="+isUpperCase);
StringBuffer对象的初始化不像String类的初始化一样,Java提供的有特殊的语法,而通常情况下一般使用构造方法进行初始化。
reverse方法
public StringBuffer reverse()
该方法的作用是将StringBuffer对象中的内容反转,然后形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.reverse();
经过反转以后,对象sb中的内容将变为”cba”。
setCharAt方法
public void setCharAt(int index, char ch)
该方法的作用是修改对象中索引值为index位置的字符为新的字符ch。例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.setCharAt(1,’D’);
则对象sb的值将变成”aDc”。
继承:
1.子类继承父类的成员变量
1)能够继承父类的public和protected成员变量;不能够继承父类的private成员变量;
2)对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
3)对于子类可以继承的父类成员变量,如果在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。
2.子类继承父类的方法
同样地,子类也并不是完全继承父类的所有方法。
1)能够继承父类的public和protected成员方法;不能够继承父类的private成员方法;
2)对于父类的包访问权限成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
3)对于子类可以继承的父类成员方法,如果在子类中出现了同名称的成员方法,则称为覆盖,即子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类中同名成员方法,需要使用super关键字来进行引用。
注意:隐藏和覆盖是不同的。隐藏是针对成员变量和静态方法的,而覆盖是针对普通方法的。(后面会讲到)
3.构造器
子类是不能够继承父类的构造器,但是要注意的是,如果父类的构造器都是带有参数的,则必须在子类的构造器中显示地通过super关键字调用父类的构造器并配以适当的参数列表。如果父类有无参构造器,则在子类的构造器中用super关键字调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器。
注意一个子类只能继承一个父类,但我们可以用多层继承来实现多重继承,继承是要用到extends,格式是: class 子类 extends 父类{ }。
子类实例化前会先调用父类构造方法再用子类。
###方法的覆写:最好每个类加上一个无参构造,而且子类覆写的方法权限只增不减的,相比与父类。
重载与覆写的区别
重载:方法名相同参数不同,两个可以同时用,用参数区分开。
覆写:方法名相同参数相同,即上一个方法作废。
重载,简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
覆写(Override)的两个函数的函数特征相同,重载(Overload)的两个函数的函数名虽然相同,但函数特征不同。 函数特征包括函数名,参数的类型和个数。
###注意:super与this不能同时用,以为它们都要放在首行。
不同点:
1、super()主要是对父类构造函数的调用,this()是对重载构造函数的调用
2、super()主要是在继承了父类的子类的构造函数中使用,是在不同类中的使用;this()主要是在同一类的不同构造函数中的使用
相同点:
1、super()和this()都必须在构造函数的第一行进行调用,否则就是错误的
final:
final声明的类不能有子类
final声明的方法不能被子类所覆写
final声明的变量即成为常量,常量不能修改
###抽象类:
有点像模板,且一个子类只能继承一个抽象类。
抽象类的使用原则如下:
抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public;
抽象类不能直接实例化,需要依靠子类采用向上转型的方式处理;
抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类;
子类(如果不是抽象类)则必须覆写抽象类之中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。);
本周所讲课堂内容我已经消化的七七八八了,作业也用心去完成了,本周也自学了一些东西,继续努力。