第五周学习总结&实验报告(三)
这一周又学习了新的知识点——继承。
一、继承的基本概念是:
*定义一个类,在接下来所定义的类里面如果定义的属性与第一个类里面所拥有的属性一样,那么我们在此就不需要重复定义,直接通过关键词“extends”,进行继承第一个类所拥有的属性和所有方法;
package javazjie;
class Person{
private String name;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Student extends Person{
private String school;
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
}
public class javazy {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student per1=new Student();
per1.setName("王麻子");
per1.setAge(19);
System.out.println("name:"+per1.getName()+",age:"+per1.getAge());
}
}
从上面的代码中可以发现person类中已经存在name和age两个属性,所以不希望在student类中在重新声明这两个属性,这个时候就需要考虑是不是可以将person类中的内容继续保留到student类中,就通过关键词extends来实现;
- 注意:只许多层继承不能多重继承。例如:错误示例“Class C extends A,B{}”;
- 正确示例:“Class A Class B extends A {} Class C extends B {}”。
使用extends关键词可以实现继承的关系,但是这个关键词的本身含义是“扩展”,更准确地说是一个扩展已有类的功能,在其他书中也会经常把子类称作派生类。
二、子类对象的实例化过程:
- 在继承的操作过程中,对于子类对象的实例化也是又要求的,即子类对象在实例化之前必须首先调用父类中的构造方法之后再调用子类自己的构造方法。也就是说子类再继承父类时是先对父类的属性进行实例化之后才实例化自己的,它会首先调用父类的构造方法。
package javazjie;
class Person{
private String name;
private int age;
public Person(){
System.out.println("父类Person中的构造方法");
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Student extends Person{
private String school;
public Student(){
System.out.println("子类Student中构造方法");
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
}
public class javazy {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student per1=new Student();
per1.setName("王麻子");
per1.setAge(19);
System.out.println("name:"+per1.getName()+",age:"+per1.getAge());
}
}
三、方法的覆写:
- 在继承概念中也存在覆写的概念,所谓方法覆写就是指子类定义了与父类中同名的方法,但是方法覆写是必须考虑到权限,即被子类覆写的方法不能拥有比父类方法更加严格的访问权限。
子类如果和父类声明了相同名称的属性,则在子类中直接访问的时候肯定是采用了“就近原则”,即先找到本类中的属性,如果此时要调用父类中的属性,直接使用“super.属性”格式即可。
区别点 |
重载 |
覆写 |
定义 |
方法名称相同,参数的类型或个数不同 |
方法名称、参数类型、返回值类型全部相同 |
定义 |
对权限没有要求 |
被覆写的方法不能拥有更严格的权限 |
范围 |
发生在一个类中 |
发生在继承类中 |
四、super关键词和this关键词的区别:
区别点 |
this |
super |
属性访问 |
访问本类中的属性,如果本类中没有此属性则从父类中继续查找 |
访问父类中的属性 |
方法 |
访问本类中的方法,如果本类中没有此方法,则从父类中继续查找 |
直接访问父类中的方法 |
调用构造 |
调用本类构造,必须放在构造方法的首行 |
调用父类构造方法,必须放在子类构造方法的首行(所以两个不可以同时使用) |
特殊 |
表示当前对象 |
无此概念 |
五、final关键词:final在Java中表示的意思是最终的意思,也可以称为完结器。可以使用final关键词声明、属性、方法,在声明的时候要注意以下几点:
- (1)使用final声明的类不能有子类;
- (2)使用final声明的方法不能被子类覆写;
- (3)使用final声明变量即成为常量,常量不可以修改;
实验报告
1.已知字符串:"this is a test of java".按要求执行以下操作:(要求源代码、结果截图。)
(1)统计该字符串中字母s出现的次数。
package shyzye;
public class shsan {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str="this is a test of java";
int count=0;
char[] c=str.toCharArray();
for(int i=0;i<c.length;i++) {
if(c[i]=='s') {
count++;
}
}
System.out.println("S的个数:"+count);
}
}
(2)统计该字符串中单词“is”出现的次数。
package shyzye;
public class shsan2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str="this is a test of java";
int count=0;
String[] c=str.split(" ");
for(String e:c) {
if(e.equals("is")) {
count++;
}
}
System.out.println("is作为单词出现的次数:"+count);
}
}
(3)统计该字符串中子串“is”出现的次数。
package shyzye;
public class shsan3 {
public static void main(String[] args) {
String str="this is a test of java";
int i=0;
int count=0;
while(str.indexOf("is",i)!=-1){
count++;
i=str.indexOf("is",i)+1;
}
System.out.println("is作为字符出现的次数:"+count);
}
}
(4)实现该字符串的倒序输出。
package shyzye;
public class shsan4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuffer str=new StringBuffer();
str.append("this is a test of java");
System.out.print("倒序:"+str.reverse());
}
}
2.请编写一个程序,使用下述算法加密或解密用户输入的英文字串。要求源代码、结果截图。
package shyzye;
import java.util.*;
public class shsan二 {
public static void main(String[] args) {
int i,j=0;
Scanner scanf=new Scanner(System.in);
String str=scanf.nextLine();
char chr[]=str.toCharArray();
char[] chr1=null;
chr1 = new char[str.length()];
for(i=chr.length-3;i<chr.length;i++) {
chr1[j]=chr[i];
j++;
}
for(i=0;i<chr.length-3;i++){
chr1[j]=chr[i];
j++;
}
System.out.print(chr1);
}
}
3.已知字符串“ddejidsEFALDFfnef2357 3ed”。输出字符串里的大写字母数,小写英文字母数,非英文字母数。
package shyzye;
public class shsans {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str1="ddejidsEFALDFfnef2357 3ed";
int count1=0,count2=0,count3=0;
char[] up=str1.toCharArray();
for(int i=0;i<up.length;i++) {
if(up[i]>='a'&&up[i]<='z') {
count1++;
}
else if(up[i]>='A'&&up[i]<='Z') {
count2++;
}
else {
count3++;
}
}
System.out.println("小写英文字母:"+count1);
System.out.println("大写英文字母:"+count2);
System.out.println("其他字符:"+count3);
}
}