📄 e3_2parameterdemo.java
字号:
/*
* 【例3-2】 成员方法的定义与使用,包括方法参数的赋值相容与传递、返回值类型和局部变量等。
* 其中类B继承类A,类D实现接口C,类E3_2ParameterDemo为主类,它依赖(使用)类A、类B和类D,
* 其类图如图3-21所示。
*/
//程序清单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 + -