5.2、编写一个调用对象方法的程序
(1) 程序功能:通过调用对象的方法在方法调用后修改了成员变量的值。 (2) 程序源代码如下。
class EXP3_6 { public static void main(String[] args) { Power p=new Power(); p.ff2(10,10); System.out.println(\方法调用后 x=\ } } class Power{ int x=10, y=10; void ff2(int passX, int passY) { System.out.println(\初始时 x=\ x=passX*passX; y=passY*passY; System.out.println(\方法调用中 x=\ } } (3) 编译并运行,结果如图3.6。
图 3.6
6、 类的继承性练习
新类可从现有的类中产生,并保留现有类的成员变量和方法并可根据需要对它们
加以修改。新类还可添加新的变量和方法。这种现象就称为类的继承。
当建立一个新类时,不必写出全部成员变量和成员方法。只要简单地声明这个类是从一个已定义的类继承下来的,就可以引用被继承类的全部成员。被继承的类称为父类或超类(superclass),这个新类称为子类。
Java 提供了一个庞大的类库让开发人员继承和使用。设计这些类是出于公用的目的,因此,很少有某个类恰恰满足你的需要。你必须设计自己的能处理实际问题的类,如果你设计的这个类仅仅实现了继承,则和父类毫无两样。所以,通常要对子类进行扩展,即添加新的属性和方法。这使得子类要比父类大,但更具特殊性,代表着一组更具体的对象。继承的意义就在于此。 6.1、 创建将被继承的类 (1) 程序源代码如下。 public class EXP3_7 { protected String xm; //具有保护修饰符的成员变量 protected int xh; void setdata(String m,int h) //设置数据的方法 { xm =m; xh = h; } public void print() //输出数据的方法 { System.out.println(xm+\ } } (2) 编译源程序。 6.2、 创建将被继承的类
(1) 程序功能:通过EXP3_7类产生子类EXP3_8,其不仅具有父类的成员变量xm(姓名)、xh(学号),还定义了新成员变量xy(学院)、xi(系)。在程序中调用了父类的print 方法,同时可以看出子类也具有该方法。 (2) 程序源代码如下。
class EXP3_8 extends EXP3_7{ protected String xy; protected String xi; public static void main(String args[]){ EXP3_7 p1 = new EXP3_7(); p1.setdata(\李四\ p1.print(); EXP3_8 s1 = new EXP3_8() ; s1.setdata(\张三\调用父类的成员方法 s1.xy=\成都信息工程学院\访问本类的成员变量 s1.xi=\计算机系\访问本类的成员变量 s1.print(); System.out.print(s1.xm+\ } } (4) 编译并运行,结果如图3.7所示。
图 3.7
6.3、 了解成员方法的覆盖方式
通过继承子类可以继承父类中所有可以被子类访问的成员方法,但如果子类的方法与父类方法同名,则不能继承,此时称子类的方法覆盖了父类的方法,简称为方法覆盖(override)。方法覆盖为子类提供了修改父类成员方法的能力。例如,子类可以修改层层继承下来的Object 根类的toString 方法,让它输出一些更有用的信息。下面的程序显示了在子类Circle 中添加toString 方法,用来返回圆半径和圆面积信息。 (1) 编写覆盖Object 类toString方法的程序文件EXP3_9.java,源代码如下。 class Circle { private int radius; Circle(int r) { setRadius(r); } public void setRadius(int r) { radius=r; } public int getRadius() { return radius; } public double area() { return 3.14159*radius*radius; } public String toString() { return \圆半径:\圆面积:\ } } public class EXP3_9{ public static void main(String args[]) { Circle c=new Circle(10); System.out.println(\ } }
(2) 编译并运行,结果如图3.8所示。
图 3.8
6.3、 this、super和super()的使用
(1) 程序功能:程序功能:说明this、super 和super()的用法。程序首先定义Point(点)
类,然后创建点的子类Line(线)。最后通过LX3_10 类输出线段的长度。程序中通过super(a,b)调用父类Point 的构造方法为父类的x 和y 赋值。在子类Line 的setLine方法中,因为参数名和成员变量名相同,为给成员变量赋值,使用this 引
用,告诉编译器是为当前类的成员变量赋值。在length 和toString 方法中使用父类成员变量时,使用super 引用,告诉编译器使用的是父类的成员变量。 (2) 程序源代码如下。
class Point {
protected int x, y; Point(int a, int b) { setPoint(a, b); }
public void setPoint(int a, int b) { x=a; y=b; } }
class Line extends Point { protected int x, y; Line(int a, int b) { super(a, b); setLine(a, b); }
public void setLine(int x, int y) { this.x=x+x; this.y=y+y; }
public double length() {
int x1=super.x, y1=super.y, x2=this.x, y2=this.y;
return Math.sqrt((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1)); }
public String toString() {
return \直线端点:[\ x + \直线长度:\ } }
public class EXP3_10{
public static void main(String args[]) { Line line=new Line(50, 50);
System.out.println(\ } }
(3) 编译并运行,结果如图3.9。