综合案例:继承分析(2)

案例分析三(字符串统计)

编写程序,统计出字符串“want you to know one thing"中字母n和字母o地出现次数。
对于本程序而言,最简单的操作方法就是在主方法里面定义一个操作,或者直接定义一个新的类处理。
范例: 定义一个单独的处理类

class StringUtil{
    
    
	//返回的第一个内容为字母n的个数,第二个内容为字母o的个数
	public static int []count(String str){
    
    
		int countData[]=new int [2];
		char []data=str.toCharArray();//将字符串变为字符数组
		for (int x = 0; x < data.length; x++) {
    
    
			if (data[x]=='n'||data[x]=='N') {
    
    
				countData[0]++;
			}
			if (data[x]=='o'||data[x]=='O') {
    
    
				countData[1]++;
			}
		}
		return countData;
	}
}
public class Demo1 {
    
    
	public static void main(String[] args) {
    
    
		String str="want you to know one thing";
		int result[]=StringUtil.count(str);
		System.out.println("字母n的个数:"+result[0]);
		System.out.println("字母o的个数:"+result[1]);
	}
}

以上的解决方案严格来讲只是一种顺序式的思维模式解决的,假设现在统计的是字母o或者n的个数,以后还有可能统计其他以及的设计。

class StringUtil{
    
    
	private String content;//需要保护字符串
	public StringUtil(String content) {
    
    
		this.content=content;
	}
	public String getContent() {
    
    
		return this.content;
	}
	public String getInfo() {
    
    	//默认的信息返回
		return this.getContent();
	}
}
class StringCount extends StringUtil{
    
    
	private int ncount;
	private int ocount;
	public StringCount(String content) {
    
    
		super(content);
		this.countChar();//构造方法统计
	}
	public void countChar() {
    
    
		char []data=super.getContent().toCharArray();//将字符串变为字符数组
		for (int x = 0; x < data.length; x++) {
    
    
			if (data[x]=='n'||data[x]=='N') {
    
    
				this.ncount++;
			}
			if (data[x]=='o'||data[x]=='O') {
    
    
				this.ocount++;
			}
		}
	}
	public int getNcount() {
    
    
		return this.ncount;
	}
	public int getOcount() {
    
    
		return this.ocount;
	}
	public String getInfo() {
    
    
		return "字母n的个数"+this.ncount+"字母o的个数"+this.ncount;
	}
}
public class Demo1 {
    
    
	public static void main(String[] args) {
    
    
		StringCount sc=new StringCount("want you to know one thing");
		System.out.println(sc.getInfo());
	}
}

任何方案都可以,如果采用第一种方案比较直观,但是第二种方案适合于结构化设计。

案例分析四(数组操作)

建立一个可以实现整型数组的操作类(Array),然后在里面可以操作的数组的大小由外部来决定,然后在Array类里面需要提供有数组的如下处理:进行数组的增加(如果数据满了则无法增加)、可以实现数组的容量扩充、取得数组全部内容。
完成之后在此基础上载培盛出两个子类:

  1. 数组排序类:返回的数据必须是排序后的结果;
  2. 数组反转类:可以实现内容的首尾交换。
    对于本程序首先要考虑的父类的完善。
    第一步: 实现基本的数组类定义
class Array{
    
    //数组的操作类
	private int []data;//数组类型
	private int foot;//进行数组索引控制
	public Array(int len) {
    
    
		if (len>0) {
    
    
			this.data=new int [len];//开辟数组
		}else {
    
    
			this.data=new int [1];//开辟一个空间
		}
	}
	//实现数组的容量扩充,给出的是扩充大小,实际大小=已有大小+扩充大小
	public void increment(int num) {
    
    
		int newData[]=new int [this.data.length+num];
		System.arraycopy(this.data, 0, newData,0, data.length);
		this.data=newData;//改变数组引用
	}
	public boolean add(int num) {
    
    //数组增加
		if (this.foot<this.data.length) {
    
    //有位置
			this.data[this.foot++]=num;
			return true;
		}
		return false;
	}
	public int []getData(){
    
    
		return this.data;
	}
}
public class Demo1 {
    
    
	public static void main(String[] args) {
    
    
		Array arr=new Array(5);
		System.out.println(arr.add(10));
		System.out.println(arr.add(5));
		System.out.println(arr.add(20));
		System.out.println(arr.add(3));
		System.out.println(arr.add(6));
		arr.increment(3);
		System.out.println(arr.add(1));
		System.out.println(arr.add(7));
		System.out.println(arr.add(0));
	}
}

