第五周课程总结&试验报告(三)
第五周课程总结
一、继承
1.类的继承格式
(1).使用关键字extends
可以实现继承的关系,但是这个关键字的本身含义是“扩展”,更准确的说是一个类扩展已有类的功能,所以在其他的书中也会把子类称为派生类。
(2).格式:class 父类 {}
、class 子类 extends 父类 {}
。
2.继承的限制
(1).只允许单继承,不能使用多重继承,即:一个子类只能继承一个父类。
(2).允许多层继承,即:一个子类可以有一个父类,一个父类还可以有一个父类。
(3).子类是不能直接访问父类中的私有成员的,但子类可以调用父类中的非私有方法,但是不能直接调用父类中的私有成员。
3.继承的进一步研究
(1).子类对象在实例化之前必须首先调用父类中的构造方法之后再调用子类自己的构造方法。
(2).在继承的关系中也存在着方法覆写的概念,所谓的方法覆写就是指子类定义了与父类中同名的方法。
(3).但是在方法覆写时必须考虑到权限,即被子类覆写的方法不能有比父类方法更加严格的访问权限,即:privat<default<public
,所以如果在父类中使用public
定义的方法,子类的访问权限必须是public
,否则程序会无法编译。
(4).如果要在子类的方法中访问父类的方法,则使用super.方法()
的形式来访问。
(5).属性也可以覆盖,即:子类声明了与父类同名的属性。
(6).子类如果和父类声明了相同名称的属性,则在子类中直接访问的时候肯定是采用“就近访问原则”,即先找到本类中的属性,如果此时用调用父类中的属性,直接使用super.属性
格式即可。
(7).方法的重载与覆写的区别:
区别点 | 重载 | 覆写 |
---|---|---|
单词 | Overloading |
Overriding |
定义 | 方法名称相同,参数的类型或个数不同 | 方法名称、参数类型、返回值类型全部相同 |
定义 | 对权限没有要求 | 被覆写的方法中不能有更严格的权限 |
范围 | 发生在一个类中 | 发生在继承中 |
二、super
关键词的作用
1.使用super
可以从子类中调用父类中的构造方法、普通方法、属性。
2.使用super
调用父类中指定构造方法的操作,与this
调用构造方法的要求一样,语句必须放在子类构造方法的首行。
3.this
和super
都可以调用构造方法,但两者是不可以同时出现的,因为两者调用构造的时候都必须放在构造方法的首行。
4.无论子类怎样操作,最终都是要先调用父类中的构造方法。
5.this
与super
的区别:
区别点 | this |
super |
---|---|---|
属性访问 | 访问本类中的属性,如果本类没有此属性则从父类中继续查找 | 访问父类中的属性 |
方法 | 访问本类中的方法,如果本类没有此方法则从父类中继续查找 | 直接访问父类中的方法 |
调用构造 | 调用本类构造,必须放在构造方法的首行 | 调用父类构造,必须放在子类构造方法的首行 |
特殊 | 表示当前对象 | 无此概念 |
三、final
关键词
1.final
在Java
中表示的意思是最终的意思,也可以称为完结器。
2.可以使用final
关键字声明类、属性、方法,在声明时要注意以下几点:
(1).使用final
声明的类不能有子类;
(2).使用final
声明的方法不能被子类所覆写;
(3).使用final
声明的变量即成为常量,常量不可以修改。
3.在使用final
声明变量的时候,要求全部的字母大写。
4.如果一个程序中的变量使用public static final
声明,则此变量将称为全局变量,如public static final String IFO="www.lichen.com";
。
四、抽象类
1.在Java
中可以创建一种类专门用来当作父类,这种类称为“抽象类”。
2.抽象类的作用有点类似“模板”,其目的是要设计者依据它的格式来修改并创建新的类。
3.抽象类的定义及使用规则如下:
(1).包含一个抽象方法的类必须是抽象类;
(2).抽象类和抽象方法都要使用abstract
关键字声明;
(3).抽象方法只需声明而不需要实现;
(4).抽象类必须被子类继承,子类(如果不是抽象类)必须覆写抽象类中的全部抽象方法。
4.抽象类的定义就是比普通类多了一些抽象方法,其他地方与普通类的组成基本上都是一样的。
5.抽象方法不要使用private
声明,在使用abstract
关键字修饰抽象方法的时候不能使用private
修饰,因为抽象方法必须被子类覆写,而如果使用了private
声明,则子类是无法覆写的。
五、对象的多态性
1.多态性在面向对象中是一个最重要的概念,在Java
中面向对象主要有以下两种主要体现:
(1).方法的重载与覆写。
(2).对象的多态性:
(2.1).向上转型:子类对象->
父类对象,对于向上转型,程序会自动完成,格式:父类 父类对象=子类实例
。
(2.2).向下转型:父类对象->
子类对象,对于向下转型,必须明确指明要转型的子类类型,格式:子类 子类对象=(子类)父类实例
。
试验报告(三)
1.已知字符串:"this is a test of java".按要求执行以下操作:(要求源代码、结果截图。)
- 统计该字符串中字母s出现的次数。
- 统计该字符串中子串“is”出现的次数。
- 统计该字符串中单词“is”出现的次数。
- 实现该字符串的倒序输出。
源代码
package dsc;
public class zfx {
public static void main(String[] args) {
String str="this is a test of java";
int count1=0,count2=0,count3=0;
char c[]=str.toCharArray();
for(int i=0;i<c.length;i++) {
if(c[i]=='s') {
count1++;
}
if(c[i]=='i'&&c[i+1]=='s') {
count2++;
if(c[i-1]==' '&&c[i+2]==' ') {
count3++;
}
}
}
System.out.println("字符串中字母s出现的次数:"+count1);
System.out.println("符串中子串“is”出现的次数:"+count2);
System.out.println("字符串中单词“is”出现的次数:"+count3);
System.out.print("字符串的倒序输出:");
for(int i=c.length-1;i>=0;i--) {
System.out.print(c[i]);
}
}
}
错误截图
发现最后那个循环语句的条件没设置对,还是太粗心了。
这个的问题也是太粗心了,println
是换行的。
改正后截图
自我评价:此题还是不怎么难的,写的时候就是太粗心了。
2.请编写一个程序,使用下述算法加密或解密用户输入的英文字串。要求源代码、结果截图。
源代码
package dsc;
import java.util.Scanner;
public class zz {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.print("请输入一个字符串:");
String str = sc.nextLine();
char c[]=str.toCharArray();
for(int i=0;i<c.length;i++) {
c[i]+=3;
}
System.out.print(c);
}
}
错误截图
输入字符串后输出的是一句乱码。
改正后截图
我发现是输出的语句中那个中文的问题,删掉后就可以了,但原理不知道是怎么一回事,还望助教解答。
自我评价:此题做的有点艰难,原因是没理解题目。
3.已知字符串“ddejidsEFALDFfnef2357 3ed”。输出字符串里的大写字母数,小写英文字母数,非英文字母数。
源代码
package dsc;
public class Z {
public static void main(String[] args) {
String str="ddejidsEFALDFfnef2357 3ed";
char c[]=str.toCharArray();
int c1=0,c2=0,c3=0;
for(int i=0;i<c.length;i++) {
if(c[i]>='A'&&c[i]<='Z') {
c1++;
}
else if(c[i]>='a'&&c[i]<='z') {
c2++;
}
else {
c3++;
}
}
System.out.println("大写字母数:"+c1);
System.out.println("小写英文字母数:"+c2);
System.out.println("非英文字母数:"+c3);
}
}
错误截图
发现是条件语句不正确。