构造方法 与 方法重载

在上一章博文《Java 基础讲解》中,我们了解了JAVA编程语言的优点、基本输出方法、以及八大基本类型 和 类 的概念。那么,本人在这一篇博文中位同学们介绍两个在JAVA语言中两种十分常见的手段——构造方法 和 方法重载。

首先,本人来讲解一下方法: JAVA语言中的 方法,就相当于我们在C语言中的 函数。
(在我们学习JAVA的前几节课,我想声明一点:我们学习C语言虽然有很多和JAVA语言是一致的,但是,我们要尽快将术语更正过来,不能一味地用在C语言中的习惯,只有不断汲取优良的知识,并改掉之前的略劣的思想,我们才能进步)

在了解了“方法”之后,我们现在就进入主题。

构造方法:

什么是“构造方法”呢?
在这里,本人通过一个例子来为同学们介绍。
还是上节课的屏幕点坐标的处理,我们先将上节课的代码拿出来:

SimplePoint.java:

class SimplePoint {
	int row;
	int col;

	void showPoint() {
		System.out.println("(" + row + "," + col + ")");
	}
}

DemoSimplePoint.java:

class SimplePointDemo {
	public static void main(String[] arg) {
		SimplePoint b = new SimplePoint();	
		b.row = 10;
		b.col = 20;
		b.showPoint();
	}
}

相信学习过上节课的同学们都不会对这里的代码产生任何疑惑。
那么我现在来提出一个要求:
要求在我们定义一个类的实例时,就要对其的所有成员赋值。
这个要求,对于学到目前课程的同学们来说,几乎是不可能完成的,那么,现在我来介绍一个方法,来解决这个问题——构造方法

我先来介绍一下构造方法的规则:

构造方法的规则
1.构造方法必须与类同名;
2.构造方法不能声明返回值(void也不行);
3.用户不能调用构造方法;
4.构造方法在new时被调用;
5.构造方法的主要目的,是初始化各成员的值( 若一个类如果没有写构造方法的话,就默认如下构造方法: 对所有成员以此方式赋初值: 0(byte、char、short、int、long类型)
0.0(float、double类型) false(boolean类型) null(类类型,这里可以理解类类型的变量为“指针”) )

那么,我们现在来用代码实现一下上面的要求:
SimplePoint.java:

public class  SimplePoint{
	private int row;	//private表示这个变量只能在该类中被调用。用于防止外类修改该成员
	private int col;

	public MecPoint(int x, int y) {	//这就是我们所谓的“构造方法”
		setRow(x);
		setCol(y);
	}

	public void setRow(int x) {
		if(x <= 1 || x > 25) {	//对x范围进行约束
			x = 12;
		}
		row = x;
	} 
	
	public void setCol(int y) {
		if(y <= 1 || y > 80) {	//对y范围进行约束
			y = 40;
		}
		col = y;
	}

	public void printPoint() {
		System.out.println("(" + row + "," + col +")");
	}
}

那么,以上就是构造方法的例子和规则了。
现在我们来进入第二个课题——方法重载吧!

方法重载:

方法重载,这个知识点,真的让我稍微理解到了一些“面向对象”的感觉,因为它可以让你重复定义一个方法,对于重载的不同方法,也有不同的处理方式,这就意味着,我们要求用户输入的内容不再单一,而是几乎能满足各种合法输入内容.
说了这么多,现在我来介绍下“方法重载”的规则吧:

方法重载的规则
(1)方法的名称相同;
(2)参数个数 和 参数类型 不同;
(3)返回值类型的差异并不是决定性因素; ((1)和(2)是决定性因素)
(4)只要满足(1)和(2),构造方法也可以重载。

好了,还是接上面的例子,我们现在要求用户输入一个参数还是两个参数,甚至无参或者参数是一个对象(类型是一个 类 的变量)也可以,那么相关代码如下:

SimplePoint.java:

public class  SimplePoint{
	private int row;	//private表示这个变量只能在该类中被调用。用于防止外类修改该成员
	private int col;

	public SimplePoint() {				//无参构造方法
		System.out.println("This is none argument constructor!");
		setRow(0);
		setCol(0);
	}

	public SimplePoint(int x, int y) {	//2个参数的构造方法
		System.out.println("This is 2 argument constructor!");	
		setRow(x);
		setCol(y);
	}

	public SimplePoint(int x) {			//一个参数的构造方法
		System.out.println("This is signle argument constructor!");	
		setRow(x);
		setCol(0);
	}

	public SimplePoint(SimplePoint point) {	//对象作为参数的构造方法
		System.out.println("This is object argument constructor!");	
		setRow(point.row);
		setCol(point.col);
	}