第二步: 进行排序子类定义

class Array{
    
    //数组的操作类
	private int []data;//数组类型
	private int foot;//进行数组索引控制
	public Array(int len) {
    
    
		if (len>0) {
    
    
			this.data=new int [len];//开辟数组
		}else {
    
    
			this.data=new int [1];//开辟一个空间
		}
	}
	//实现数组的容量扩充,给出的是扩充大小,实际大小=已有大小+扩充大小
	public void increment(int num) {
    
    
		int newData[]=new int [this.data.length+num];
		System.arraycopy(this.data, 0, newData,0, data.length);
		this.data=newData;//改变数组引用
	}
	public boolean add(int num) {
    
    //数组增加
		if (this.foot<this.data.length) {
    
    //有位置
			this.data[this.foot++]=num;
			return true;
		}
		return false;
	}
	public int []getData(){
    
    
		return this.data;
	}
}
class sortArray extends Array{
    
    	//定义排序子类
	public sortArray(int len) {
    
    
		super(len);
	}
	public int[] getData() {
    
    //获得排序结果
		java.util.Arrays.sort(super.getData());//排序
		return super.getData();
	}
}
public class Demo1 {
    
    
	public static void main(String[] args) {
    
    
		sortArray arr=new sortArray(5);
		System.out.println(arr.add(10));
		System.out.println(arr.add(5));
		System.out.println(arr.add(20));
		System.out.println(arr.add(3));
		System.out.println(arr.add(6));
		arr.increment(3);
		System.out.println(arr.add(1));
		System.out.println(arr.add(7));
		System.out.println(arr.add(0));
		int result[]=arr.getData();
		for(int temp:result) {
    
    
			System.out.print(temp+"、");
		}
	}
}

第三步: 定义反转子类

class Array{
    
    //数组的操作类
	private int []data;//数组类型
	private int foot;//进行数组索引控制
	public Array(int len) {
    
    
		if (len>0) {
    
    
			this.data=new int [len];//开辟数组
		}else {
    
    
			this.data=new int [1];//开辟一个空间
		}
	}
	//实现数组的容量扩充,给出的是扩充大小,实际大小=已有大小+扩充大小
	public void increment(int num) {
    
    
		int newData[]=new int [this.data.length+num];
		System.arraycopy(this.data, 0, newData,0, data.length);
		this.data=newData;//改变数组引用
	}
	public boolean add(int num) {
    
    //数组增加
		if (this.foot<this.data.length) {
    
    //有位置
			this.data[this.foot++]=num;
			return true;
		}
		return false;
	}
	public int []getData(){
    
    
		return this.data;
	}
}
class sortArray extends Array{
    
    	//定义排序子类
	public sortArray(int len) {
    
    
		super(len);
	}
	public int[] getData() {
    
    //获得排序结果
		java.util.Arrays.sort(super.getData());//排序
		return super.getData();
	}
}
class ReverseArray extends Array{
    
    	//定义排序子类
	public ReverseArray(int len) {
    
    
		super(len);
	}
	public int[] getData() {
    
    //获得排序结果
		int center=super.getData().length/2;
		int head=0;
		int tail=super.getData().length-1;
		for (int x = 0; x < center; x++) {
    
    
			int temp=super.getData()[head];
			super.getData()[head]=super.getData()[tail];
			super.getData()[tail]=temp;
			head++;
			tail--;
		}
		return super.getData();
	}
}
public class Demo1 {
    
    
	public static void main(String[] args) {
    
    
		ReverseArray arr=new ReverseArray(5);
		System.out.println(arr.add(10));
		System.out.println(arr.add(5));
		System.out.println(arr.add(20));
		System.out.println(arr.add(3));
		System.out.println(arr.add(6));
		arr.increment(3);
		System.out.println(arr.add(1));
		System.out.println(arr.add(7));
		System.out.println(arr.add(0));
		int result[]=arr.getData();
		for(int temp:result) {
    
    
			System.out.print(temp+"、");
		}
	}
}

父类之中定义的方法名称往往都很重要,如果功能相同的时候子类应该以覆写父类的方法为优先考虑

猜你喜欢

转载自blog.csdn.net/weixin_46688667/article/details/108363102