`

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范例程序.rar_Java范例

    【Java范例程序.rar_Java范例】是一个包含基础Java编程示例的压缩包,适合初学者或希望巩固基础知识的开发者。这个压缩包中的资源旨在帮助用户理解和掌握Java语言的关键概念,通过实际代码来演示如何编写和运行Java...

    Java2范例入门与提高PDG格式

    本资源“Java2范例入门与提高PDG格式”显然是为了帮助初学者掌握Java2的基础知识,并通过实例来提升技能。PDG格式可能指的是电子书的一种格式,它可能包含一系列章节和实例代码,以便读者逐步学习和实践。 首先,...

    《Java通用范例开发金典》

    10. **反射**:Java反射机制允许在运行时动态地获取类的信息并操作其内部属性和方法,提高了程序的灵活性。 11. **注解**:注解是元数据的一种形式,可以用于编译时或运行时进行处理,如配置、代码生成、验证等。 ...

    设计模式 java 范例 代码

    在Java中,可以使用双检锁/双重校验锁(Double-Checked Locking)或静态内部类实现。 2. **工厂方法模式**(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。在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 常见...

    Java2范例入门与提高实例

    Java2范例入门与提高实例是一本专注于Java编程学习的资源集合,主要针对初学者和有一定基础的开发者,旨在通过实例来深入理解和掌握Java语言的关键概念和技术。在本压缩包中,我们可能找到了一系列与Java2相关的编程...

    Java范例开发大全源程序

    《Java范例开发大全源程序》是一份宝贵的资源,它涵盖了Java编程语言的广泛领域,旨在帮助开发者深入理解和掌握Java技术。这份压缩包文件包含了众多的示例代码,是学习和提升Java技能的理想资料。以下将详细介绍其中...

    JAVA语言与其程序设计范例

    封装则强调隐藏内部实现细节,提供公共接口与外界交互。多态则使得子类可以替代父类,增强了代码的灵活性和扩展性。 在Java中,集合框架是处理数据的重要工具。ArrayList、LinkedList、HashMap等都是常用的集合类,...

    java范例开发大全源代码

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

    JAVA编程模式与范例1

    《JAVA编程模式与范例1》是一本专为高级JAVA开发者设计的教程,它深入探讨了编程中的六种核心模式,并通过近200个实际的代码范例,帮助读者理解并掌握这些模式的运用。这不仅提升了学习的趣味性,也增强了实践能力。...

    Java编程模式与范例:基础开发技巧.rar

    《Java编程模式与范例:基础开发技巧》是一本深入探讨Java编程的著作,它涵盖了各种编程模式和实例,旨在帮助开发者提升技能并熟练掌握Java编程的基础技巧。在这个压缩包中,除了书籍的主文件外,还包含了辅助阅读...

    JAVA程序设计范例

    1. **类与对象**:在Java中,一切皆为对象。类是对象的蓝图,定义了对象的属性和行为。通过创建类的实例,可以生成对象。 2. **封装**:这是面向对象编程的一个重要特性,它隐藏了对象内部的细节,只对外提供公共...

    java范例开发大全

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

    Java编程模式与范例基础开发技巧

    Java编程模式与范例基础开发技巧是学习Java编程过程中至关重要的一部分。这些模式和范例不仅提供了解决问题的标准方法,还能帮助开发者提升代码的可读性、可维护性和复用性。以下是一些关于Java编程模式与范例的基础...

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

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

    JAVA编程规范与范例

    ### JAVA编程规范与范例 #### 一、详细设计命名规范 ##### 1.1 页面ID - **规范描述**:页面ID用于唯一标识系统中的每个页面,方便管理和追踪。 - **示例**:“用户管理”页面ID: `SK44200L`。 ##### 1.2 数据库...

    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完全自学手册

    15. **Lambda表达式**:自Java 8起,引入了函数式编程的概念,Lambda表达式简化了对匿名内部类的使用,尤其在处理集合操作时更为便捷。 通过《Java完全自学手册》中的习题参考答案和范例程序代码,读者可以实践上述...

Global site tag (gtag.js) - Google Analytics