	public void setPoint(int x, int y) {
		setRow(x);
		setCol(y);
	}

	public void setPoint(int x) {
		setPoint(x, 0);
	}

	public void setPoint(SimplePoint source) {
		setPoint(source.row, source.col);
	}

	public void setRow(int x) {
		if(x <= 1 || x > 25) {	//对x范围进行约束
			x = 12;
		}
		row = x;
	} 
	
	public void setCol(int y) {
		if(y <= 1 || y > 80) {	//对y范围进行约束
			y = 40;
		}
		col = y;
	}

	public void printPoint() {
		System.out.println("(" + row + "," + col +")");
	}
}

由于本人在本人的《数据结构与算法》专栏提到过,我们写的代码,要逻辑清晰,方法(函数)功能单一,且总功能齐全,所以我们现在来优化一下上述的两个文件的代码:
MecPoint.java:
(由于本人的技术都是微易码教主倾囊相授,所以本人将该文件命名为MecPoint.java)

public class  MecPoint{
	private int row;	//private表示这个变量只能在该类中被调用。用于防止外类修改该成员
	private int col;

	public final int MIN_ROW = 1;
	public final int MAX_ROW = 25;
	public final int DEFAULT_ROW = 12;
	public final int MIN_COL = 1;
	public final int MAX_COL = 80;		//屏幕点坐标范围:共25行、80列
	public final int DEFAULT_COL = 40;  //默认屏幕点坐标错误时,设为中值	

	public MecPoint() {
		System.out.println("This is none argument constructor!");
		setRow(0);
		setCol(0);
	}

	public MecPoint(int x, int y) {
		System.out.println("This is 2 argument constructor!");
		setRow(x);
		setCol(y);
	}

	public MecPoint(int x) {	
		System.out.println("This is signle argument constructor!");	
		setRow(x);
		setCol(0);
	}

	public MecPoint(MecPoint point) {
		System.out.println("This is object argument constructor!");	
		setRow(point.row);
		setCol(point.col);
	}
	
	public void setPoint(int x, int y) {
		setRow(x);
		setCol(y);
	}

	public void setPoint(int x) {
		setPoint(x, 0);
	}

	public void setPoint(MecPoint source) {
		setPoint(source.row, source.col);
	}

	public void setRow(int x) {
		if(x <= MIN_ROW || x > MAX_ROW) {	//对x范围进行约束
			x = DEFAULT_ROW;
		}
		row = x;
	} 

	public int getRow() {
		return row;
	}
	
	public void setCol(int y) {
		if(y <= MIN_COL || y > MAX_COL) {	//对y范围进行约束
			y = DEFAULT_COL;
		}
		col = y;
	}

	public int getCol() {
		return col;
	}

	public void printPoint() {
		System.out.println("(" + row + "," + col +")");
	}
}

可以看到,我新加入了三个函数:读取横坐标、读取纵坐标、移动坐标函数,
并且编写了好多类型为“public final int”的变量,对于这里的类型,可以理解为是int型的“宏”(这个知识点本人将在今后的博文中进行详细讲解),这样我们的代码逻辑就十分清晰了!

那么,现在,具体的两个课题都已经讲解完成了,现在本人来展示下,具体怎么调用这些方法:

DemoMecPoint.java:

public class  DemoMecPoint{
	public static void main(String[] args) {
		MecPoint pointFirst = new MecPoint();
		System.out.println("演示 无参 构造结果:");
		pointFirst.printPoint();

		MecPoint pointSecond = new MecPoint(5, -7);
		System.out.println("演示 双参 构造结果:");
		pointSecond.printPoint();

		MecPoint pointThird = new MecPoint(20);
		System.out.println("演示 单参 构造结果:");
		pointThird.printPoint();

		MecPoint pointForth = new MecPoint(pointFirst);
		System.out.println("演示 对象 构造结果:");
		pointForth.printPoint();
	}
}

那么,现在本人来展示下代码的运行结果:
在这里插入图片描述

那么,到目前为止,这篇博文的所有内容就讲解完成了。
JAVA语言,相对于刚接触的同学来说,可能还会有些不适应,但是,随着深入学习,我敢保证,学懂了JAVA,同学们就会非常抵触C语言,因为JAVA实在太自由、太方便了!

若是对本片博文中的 fianl 关键字和我们一直在使用的 static 关键字有疑问的同学,请观看本人的博文——《详解 final 和 static》

posted @ 2020-03-04 21:48  在下右转,有何贵干  阅读(418)  评论(0编辑  收藏  举报