⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 b0a1c63b1175001d1dddb6604daa6ad2

📁 java程序设计教程的源码
💻
字号:
//程序清单3-2:  E3_2ParameterDemo.java
package e3_2;
public class E3_2ParameterDemo {
	public static void main(String args[]) {
		// main()静态方法只能通过类的实例引用来访问实例方法和实例变量。
		E3_2ParameterDemo e3_2PD = new E3_2ParameterDemo();
		A a1 = new A();// 声明并创建类A的实例a1
		B b1 = new B();// 声明并创建类B的实例b1
		C c1;// 声明接口C的引用c1,接口不能实例化,只能声明接口的引用变量
		c1 = new D();// 创建类D的实例并赋值给接口C的引用c1
		System.out.print("e3_2PD.m1(b1):");
// 赋值相容一:实参为形参的子类对象(若实参是为形参的子类对象,则子类对象可自转化为父类对象)
		// 此处,b1是形参类A的子类B的对象,b1对象可自动转换为A类类型的对象
		e3_2PD.m1(b1);
		System.out.print("e3_2PD.m1(a1):");
		// 赋值相容二:实参为形参的同类对象(实参对象a1是形参A类类型的同类对象)
		e3_2PD.m1(a1);
		System.out.print("第一次调用e3_2PD.m2(b1):");
		// 赋值相容二:实参为形参的同类对象(实参对象b1是形参B类类型的同类对象)
		e3_2PD.m2(b1);// 调用方法m2(),修改了对象引用实参b1的mvb属性值
		System.out.print("第二次调用e3_2PD.m2(b1):");
	// 验证对象引用作为实参的双向引用传递效果,输出第一次调用方法m2()修改b1的mvb属性后的值
		e3_2PD.m2(b1);
// 赋值相容三:实参为形参的父类对象(若实参是为形参的父类对象,则父类对象必须强制转化为子类对象)
		// 此处,a1是形参类B的父类A的对象,a1对象被强制转换为子类B的对象
		// e3_2PD.m2((B) a1);
// 可通过编译,但会产生运行时异常:java.lang.ClassCastException:
		// e3_2.A cannot be cast to e3_2.B
		a1 = e3_2PD.m3();// 调用实例e3_2PD的实例方法m3(),返回类A的对象引用并赋值给a1
		System.out.print("a1.mA1():");
		a1.mA1();// 调用实例a1的实例方法
D d1 = e3_2PD.m4();// 调用实例e3_2PD的实例方法m4(),返回类D的对象引用并赋值给d1
		// 单向值传递,对实参强制类型转换,使实参-形参赋值相容
		System.out.println("d1.arithmeticOperate(10, 10,+) = "
				+ d1.arithmeticOperate((int) 1.0, (int) 1.0, "+"));
	    c1 = e3_2PD.m5();// 调用实例e3_2PD的实例方法m5(),返回接口C的引用并赋值给c1
		// 单向值传递,实参为表达式
		System.out.println("c1.arithmeticOperate(1+2, 1+2,*) = "
				+ c1.arithmeticOperate(1 + 2, 1 + 2, "*"));
		// 若形参为接口,则实参可以为已实现了该接口的类类型
		// 此处的实参d1所属类D实现了接口C,属双向引用传递
		System.out.println("e3_2PD.m6(d1, 10, 10,/) = "
				+ e3_2PD.m6(d1, 10, 10, "/"));
	}
	void m1(A ina) { ina.mA1(); }// 形参为A类类型
	void m2(B inb) {// 形参为B类类型
		System.out.println("类B实例的成员变量 mvb = " + inb.getMvb());
		inb.setMvb(100);
	}
	// 若返回类类型,则返回的数据类型或者完全一致,或者为父类类型,此处类A是类B的父类
	A m3() {return new B(); }
	// 若返回类类型,则要求返回的数据类型或者完全一致,或者为父类类型,此处均为类D类
	D m4() { return new D(); }
	// 若返回类型为接口,则返回的数据类型必须实现该接口,此处类D实现了接口C
	C m5() {return new D(); }
	int m6(C inc, int inx, int iny, String op) {// 形参inc为接口C类型
		return inc.arithmeticOperate(inx, iny, op);
	}
}
class A { // 类A
	public void mA1() {	System.out.println("调用类A中的方法mA1()"); }
}
class B extends A {// 类B继承类A,其中mA1()方法被类B继承
	private int mvb;
	public int getMvb() {return mvb; }
	public void setMvb(int mvb) { this.mvb = mvb; 	}
}
interface C {// 接口C
// 接口中的方法只能且默认为public和abstract类型
	int arithmeticOperate(int x, int y, String op);
}
class D implements C {// 类D实现接口C
// 实现接口D中的抽象方法arithmeticOperate(),其首部应抽象方法相同
	public int arithmeticOperate(int x, int y, String op) {
		int z = 0;// z为局部变量
		if (op.equals("+"))
			z = x + y;
		else if (op.equals("-"))
			z = x - y;
		else if (op.equals("*"))
			z = x * y;
		else if (op.equals("/"))
			z = x / y;
		else
			System.out.print("操作符不对!");
		return z;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -