实验三 String类的应用
一、实验目的
(1) 掌握类String类的使用;
(2) 学会使用JDK帮助文档;
二、实验内容
1.已知字符串:"this is a test of java".按要求执行以下操作:(要求源代码、结果截图。)
① 统计该字符串中字母s出现的次数。
② 统计该字符串中子串“is”出现的次数。
③ 统计该字符串中单词“is”出现的次数。
④ 实现该字符串的倒序输出。
三、实验过程(请自己调整格式)
代码:
1 package com.company; 2 3 public class Main 4 { 5 public static void main(String[] args) 6 { 7 String sent ="this is a test of java"; //实例化String 对象 8 int sSum=sum("s",sent); 9 int isSum=sum("is",sent); 10 int _is_Sum=sum(" is ",sent); 11 12 StringBuffer str=new StringBuffer(sent); //声明StringBuffer对象 13 str=str.reverse(); //reverse()方法表示将一个输入流倒叙输出 14 System.out.println(sSum); 15 System.out.println(isSum); 16 System.out.println(_is_Sum); 17 System.out.println(str); 18 } 19 20 static int sum(String sent,String Sent) 21 { 22 int Sum=0,number=0,i=0; 23 24 while(number!=-1) //元素在数组中的位置,如果没有搜素到则返回-1 25 { 26 number=Sent.indexOf(sent,i); //indexOf() 方法可返回数组中某个指定的元素位置 27 //array.indexOf(item,start);(item:查找元素;start规定在数组中开始检索的位置) 28 if(number==-1) 29 { 30 return Sum; 31 } 32 else 33 { 34 Sum++; 35 i=number+1; 36 } 37 } 38 return Sum; 39 } 40 }
运行中的错误:
第一个错误:类StringBuffer拼写错误;
第二个错误: 在句的后面我手贱的打了一个“;”
第三个错误:求的Sum的首字母我忘记大写了;
运行结果截图:
2.请编写一个程序,使用下述算法加密或解密用户输入的英文字串。要求源代码、结果截图。
代码:(加密)
1 package com.company; 2 3 import java.util.Scanner; 4 5 public class Main 6 { 7 8 public static void main(String[] args) 9 { 10 Scanner input = new Scanner(System.in); //新创建一个输入的Scanner对象,然后赋值给in 11 System.out.print("输入要加密的字符:"); 12 String str = "" ; 13 String str1 = ""; 14 int CD = 0,i ; 15 str =input.nextLine(); //接受输入的数据 16 CD = str.length(); 17 char JM = 0; 18 for(i = 0; i < CD; i++) 19 { 20 if((str.charAt(i)>64&&str.charAt(i)<88)||(str.charAt(i)>96&&str.charAt(i)<120)) //str.charAt(i)的意思是第i个字符在字符串str中所占的位置,输出的是数字 21 { //a-w和A-W往后移三位就是把它们的ASCII值减3 22 JM = (char) (str.charAt(i) + 3); //强制转换成char 23 } 24 else if((str.charAt(i)>87&&str.charAt(i)<91)||(str.charAt(i)>119&&str.charAt(i)<123)) 25 { //而x、y、z、X、Y、Z,他们的ASCII值减23,得重新回到字母首字母 26 JM = (char) (str.charAt(i) - 23); 27 } 28 str1 = str1 + JM; 29 30 } 31 System.out.println("加密后的字符串是:"+str1); 32 } 33 }
遇到的问题:
没有给str和str1设定初始化
输入不了加密字符,后来通过百度知道,要运用“str =input.nextLine(); ”表示:读取一行输入,并存到str中
运行结果:(加密)
代码:(解密)
1 package com.company; 2 3 import java.util.Scanner; 4 5 public class Main { 6 7 public static void main(String[] args) 8 { 9 Scanner input = new Scanner(System.in); //新创建一个输入的Scanner对象,然后赋值给in 10 System.out.print("输入要解密的字符:"); 11 String str = "" ; 12 String str1 = ""; 13 int CD = 0,i ; 14 str =input.nextLine(); //接受输入的数据 15 CD = str.length(); 16 char JM = 0; 17 for(i = 0; i < CD; i++) 18 { 19 if((str.charAt(i)>99&&str.charAt(i)<123)||(str.charAt(i)>67&&str.charAt(i)<90)) //str.charAt(i)的意思是第i个字符在字符串str中所占的位置,输出的是数字 20 { 21 JM = (char) (str.charAt(i) - 3); //强制转换成char 22 } 23 else if((str.charAt(i)>64&&str.charAt(i)<68)||(str.charAt(i)>96&&str.charAt(i)<100)) 24 { 25 JM = (char) (str.charAt(i) + 23); 26 } 27 str1 = str1 + JM; 28 29 } 30 System.out.println("解密后的字符串是:"+str1); 31 } 32 }
遇到的问题:
解密不出来,然后发现是判断条件出现错误,我只考虑了abc大小写和xyz大小写,中间的字母没有考虑进去
运行结果:(解密)
3.已知字符串“ddejidsEFALDFfnef2357 3ed”。输出字符串里的大写字母数,小写英文字母数,非英文字母数。
代码:
1 package com.company; 2 3 public class Main 4 { 5 6 public static void main(String[] args) 7 { 8 9 String str = "ddejidsEFALDFfnef2357 3ed"; 10 char [] c = str.toCharArray(); //public char[] toCharArray()将字符串转成char字符数 11 //字符串转为二进制数组,二进制转回字符串 12 int i, sumDX = 0, sumXX = 0, sumQT = 0; 13 14 for(i=0;i<c.length;i++) 15 { 16 if(c[i]>='A'&&c[i]<='Z') 17 { 18 sumDX = sumDX + 1; 19 } 20 else if(c[i]>='a'&&c[i]<='z') 21 { 22 sumXX = sumXX + 1; 23 } 24 else 25 { 26 sumQT = sumQT + 1; 27 } 28 } 29 30 System.out.println("大写字母数为:"+sumDX); 31 System.out.println("小写字母数为:"+sumXX); 32 System.out.println("非英文字母数为:"+sumQT); 33 } 34 }
1 package com.company; 2 3 public class Main 4 { 5 6 public static void main(String[] args) 7 { 8 9 String str = "ddejidsEFALDFfnef2357 3ed"; 10 char [] c = str.toCharArray(); //public char[] toCharArray()将字符串转成char字符数 11 //字符串转为二进制数组,二进制转回字符串 12 int i, sumDX = 0, sumXX = 0, sumQT = 0; 13 14 for(i=0;i<c.length;i++) 15 { 16 if(c[i]>='A'&&c[i]<='Z') 17 { 18 sumDX = sumDX + 1; 19 } 20 else if(c[i]>='a'&&c[i]<='z') 21 { 22 sumXX = sumXX + 1; 23 } 24 else 25 { 26 sumQT = sumQT + 1; 27 } 28 } 29 System.out.println("大写字母数为:"+sumDX); 30 for(i=0;i<c.length;i++) 31 { 32 if (str.charAt(i) >= 'A' && str.charAt(i) <= 'Z') { 33 System.out.print(str.charAt(i)); 34 } 35 } 36 37 System.out.println("\n"+"小写字母数为:"+sumXX); 38 for(i=0;i<c.length;i++) 39 { 40 if (str.charAt(i) >= 'a' && str.charAt(i) <= 'z') { 41 System.out.print(str.charAt(i)); 42 } 43 } 44 45 System.out.println("\n"+"非英文字母数为:"+sumQT); 46 for(i=0;i<c.length;i++) 47 { 48 if(str.charAt(i)<'A'||str.charAt(i)>'z') 49 { 50 System.out.print(str.charAt(i)); 51 } 52 } 53 54 55 } 56 }
遇到的问题:
不会把字符串分解,后来通过翻书P111【例5.25】中有我想要的操作,找到了public char[] to CharArray(),然后依葫芦画瓢
运行结果:
四、 总结:
一、为什么要继承:
代码存在重复,导致后果就是代码量大且臃肿,,而且维护性不高(维护性主要是后期需要修改的时候,就需要修改很多的代码,容易出错)。
二、继承类型:
Java 不支持多继承,但支持多重继承。
单继承 |
public classA { ...... } public class B extends A { } |
多重继承 |
public class A{.........} public class B extends A{.........} public class C extends B{.........} |
不同类继承同一个类 |
public class A{.............} public class B extends A {.............} public class C extends A {.............} |
多继承 |
public class A {...........} public class B {...........} public class C extends A,B{.............} |
三、继承的特性
1、子类拥有父类非private的属性、方法
2、子类可以拥有自己的属性和方法,即子类可以对父类进行扩展
3、子类可以用自己的方法实现父类的方法
4、Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
5、提高了类之间的耦合性(继承的缺点:耦合性高就会造成代码之间的联系越紧密,代码独立性越差)
四、继承的关键字
继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import )祖先类。
(1)extends 只能继承一个类
(2)implements 使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)
(3)super 实现对父类成员的访问,用来引用当前对象的父类
(4)this 指向自己的引用
(5)final 可以把类定义为不能继承的,或者用于修饰方法,该方法不能被子类重写
注意:实例变量也可以被定义为 final,被定义为 final 的变量不能被修改。被声明为 final 类的方法自动地声明为 final,但是实例变量并不是 final
五、本次作业中学到的知识点
1、charAt(i) 函数 是获取字符串中i位置的字符 str.charAt(i)的意思是第i个字符在字符串str中所占的位置,输出的是数字
2、“importjava.util.*;”和“importjava.util.Scanner;”的区别:(*表示的是通配符,包括util的所有类,而Scanner表示的是一个具体的类。实际开发中都采用“importjava.util.Scanner;”这种用法,因为程序中没用到的包导入的话只会影响程序效率。)
(1)“importjava.util.*;”表示的是把util这个包下的全部类导入到程序中;而“importjava.util.Scanner;”表示的是只把util包下的Scanner类导入到程序中;
(2)导入“importjava.util.*;”后程序中后面如果要用到util包里面的别的类都不需要再重新导入包了,而如果导入“importjava.util.Scanner;”的话,程序中后面如果要用到util包的别的类,都要再次导入这个类对应的包才能使用;
3、reverse()方法表示的是将一个输入流倒叙输出。(此方法针对的是io流,不能针对字符串。)