`

JAVA范例 十) 内部类与接口

 
阅读更多

      内部类与接口

  10.1 成员内部类

  实例175 成员内部类的使用规范

package Chapter10;
public class MembersInternal {
	public static void main(String[] args) {
		OuterClass out = new OuterClass(30, 60); 		// 实例化对象
		OuterClass.InnerClass in = out.new InnerClass();	// 实例化成员内部类
		System.out.println("OuterClass是一个" + out.var);
		System.out.println("InnerClass是一个" + in.var);
		in.showVarValue(); 							// 调用showVarValue()方法
		in.innerMethod(); 							// 调用innerMethod()方法
	}
}
class OuterClass {
	String var = "外部类";
	private int width = 10;
	private static int height = 100;
	public OuterClass(int width, int height) { 				// 带参数的构造方法
		this.width = width;
		this.height = height;
		System.out.println("参数:width = " + this.width + ",height = "
				+ this.height);
	}
	private void outerOne() { 							// 外部类非静态方法
		System.out.println("系统正在访问外部类的非静态方法");
		InnerClass inner = this.new InnerClass();			// 外部类创建内部类对象
	}
	private static void outerTwo() { 						// 外部类的静态方法
		System.out.println("系统正在访问外部类的静态方法");
	}
	class InnerClass { 								// 定义成员内部类
		String var = "内部类";
		public InnerClass() { 						// 默认构造方法
			System.out.println("创建了一个内部类对象");
		}
		protected void showVarValue() {				// 内部类调用外部类的private变量
			System.out.println("外部类的width变量值为:" + width);
			System.out.println("外部类的height变量值为:" + height);
		}
		protected void innerMethod() {					// 成员内部类的非静态方法
			System.out.println("允许内部类访问外部类的private方法");
			outerOne();
			outerTwo();
		}
	}
}

 

  实例176 猜谜

package Chapter10;
public class Riddles {				// 测试类
	public static void main(String[] args) {
		System.out.println("猜迷游戏开始了~~~~\n");
		Animals am = new Animals("两撇小胡子 油嘴小牙齿 ", " 喜欢偷油吃 ");// 创建Animals类对象
		am.setEvaluation("贼头又贼脑");	// 为Animals类的evaluation变量赋值
		// 调用Animals的属性变量
		System.out.println(am.features);
		System.out.print(am.evaluation);
		System.out.println(am.hobbies);
		am.setResult("老鼠");			// 设置迷底
		am.question();					// 调用question方法
		am.showResult();				// 调用showResult方法
		System.out.println();
		Animals.Plant plant = am.new Plant("高高绿骨儿 圆圆金黄脸 ", "最爱向太阳 ");// 创建Plant类对象
		am.setEvaluation("盈盈笑不停");	// 通过Animals类的setEvaluation方法为evaluation变量赋值
		plant.setAnswer("向日葵");		// //设置迷底
		// 调用Animals的属性变量
		System.out.println(am.features);
		System.out.print(am.hobbies);
		System.out.println(am.evaluation);
		plant.question();				// 调用question方法
		plant.showAnswer();				// 调用showResult方法
	}
}
class Animals {
	String features;						// 特征
	String hobbies;						// 习惯
	String evaluation;					// 评价
	private String result;					// 答案
	Animals(String features, String hobbies) {	// 用构造方法为变量features和hobbies赋值
		this.features = features;
		this.hobbies = hobbies;
	}
	public void showResult() {				// 显示迷底
		System.out.println("迷底:[" + result + "]");
	}
	public void setResult(String result) {		// 给result变量赋值
		this.result = result;
	}
	public void setEvaluation(String evaluation) {	// 给evaluation变量赋值
		this.evaluation = evaluation;
	}
	public void question() {					// 提出问题
		System.out.println("请你猜一猜,它会是一种什么动物呢?");
	}
	class Plant {
		Plant(String f, String b) {				// 用该类的构造方法为变量features和hobbies赋值
			features = f;
			hobbies = b;
		}
		public void question() {				// 提出问题
			System.out.println("请你猜一猜,它会是一种什么植物呢?");
		}
		public void setAnswer(String answer) {	// 设置迷底答案
			setResult(answer);				// 调用Animals类的setResult方法
		}
		public void showAnswer() {			// 显示迷底
			showResult();					// 调用Animals类的showResult方法
		}
	}
}

 

  10.2 方法内部类

  实例177 局部内部类的使用规范 

package Chapter10;
public class LocalInternal {
	public static void main(String[] args) {
		OuterClass_1 out = new OuterClass_1(); 	// 实例化对象
		Local local = out.result(); 				// 调用方法返回抽象类
		local.A_local(); 					// 调用抽象类的抽象方法
		local.B_local();
		local.C_local();
	}
}
abstract class Local { 						// 定义一个抽象类
	public abstract void A_local(); 				// 定义三个抽象方法
	public abstract void B_local();
	public abstract void C_local();
}
class OuterClass_1 { 						// 外部类
	private String str = "现在访问的是外部类";
	private void p_showMess() {
		System.out.println("现在访问的是外部类的私有非静态变量——p_showMess()");
	}
	public void showMess() {
		System.out.println("现在访问的是外部类的非静态方法——showMess()");
	}
	public Local result() { 					// 方法返回实现的抽象类的局部内部类
		final String inner = "局部内部类是在方法中创建的类";
		class InnerClass_1 extends Local { 		// 定义局部内部类并继承抽象类,实现抽象方法
			public void A_local() {
				showMess();
			}
			public void B_local() {
				p_showMess();
			}
			public void C_local() {
				System.out.println("显示局部内部类的成员常量inner: \"" + inner + "\"");
				System.out.println("调用外部类的成员变量str: \"" + str + "\"");
			}
		}
		return new InnerClass_1();
	}
}

 

  实例178 奖学金的评分标准

package Chapter10;
public class ScoreTest {
	public static void main(String[] args) {
		System.out.println("奖学金的评分标准:\n 总成绩 = 学习总成绩+学生干部奖励分+表现分");
		OuterClass_3 out = new OuterClass_3("尹继平",true,5,91.75);//创建外部类对象
		//调用外部类的变量
		System.out.println("姓名:"+out.name);
		System.out.print("此人是班级干部吗?");
		System.out.println(out.isCadre?"是":"不是");
		System.out.print("此人参加过几次学生会组织的活动?");
		System.out.println(out.times>0?out.times+"次":"没参加过");
		if(out.isCadre){		//判断此人是否是班干部,true表示是,false表示不是
			out.add(3);	//如果是则加3分
		}else{
			out.add(0);
		}
	}
}
class OuterClass_3 {
	String name;				//姓名
	boolean isCadre = false;		//是否是班干部
	int times = 0;				//参加活动的次数
	int sum = 0;				//参加活动得的分数
	double score ;				//学习总成绩
	OuterClass_3(String name, boolean isCadre, int times, double score) {//利用构造方法为其成员变量赋值
		this.name = name;
		this.isCadre = isCadre;
		this.times = times;
		this.score = score;
	}
	{
		if (times > 0) {			//判断是否参加过活动
			sum = 1 * times;//每参加一次活动,就获得1分
		}
	}
	void add(final int s) {						//算取成绩
		final int temp = sum;
		class InnerClass_3 {					//定义局部内部类
			void display() {					//显示最后的成绩
				System.out.println("该生的最后成绩: score = " + (score + s + temp));
			}
		}
		InnerClass_3 in = new InnerClass_3();	//创建内部类对象
		in.display();//调用其内类方法
	}
}

 

  10.3 匿名内部类

  实例179 匿名内部类的使用规范

package Chapter10;
public class AnonymousInternal {
	public static void main(String[] args) { 		// java程序主入口处
		// 所有方法的调用
		createIinterface().showMess();
		createAbstract().showMess();
		createClass().showMess();
	}
	public static A_interface createIinterface() {
		A_interface inter = new A_interface() { 	// 创建接口的匿名内部类
			public void showMess() { 			// 实现接口中的方法
				System.out
						.println("1. 在匿名内部类中,实现了A_interface接口中定义的showMess方法.");
			}
		};
		return inter;
	}
	public static A_abstract createAbstract() {
		A_abstract ab = new A_abstract() { 		// 创建抽象类的匿名内部类
			void showMess() { 				// 实现抽象类中定义的抽象方法
				System.out
						.println("2. 在匿名内部类中,实现了A_abstract类中的抽象方法:showMess().");
			}
		};
		return ab;
	}
	public static A_class createClass() {
		A_class ac = new A_class() {				// 创建普通类的匿名内部类
			public void showMess() { 				// 实现方法的重写
				System.out.println("3. 在匿名内部类中,重写了A_class类中的showMess方法.");
			}
		};
		return ac;
	}
}
interface A_interface { 							// 定义一个接口
	public void showMess();
}
abstract class A_abstract { 						// 定义一个抽象类
	abstract void showMess();
}
class A_class { 								// 定义一个类
	public void showMess() {
		System.out.println("这是一个普通的类");
	}
}

 

  实例180 电话与移动电话

package Chapter10;
public class Parameter {
	public static void main(String[] args) {
		Mobile mb = new Mobile();	// 创建Mobile对象
		mb.function();				// 调用Mobile的function方法
	}
}
interface Phone {					// 电话接口
	public void Call();				// 拔电话号码
	public void Answer();				// 接电话
}
class Mobile {						// 移动电话类
	String name;					// 联系人的姓名
	String phoneNum;				// 联系人的电话号码
	Phone p;						// 声明Phone变量
	void function() {					// 移动电话的功能
		class Person {				// 创建人类
			Person(String name1, String num) {			// 利用构造方法为Mobile类的成员变量赋值
				name = name1;
				phoneNum = num;
			}
			void contact(Phone p) {					// 创建一个抽象方法
			};
		}
		Person per = new Person("聂庆亮", "13220073610");// 创建Person对象
		per.contact(p = new Phone() {// 调用contact方法,其中以匿名内部类为参数,并为Phone类变量赋值
			// 重写Phone接品的所有抽象方法
			public void Answer() {
				System.out.println("我正在和" + name + "通电话呢。");
			}
			public void Call() {
				System.out.println("我正在给电话号码为" + phoneNum + "打电话呢。");
			}
		});
		// 调用Phone类中的方法
		p.Answer();
		p.Call();
	}
}

 

  10.4 静态内部类

  实例181 静态内部类的使用规范

package Chapter10;
public class StaticInternal {
	private static String name = "\"聂庆亮\"";
	public static void setStatic(String n) {		// 外部类的非静态方法
		System.out.println("[现在访问的是外部类的静态方法!]");
		name = n;
	}
	static class InnerClass_2 {			// 静态内部类开始
		String address, mail;		// 声明String类型变量
		long phoneNum;		// 声明long类型变量
		int qq;				// 声明int类型变量
		static void getStatic() {	// 静态内部类的静态方法
			System.out.println("[访问外部类的静态变量] name = " + name);
			setStatic("尹继平"); 	// 访问外部类的静态方法
		}
		// 静态内部类的非静态方法
		public void setString(String address, String mail) {
			System.out.println("1.静态内部类的带String型参数的非静态主法");
			this.address = address;
			this.mail = mail;
		}
		public void setInt(long phoneNum, int qq) {
			System.out.println("2.静态内部类的带int型参数的非静态主法!");
			this.phoneNum = phoneNum;
			this.qq = qq;
		}
	}							// 静态内部类结束
	public void setValue() { 			// 外部类访问静态内部类的静态成员:内部类.静态成员
		InnerClass_2.getStatic(); 		// 访问静态内部类的静态方法
		InnerClass_2 inner = new InnerClass_2(); 				// 实例化对象
		inner.setString("北京昌平区沙河镇", "yinjiping@sina.com"); 	// 访问静态内部类的非静态方法
		inner.setInt(89653310, 313557706);
		System.out.println("\n外部类访问静态内部类的结果如下:");
		System.out.println("姓名:" + this.name);
		System.out.println("住址:" + inner.address);
		System.out.println("联系电话" + inner.phoneNum);
		System.out.println("E-mail:" + inner.mail);
		System.out.println("QQ号码:" + inner.qq);
	}
	public static void main(String[] args) {						// java程序主入口处
		StaticInternal sin = new StaticInternal();
		sin.setValue(); 										// 调用方法
	}
}

 

  实例182 苹果的来历

package Chapter10;
public class Plant {
	public String shape ="椭圆型";				//叶子的形状
	private static String color = "白色";			//花的颜色
	private String grow="黑土地";				//生长的环境
	public static void main(String[] args) {
		Fruit f = new Fruit();					//创建Fruit类
		f.print();							//调用Fruit类的print方法
		new Apple().main(args);				//调用Apple类main方法
	}
	static class Fruit{
		String taste ;						//味道
		boolean iron;						//是否有果核
		Fruit(){							//给变量赋初值
			this.taste = "酸";
			this.iron =true;
		}
		public void print(){
			//调用外部类的变量
			System.out.println("叶子的形状:"+new Plant().shape);
			System.out.println("花的颜色:"+color);
			System.out.println("生长的环境:"+new Plant().grow);
		}
	}
}
class Apple extends Plant.Fruit {
	Apple(String taste) {		// 自定义带参构造方法
		this.taste = taste;	// 重新给taste变量赋值
	}
	Apple() {
		super();			// 调用父类的构造方法
	}
	public static void main(String[] args) {
		Apple apple = new Apple(); // 创建Apple对象
		// 调用父类的变量
		System.out.println("水果的味道:" + apple.taste);
		System.out.println("是否有核:" + apple.iron);
	}
}

 

  10.5 接口

  实例183 求n的幂数与倍数

package Chapter10.inter;
public class Example {
	public static void main(String[] args) {
		PowerOfFive five = new PowerOfFive();
		MultOfFive fiOb = new MultOfFive();
		Number ob;
		System.out.println("求5的n次方的结果如下:");
		for (int i = 1; i <= 4; i++) {			// 分别求出5的1-4次方
			ob = five;
			System.out.println("The five power of " + i + " is "
					+ ob.getNextVal());
		}
		System.out.println("\n求5的n的倍数如下:");
		for (int i = 1; i <= 5; i++) {			// 分别求出5的1-5倍数的值
			fiOb.val = i;
			System.out.println("The five Mult of " + i + " is "
					+ fiOb.getNextVal());
		}
	}
}
interface Number {
	int getNextVal(); 					// 获取下一个返回值
	void setInitVal(); 					// 初始化变量start、val
	void setMult(int x); 					// 设置某点的数值,即给val重新赋值。
}
class PowerOfFive implements Number {		// 求5的n次方
	int start;							// 进行运算的数字
	int val;							// 结果
	PowerOfFive() {
		start = 1;
		val = 1;
	}
	// 实现接口中定义的所有方法
	public int getNextVal() {
		val *= 5;
		return val;
	}
	public void setInitVal() {
		start = 1;
		val = 1;
	}
	public void setMult(int n) {
		start = n;
		val = n;
	}
}
class MultOfFive implements Number {	// 求5的n倍的值
	int start;
	int val;
	MultOfFive() {
		start = 1;
		val = 1;
	}
	//实现接口中定义的所有方法
	public int getNextVal() {
		setMult(val);				// 调用setMult方法,重新设置运算数
		val *= 5;
		return val;
	}
	public void setInitVal() {
		start = 1;
		val = 1;
	}
	public void setMult(int n) {
		start = n;
		val = n;
	}
}

 

  实例184 商品订单

package Chapter10.inter;
public class Order {
	public static void main(String[] args) {
		String[][] str = new String[][] { // 创建二维数组存储订单表格中的数据
			{ "name\t|", "mater\t|", "style\t\t|", "color\t|", "size\t\t|",
						"price\t|" },
				{ "blouses", "cotton", "long sleeve", "black", "free size",
						"36.8" },
				{ "T-shirt", "cotton", "long sleeve", "black", "free size",
						"25.5" },
				{ "sweater", "Knit", "long sleeve", "purple", "free size",
						"40.9" },
				{ "trouser", "cotton", "straight pant", "gray", "Two feet",
						"20.0" } };
		GoodsOrder goods = new en_Order(str); 			// 接口变量引用类对象
		OrderForm form1 = new OrderForm(goods); 		// 创建表格实例
		System.out.println("货号20090821-01的订单如下:[语言:English]");
		form1.display("en"); // 显示英文状态下的商品信息
	System.out.println("—————————————————————————————————————————————————————————————————");
		System.out.println("\n货号20090821-02的订单如下:[语言:中文]");
		Clothes clo1 = new Clothes("韩版瑞丽女式衬衫", "纯棉", "长袖", "黑色", 36.8, "均码");// 创建衣服对象用一维数组存储
		Clothes clo2 = new Clothes("韩版两件套t恤", "纯棉", "长袖", "黑色", 25.5, "均码");
		Clothes clo3 = new Clothes("毛衣针织衫", "针织", "长袖", "紫色", 40.9, "均码");
		Clothes clo4 = new Clothes("运动休闲长裤", "85%棉", "直筒裤", "灰色", 20.0, "2尺");
		Clothes clo5 = new Clothes("韩版雪纺连衣裙", "雪纺", "七分袖", "浅粉色", 35.8, "均码");
		Clothes clo6 = new Clothes("韩版男式长袖外套", "棉", "套头", "枣红色", 47.2, "ML");
		Clothes[] clothes = { clo1, clo2, clo3, clo4, clo5, clo6 }; // 创建衣服数组,将创建好的衣服对象放入数组
		GoodsOrder goods1 = new zh_Order(clothes); // 接口变量引用类对象
		OrderForm form2 = new OrderForm(goods1); // 创建订单表格实例
		form2.display("zh"); // 显示中文状态下的商品信息
	System.out.println("—————————————————————————————————————————————————————————");
	}
}
class Clothes { // 衣服类
	private String material; // 衣服材料
	private String color; // 衣服颜色
	private String style; // 衣服款式
	private double price; // 衣服价格
	private String size;// 衣服尺码
	private String name;// 衣服名称
	// 构造方法为成员变量赋初始值
	public Clothes(String name, String material, String color, String style,
			double price, String size) {
		super();
		this.material = material;
		this.color = color;
		this.style = style;
		this.price = price;
		this.size = size;
		this.name = name;
	}
	// 对private成员变量的封装
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public String getMaterial() {
		return material;
	}
	public void setMaterial(String material) {
		this.material = material;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	public String getSize() {
		return size;
	}
	public void setSize(String size) {
		this.size = size;
	}
	public String getStyle() {
		return style;
	}
	public void setStyle(String style) {
		this.style = style;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
interface GoodsOrder { 					// 定义输出二维表的接口
	public int getFormCol(); 				// 获得表格的列数
	public int getFormRow();				// 获得表格的行数
	public String getValue(int row, int col); 	// 获得指定的某行某列的值
	public String getColName(int col); 		// 获得指定的列名
}
class en_Order implements GoodsOrder { 	// 定义一个英文订单类实现接口
	String[][] clothes; 					// 定义一个二维数组
	public en_Order(String[][] clothes) { 		// 带参数的构造方法
		this.clothes = clothes;
	}
	public String getColName(int col) { 		// 获得指定的列名
		return clothes[0][col];
	}
	public int getFormCol() { 				// 获得表格的列数
		return clothes[0].length;
	}
	public int getFormRow() { 			// 获得表格的行数
		return clothes.length - 1;
	}
	public String getValue(int row, int col) { 	// 获得指定的某行某列的值
		return clothes[row + 1][col];
	}
}
class zh_Order implements GoodsOrder { 	// 定义一个中文订单类实现接口
	private Clothes[] clothes;
	public zh_Order(Clothes[] clothes) { 		// 带参数的构造方法
		this.clothes = clothes;
	}
	public String getColName(int col) {		// 根据列的序号显示表头的内容
		switch (col) {
		case 0:
			return "名称\t\t|";
		case 1:
			return "质地\t|";
		case 2:
			return "颜色\t|";
		case 3:
			return "款式\t|";
		case 4:
			return "尺码\t|";
		case 5:
			return "价格\t|";
		default:
			return null;
		}
	}
	public int getFormCol() {		// 设置列数
		return 6;
	}
	public int getFormRow() {
		return clothes.length;
	}
	public String getValue(int row, int col) {
		switch (col) {			// 将衣服对象中的商品信息取出
		case 0:
			return clothes[row].getName();
		case 1:
			return clothes[row].getMaterial();
		case 2:
			return clothes[row].getStyle();
		case 3:
			return clothes[row].getColor();
		case 4:
			return clothes[row].getSize();
		case 5:
			return clothes[row].getPrice() + "";
		default:
			return null;
		}
	}
}
class OrderForm { 						// 订单表格类
	private GoodsOrder goods;
	public OrderForm(GoodsOrder goods) { 	// 带参数的构造方法
		this.goods = goods;
	}
	public void display(String str) { 			// 显示格式和取值
	if(str.equals("en"))System.out.println("—————————————————————————————————————————————————————————————————");
	else System.out.println("—————————————————————————————————————————————————————————");
		for (int i = 0; i < goods.getFormCol(); i++) { // 循环显示列名
			System.out.print(goods.getColName(i));
		}
		System.out.println();
		for (int i = 0; i < goods.getFormRow(); i++) { // 循环显示行信息
			if (str.equals("en"))
	System.out.println("—————————————————————————————————————————————————————————————————");
	else System.out.println("—————————————————————————————————————————————————————————");
			for (int j = 0; j < goods.getFormCol(); j++) {// 循环显示列信息
				System.out.print(goods.getValue(i, j) + "\t|");
			}
			System.out.println();
		}
	}
}

 

  实例185 多功能排序

package Chapter10.inter;
public class SortTest {
	public static void printValue(int[] number) {// 打印数组元素的内容
		if (number == null) {// 如果该数组是空的则返回,不执行下面的语句。
			return;
		}
		for (int i = 0; i < number.length; i++) {// 用for循环将数据元素取出
			System.out.print(number[i] + " ");
		}
		System.out.println();
	}
	public static void main(String[] args) {
		int[] number = new int[] { 53, 10, 2, 4, 54, 14, -15, -2, 0 };// 创建一个int型数组并初始化
		System.out.print("使用\"选择排序法\"排序前的数组:");
		printValue(number);// 调用printValue方法将number数组的元素打印出
		Sort test = new SelectionSort();// 创建SelectionSort对象
		// 调用实现父类接口中的两个方法:ascSort和descSort
		System.out.print("\t升序排序的结果:");
		printValue(test.ascSort(number));
		System.out.print("\t降序排序的结果:");
		printValue(test.descSort(number));
		System.out.print("\n使用\"冒泡排序法\"排序前的数组:");
		printValue(number);// 调用printValue方法将number数组的元素打印出
		test = new BubbleSort();// 创建BubbleSort对象
		// 调用实现父类接口中的两个方法:ascSort和descSort
		System.out.print("\t升序排序的结果:");
		printValue(test.ascSort(number));
		System.out.print("\t降序排序的结果:");
		printValue(test.descSort(number));
		System.out.print("\n使用\"快速排序法\"排序前的数组:");
		printValue(number);// 调用printValue方法将number数组的元素打印出
		test = new QuickSort();// 创建QuickSort对象
		// 调用实现父类接口中的两个方法:ascSort和descSort
		System.out.print("\t升序排序的结果:");
		printValue(test.ascSort(number));
		System.out.print("\t降序排序的结果:");
		printValue(test.descSort(number));
	}
}
interface Sort {// 排序接口
	// 在接口中定义了两个抽象方法
	public int[] ascSort(int[] number);// 对整型数组按升序排序,并返回排好序的数组
	public int[] descSort(int[] number);// 对整型数组按降序排序,并返回排好序的数组
}
// 选择排序法
class SelectionSort implements Sort {// 创建一个类实现接口
	public int[] ascSort(int[] number) {// 升序排序法
		if (number == null) {// 如果该数组是空的则返回,不执行下面的语句。
			return null;
		}
		int[] copyArray = (int[]) number.clone();// 调用数组的clone方法,直接克隆一个数组。
		int size = copyArray.length;
		// 从头遍历数组元素
		for (int i = 0; i < size; i++) {
			// 遍历下标为i之后的元素
			for (int j = i; j < size; j++) {
				// 如果数组前面的值比后面的值大,则交换位置
				if (copyArray[i] > copyArray[j]) {
					exchange(copyArray, i, j);
				}
			}
		}
		return copyArray;
	}
	public int[] descSort(int[] number) {// 降序排序法
		if (number == null) {// 如果该数组是空的则返回,不执行下面的语句。
			return null;
		}
		int[] copyArray = (int[]) number.clone();// 调用数组的clone方法,直接克隆一个数组。
		int size = copyArray.length;
		// 从头遍历数组元素
		for (int i = 0; i < size; i++) {
			// 遍历下标为i之后的元素
			for (int j = i; j < size; j++) {
				// 如果数组前面的值比后面的值小,则交换位置
				if (copyArray[i] < copyArray[j]) {
					exchange(copyArray, i, j);
				}
			}
		}
		return copyArray;
	}
	// 交换数组中下标的值,其中:from源下标, to目标下标
	public void exchange(int[] toArray, int from, int to) {
		int temp = toArray[from];
		toArray[from] = toArray[to];
		toArray[to] = temp;
	}
}
// 冒泡排序法
class BubbleSort implements Sort {// 创建一个类去实现Sort接口
	SelectionSort ss = new SelectionSort();// 创建SelectionSort类对象
	public int[] ascSort(int[] number) {// 升序排序法
		if (number == null) {// 如果该数组是空的则返回,不执行下面的语句。
			return null;
		}
		int[] copyArray = (int[]) number.clone();// 调用数组的clone方法,直接克隆一个数组。
		// 用当前的数组元素和在它之后的所有元素进行比较
		for (int i = 0; i < copyArray.length; i++) {
			for (int j = i + 1; j < copyArray.length; j++) {
				// 将下标为i的数与下标为j的数进行比较,如果后面的元素小于前面的则进行元素交换
				if (copyArray[i] > copyArray[j]) {
					ss.exchange(copyArray, i, j);
				}
			}
		}
		return copyArray;
	}
	public int[] descSort(int[] number) {// 降序排序法
		if (number == null) {// 如果该数组是空的则返回,不执行下面的语句。
			return null;
		}
		int[] copyArray = (int[]) number.clone();// 调用数组的clone方法,直接克隆一个数组。
		// 用当前的数组元素和在它之后的所有元素进行比较
		for (int i = 0; i < copyArray.length; i++) {
			for (int j = i + 1; j < copyArray.length; j++) {
				// 将下标为i的数与下标为j的数进行比较,如果后面的元素大于前面的则进行元素交换
				if (copyArray[i] < copyArray[j]) {
					ss.exchange(copyArray, i, j);
				}
			}
		}
		return copyArray;
	}
}
// 快速排序法
class QuickSort implements Sort {// 创建一个类去实现Sort接口
	SelectionSort ss = new SelectionSort();// 创建SelectionSort类对象
	public int[] ascSort(int[] number) {// 升序排序法
		if (number == null) {// 如果该数组是空的则返回,不执行下面的语句。
			return null;
		}
		int[] copyArray = (int[]) number.clone();// 调用数组的clone方法,直接克隆一个数组。
		return this.asc_quickSort(copyArray, 0, copyArray.length - 1);// 调用asc_quickSort方法
	}
	public int[] descSort(int[] number) {// 降序排序法
		if (number == null) {// 如果该数组是空的则返回,不执行下面的语句。
			return null;
		}
		int[] copyArray = (int[]) number.clone();// 调用数组的clone方法,直接克隆一个数组。
		return this.desc_quickSort(copyArray, 0, copyArray.length - 1);// 调用desc_quickSort方法
	}
	// 用递归的方式实现快速升序排序。copyArray:待排序的数组,begin:开始下标,end:终止下标
	private int[] asc_quickSort(int[] copyArray, int begin, int end) {
		if (begin < end) {
			int n = asc_partition(copyArray, begin, end);
			asc_quickSort(copyArray, begin, n - 1);
			asc_quickSort(copyArray, n + 1, end);
		}
		return copyArray;
	}
	// 用递归的方式实现快速降序排序。copyArray:待排序的数组,begin:开始下标,end:终止下标
	private int[] desc_quickSort(int[] copyArray, int begin, int end) {
		if (begin < end) {
			int n = desc_partition(copyArray, begin, end);
			desc_quickSort(copyArray, begin, n - 1);
			desc_quickSort(copyArray, n + 1, end);
		}
		return copyArray;
	}
	// 升序排序。以数组中第一个元素为标准,把大于该数的元素往后排,把小于该数的元素往前排
	private int asc_partition(int[] copyArray, int first, int last) {
		int temp = copyArray[first];
		int n = first;
		for (int i = first + 1; i <= last; i++) {
			if (copyArray[i] < temp) {
				n++;
				ss.exchange(copyArray, n, i);
			}
		}
		ss.exchange(copyArray, first, n);
		return n;
	}
	// 降序排序。以数组中第一个元素为标准,把大于该数的元素往前排,把小于该数的元素往后排
	private int desc_partition(int[] copyArray, int first, int last) {
		int temp = copyArray[first];
		int n = first;
		for (int i = first + 1; i <= last; i++) {
			if (copyArray[i] > temp) {
				n++;
				ss.exchange(copyArray, n, i);
			}
		}
		ss.exchange(copyArray, first, n);
		return n;
	}
}

 

分享到:
评论

相关推荐

    Java范例开发大全

    《Java范例开发大全》共22章,内容涉及Java开发环境的搭建、Java基础类型与运算符、条件控制语句、异常处理、数组、字符串、输入输出流、面向对象及其四大特征、内部类与接口、Java常用类、集合、多线程编程、Java...

    java范例开发大全(pdf&源码)

    第10章 内部类与接口(教学视频:41分钟) 290 10.1 成员内部类 290 实例175 成员内部类的使用规范 290 实例176 猜谜 292 10.2 方法内部类 294 实例177 局部内部类的使用规范 294 实例178 奖学金的评分标准 295 10.3...

    JAVA 范例大全 光盘 资源

    JAVA 范例大全 光盘 资源 书籍目录: 前言. 第1章 开发环境搭建 1 实例1 下载、安装并配置JDK 1 实例2 第一个Java程序 3 实例3 在Eclipse中创建第一个Java程序 4 常见问题 javac不是内部或者外部命令 6 常见...

    java范例开发大全源代码

     第10章 内部类与接口(教学视频:41分钟) 290  10.1 成员内部类 290  实例175 成员内部类的使用规范 290  实例176 猜谜 292  10.2 方法内部类 294  实例177 局部内部类的使用规范 294  实例178...

    java范例开发大全

    第10章 内部类与接口(教学视频:41分钟) 290 10.1 成员内部类 290 实例175 成员内部类的使用规范 290 实例176 猜谜 292 10.2 方法内部类 294 实例177 局部内部类的使用规范 294 实例178 奖学金的评分标准 295 10.3...

    Java范例开发大全 (源程序)

     第10章 内部类与接口(教学视频:41分钟) 290  10.1 成员内部类 290  实例175 成员内部类的使用规范 290  实例176 猜谜 292  10.2 方法内部类 294  实例177 局部内部类的使用规范 294  实例178 奖学...

    Java范例开发大全(全书源程序)

    Java范例开发大全(全书源程序),目录如下: 第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境...

    Java开发技术大全(500个源代码).

    anonymousInner.java 匿名内部类 base.java 定义一个基类 BaseColors.java 一个简单的接口 basePoint.java 一个测试用的基类 Colorable.java 一个子接口 ColoredPoint.java 一个测试用子类 common.java 一个...

    Java开发详解.zip

    031301_【第13章:Java类集】_认识类集、Collection接口笔记.pdf 031302_【第13章:Java类集】_List接口笔记.pdf 031303_【第13章:Java类集】_LinkedList类笔记.pdf 031304_【第13章:Java类集】_Set接口笔记.pdf ...

    java源码包---java 源码 大量 实例

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    JAVA上百实例源码以及开源项目源代码

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    java源码包4

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

    java源码包3

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

    JAVA上百实例源码以及开源项目

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    java源码包2

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    chapter7 接口与多态 199 7.1 何谓接口 200 7.1.1 接口定义行为 200 7.1.2 行为的多态 204 7.1.3 解决需求变化 206 7.2 接口语法细节 213 7.2.1 接口的默认 213 7.2.2 匿名内部类 217 7.2.3 使用...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,...

    java-coding-exercises:Udemy编程课程的练习和笔记

    Java内部类 Java抽象类不能用于创建对象的受限类 Java泛型在类型上增加了一层抽象,以减少错误 Java Access修饰符私有-仅在类内,默认-仅在包内,受保护-包内和包外,通过子类,公共-随处访问 Java接口 基于Java ...

Global site tag (gtag.js) - Google Analytics