构造方法 与 方法重载
在上一章博文《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》