构造方法 与 方法重载

在上一章博文《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》

猜你喜欢

转载自www.cnblogs.com/codderYouzg/p/12416426.html
今日推荐