java基础之方法和方法的重载详解

一、带参方法

1.1 带参方法的定义和调用

之前定义的方法大部分都是无参方法,但是有些方法的执行是需要前提条件的,那么参数就是将这些前提条件传送过来
定义带参数的方法:

<访问修饰符> 返回值类型 <方法名称> (<形式参数列表>){
//方法的主体
}

调用带参数的方法

对象名.方法名(参数1,参数2,参数3…参数n);

定义榨汁机的类,输出详细信息

package Kind.dh;

//定义榨汁机类
public class MethodWithParameters {
    //属性:颜色 价格
    public String color;
    public double price;

    public void showInfo() {
        System.out.println("这是一台" + color + "的榨汁机,价格为:" + price + "元");
    }

    //方法:榨汁-前提:水果 杯数-形式参数(形参):参数类型 参数名称
    public void zhazhi(String fruit, int num) {
        System.out.println(num + "杯" + fruit + "汁");
    }
}
package instance.dh;

import Kind.dh.MethodWithParameters;

import java.util.Scanner;

public class MethodWithParametersTest {
    public static void main(String[] args) {
        //创建对象
        MethodWithParameters methodWithParameters = new MethodWithParameters();
        Scanner input = new Scanner(System.in);
        System.out.println("请输入您的榨汁机的颜色:");
        methodWithParameters.color = input.next();
        System.out.println("请输入您的榨汁机的价格:");
        methodWithParameters.price = input.nextDouble();
        methodWithParameters.showInfo();
        System.out.println("您想要榨什么果汁:");
        String shuiguo = input.next();
        System.out.println("您需要榨几杯果汁:");
        int num = input.nextInt();
        //这里是实际参数(实参)
        methodWithParameters.zhazhi(shuiguo, num);
    }
}

1.2 带参方法使用注意事项

方法定义处的参数叫形式参数,方法调用处传的值为实际参数
带参方法,参数个数可以有一个,也可以有多个,多个参数之间用逗号进行隔开
带参方法,参数的名字可以随意的取,符合变量命名规则
形参和实参的名字可以不一样,但是数据类型一定要一致,顺序要一样,个数要一样
方法有没有参数和方法有没有返回值没有联系

1.3 带参方法的应用

package Kind.dh;

//定义一个存放学生姓名的数组,实现添加、查找 、和显示本班的学生的信息的方法
//学员信息管理系统
public class Student02 {
    //属性:存放学生姓名的数组
    //声明学生姓名的数组
    String[] names = new String[30];

    //1.添加学生的姓名
    public void addName(String name) {
        //遍历学生姓名的数组,查询到数组中某一个元素为null则进行插入
        for (int i = 0; i < names.length; i++) {
            if (names[i] == null) {
                names[i] = name;
                break;//插入学生的姓名后退出循环
            }
        }
    }

    //2.在固定的区间内,查找某一个学生
    //start:其实查找的位置
    //end:结束查找的位置
    //name:查找的学生姓名
    public boolean searchName(int start, int end, String name) {
        boolean flag = true;//是否找到了该名学生,false没找到,反之找到了
        for (int i = start - 1; i < end; i++) {
            if (name.equals(names[i])) {
                flag = true;
                break;
            }
        }
        return flag;
    }

    //显示本班的学生信息
    public void showNames() {
        System.out.println("本班的学员列表:");
        for (int i = 0; i < names.length; i++) {
            if (names[i] != null) {
                System.out.println(names[i] + "\t");
                break;
            }
        }
    }
}
package instance.dh;

import Kind.dh.Student02;

import java.util.Scanner;

public class Student02Test {
    public static void main(String[] args) {
        Student02 student02 = new Student02();
        Scanner input = new Scanner(System.in);
        for (int i = 0; i < 5; i++) {
            System.out.println("请输入第" + (i + 1) + "个同学的姓名:");
            String name = input.next();
            student02.addName(name);
        }
        student02.showNames();
        //查找某一个学生的信息
        System.out.println("请输入要开始查找的位置:");
        int start = input.nextInt();
        System.out.println("请输入要结束查找的位置:");
        int end = input.nextInt();
        System.out.println("请输入您要查找的学生的姓名:");
        String findName = input.next();
        boolean flag = student02.searchName(start, end, findName);
        if (flag) {
            System.out.println("恭喜您已经查询到了学生的信息");
        } else {
            System.out.println("抱歉,没有查询到学生的相关信息");
        }
    }
}

1.4 基本数据类型和引用数据类型传参时的区别

定义学生类,并实现增1操作

package Kind.dh;
//学生类
public class Student {
    //属性:姓名 年龄 爱好
    public String name;
    public int age;
    public String love;

    //方法:输出个人信息
    public void showInfo() {
        System.out.println("我叫" + name + "现在" + age + "岁了" + "我的兴趣爱好是" + love);
    }
}
package Kind.dh;

public class Demo {
    public void calc1(int num) {
        num = num + 1;
    }

    public void calc2(Student student) {
        student.age = student.age + 1;
    }
}
package instance.dh;

import Kind.dh.Student;
import Kind.dh.Demo;

public class DemoTest {
    public static void main(String[] args) {
        Demo test = new Demo();
        int n = 8;
        test.calc1(n);
        Student student = new Student();
        student.age = 18;
        test.calc2(student);
        System.out.println(n + "---" + student.age);
    }
}

运行代码发现结果是8---19,但是我们想得到的是每一个结果自增1,应该是9---19才对,这是为什么呢?这是由于参数类型的不同,如果是基本数据类型(int char double boolean float),操作传递的是变量的值,改变一个变量的值不会影像另一个变量的值。但是参数如果是引用数据类型(自定义数据类型 数组 接口),赋值时是将原对象的引用(也就是内存地址)传递给另一个引用。

基本数据类型传参:

引用数据类型传参:

1.5 方法传参-对象数组

定义学生类并赋值输出学生的成绩,定义一个修改学生的成绩的类,如果学生的的成绩小于60分则进行加2

package Kind.dh;
//学生类
public class Student {
    //属性:姓名 年龄 爱好
    public String name;
    public int age;
    public String love;
    public int score;
    //方法:输出个人信息
    public void showInfo() {
//        System.out.println("我叫" + name + "现在" + age + "岁了" + "我的兴趣爱好是" + love);
        System.out.println(name+"的成绩是:"+ score);
    }
}
package Kind.dh;

//操作学生的成绩
public class ModifyScore {
    //修改小于60分的学生成绩
    public void modifyStuScore(Student[] stus) {
        for (int i = 0; i < stus.length; i++) {
            if (stus[i].score < 60) {
                stus[i].score += 2;
            }
        }
    }

    //显示本组学生成绩信息
    public void showStu(Student[] stus) {
        for (Student stu : stus) {
            stu.showInfo();
        }
    }
}
package instance.dh;

import Kind.dh.ModifyScore;
import Kind.dh.Student;

public class ModifyScoreTest {
    public static void main(String[] args) {
        ModifyScore modifyScore = new ModifyScore();
        //定义一个学生对象的数组
        Student student1 = new Student();
        student1.name = "张三";
        student1.score = 43;
        Student student2 = new Student();
        student2.name = "李四";
        student2.score = 59;
        Student student3 = new Student();
        student3.name = "王五";
        student3.score = 90;
        Student[] students = new Student[3];
        students[0] = student1;
        students[1] = student2;
        students[2] = student3;
        //显示学生的信息、修改学生的成绩
        System.out.println("成绩修改前:");
        modifyScore.showStu(students);
        modifyScore.modifyStuScore(students);
        System.out.println("成绩修改后:");
        modifyScore.showStu(students);
    }
}

二、构造方法

new一个对象的时候要用到构造函数,例如Student student1 = new Student();这时调用的是Hello的无参数构造方法
构造方法是用来完成对象的初始化的,但是通常在代码中不需要手动书写,这是因为系统提供了默认的无参的构造方法。由于构造方法也属于方法的范畴,可见构造方法也可以指定参数。

构造方法的格式如下:

访问修饰符 构造方法名 (){
//初始化代码
}

需要我们值得注意的是构造方法没有返回值类型,并且方法名和类名是相同的。有返回值类型的方法是常用的普通方法

package Kind.dh;

//学生类
public class Student {
    //属性:姓名 年龄 爱好
    public String name;
    public int age;
    public String love;
    public int score;

    //系统会自动生成一个无参构造方法
    /*
     public Student(){
        //对象初始化代码
    }
    */
    //可以在构造方法中添加参数
    /*
    public Student(String name,int score){
        name = name;
        score = score;
    }
    */
    //可以理解为这段代码
    /*
     public Student(String n,int s){
        name = n;
        score = s;
    }
    */
    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }

    //方法:输出个人信息
    public void showInfo() {
//        System.out.println("我叫" + name + "现在" + age + "岁了" + "我的兴趣爱好是" + love);
        System.out.println(name + "的成绩是:" + score);
    }
}
package Kind.dh;

//操作学生的成绩
public class ModifyScore {
    //修改小于60分的学生成绩
    public void modifyStuScore(Student[] stus) {
        for (int i = 0; i < stus.length; i++) {
            if (stus[i].score < 60) {
                stus[i].score += 2;
            }
        }
    }

    //显示本组学生成绩信息
    public void showStu(Student[] stus) {
        for (Student stu : stus) {
            stu.showInfo();
        }
    }
}
package instance.dh;

import Kind.dh.ModifyScore;
import Kind.dh.Student;

public class ModifyScoreTest {
    public static void main(String[] args) {
        ModifyScore modifyScore = new ModifyScore();
        //定义一个学生对象的数组
        //在这里就实现了对象的初始化和赋值
        Student student1 = new Student("张三", 43);
//        student1.name = "张三";
//        student1.score = 43;
        Student student2 = new Student("李四", 59);
//        student2.name = "李四";
//        student2.score = 59;
        Student student3 = new Student("王五", 90);
//        student3.name = "王五";
//        student3.score = 90;
        Student[] students = new Student[3];
        students[0] = student1;
        students[1] = student2;
        students[2] = student3;
        //显示学生的信息、修改学生的成绩
        System.out.println("成绩修改前:");
        modifyScore.showStu(students);
        modifyScore.modifyStuScore(students);
        System.out.println("成绩修改后:");
        modifyScore.showStu(students);
    }
}

代码中有这样的一段:

public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }

这里的this关键字是代指当前对象

Student student1 = new Student("张三", 43);
Student student2 = new Student("李四", 59);
Student student3 = new Student("王五", 90);

所谓的当前对象指的是Student类经过实例化出的student1,student2,student3。程序执行创建了student1时,this代指的是student1;创建了student2时,this代指的是student2这个对象。
如果代码中自定义了带参的构造方法后,系统不会再提供无参构造方法了

2.1 this的其他用法

this可以调用类中的普通方法和构造方法

package Kind.dh;

//学生类
public class Student {
    //属性:姓名 年龄 爱好
    public String name;
    public int age;
    public String love;
    public int score;

    //系统会自动生成一个无参构造方法
    /*
     public Student(){
        //对象初始化代码
    }
    */
    //可以在构造方法中添加参数
    /*
    public Student(String name,int score){
        name = name;
        score = score;
    }
    */
    //可以理解为这段代码
    /*
     public Student(String n,int s){
        name = n;
        score = s;
    }
    */
    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }

    //方法:输出个人信息
    public void showInfo() {
//        System.out.println("我叫" + name + "现在" + age + "岁了" + "我的兴趣爱好是" + love);
        System.out.println(name + "的成绩是:" + score);
    }
    public void method1(){
//      showInfo();
        //this可以调用普通方法
        this.showInfo();
    }
    public Student(String name,int score,int age){
        /*
        this.name = name;
        this.score = score;
        this.age = age;
        */
        //上述代码等同于
        this(name, score);
        this.age= age;
        //需要注意的是this调用构造方法时一定要写在第一句中。
    }
}

三、方法重载

方法分为了普通方法和构造方法,所以方法重载也相应的分为了普通方法重载和构造方法重载

  • 构造方法重载:

方法名相同
参数项不同
和返回值、访问修饰符无关

  • 普通方法重载

需要在同一个类中
方法名相同
参数个数或者是类型不同
和返回值、访问修饰符无关

  • 实现简易计算器,分别实现两个整数、两个浮点数、三个浮点数进行相加的操作
package Kind.dh;

//实现简易计算器
public class Calc {
    //实现两个整数相加操作
    public void add(int num1, int num2) {
        int sum = num1 + num2;
        System.out.println(num1 + " + " + num2 + " = " + sum);
    }

    //实现两个浮点数进行相加
    public void add(double num1, double num2) {
        double sum = num1 + num2;
        System.out.println(num1 + " + " + num2 + " = " + sum);
    }

    //实现三个浮点数进行相加操作
    public void add(double num1, double num2, double num3) {
        double sum = num1 + num2 + num3;
        System.out.println(num1 + " + " + num2 + " + " + num3 + " = " + sum);
    }
}
package instance.dh;

import Kind.dh.Calc;

public class CalcTest {
    public static void main(String[] args) {
        Calc calc = new Calc();
        calc.add(2, 8);
        calc.add(2.3, 78.9);
        calc.add(23.4, 67.8, 90.8);
    }
}

其实System.out.println();就是一个方法重载。

3.1 成员变量和局部变量

变量声明的位置决定变量的作用域,变量的作用域确定可以在程序中按照变量名称访问该变量的区域。
成员变量和局部变量的区别:

  • 作用域不同

局部变量的作用在它的方法中
成员变量(全局变量)作用在整个类中

  • 初始值不同

java会给成员变量一个初始值
java不会给局部变量赋初始值

  • 注意:

在同一个方法中,不允许有同名称的局部变量
在不同的方法中,可以有同名称的局部变量
在同一个类中,成员变量和局部变量同名称时,局部变量具有更高的优先级

package cn.zhz.Test.dh;

public class Var {
    //属性:这里的是成员变量 全局变量
    //定义成员变量num和s
    //系统默认给成员变量进行赋初始值,如果是int就是0,String就是null,double就是0.0
    int num;
    String s;
    //在同一个类中,局部变量可以和全局变量同名称,但是同名的时候局部变量的优先级会更高一些
    int var = 9;

    //方法:这里的是成员方法
    public void m1() {
        //这里的a的作用域在m1中
        int a = 1;
        for (; a <= 5; a++) {
            System.out.println("hello");
        }
    }

    public void m2() {
        //这里的a的作用域在for循环中
        for (int b = 1; b <= 5; b++) {
            System.out.println(b);
        }
    }

    public void m3() {
        System.out.println(num);
        System.out.println(s);
    }

    //参数也是一种变量,它做的是局部变量
    public void m4(int num) {
        System.out.println("num = " + num);
    }

    public static void main(String[] args) {
//        //可以通过扩大a的变量范围来解决,此时a的作用域在main方法中
//        int a = 0;
//        for(;a <= 4;a ++){
//            System.out.println("hello");
//        }
//        System.out.println(a);//系统会找不到变量a
    }
}

到此这篇关于java基础之方法和方法的重载详解的文章就介绍到这了,更多相关java方法和方法的重载内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java的this关键字的使用与方法的重载相关知识

    Java this关键字详解 this 关键字用来表示当前对象本身,或当前类的一个实例,通过 this 可以调用本对象的所有方法和属性.例如: public class Demo{ public int x = 10; public int y = 15; public void sum(){ // 通过 this 点取成员变量 int z = this.x + this.y; System.out.println("x + y = " + z); } public static vo

  • JAVA的LIST接口的REMOVE重载方法调用原理解析

    前言 说真的,平常看源码都是自己看完自己懂,很少有写出来的冲动. 但是在写算法的时候,经常用到java中各种集合,其中也比较常用到remove方法. remove有重载函数,分别传入参数是索引index或者数据Object(指定泛型后自动转换),如果指定泛型是其他数据类型还好,但是指定的是Integer或者是int的话,或者就有点懵了. 这曾经也困惑过我,所以我就唯有用实践解惑了. 测试类设计 测试类一 public class Text { public void remove(int ind

  • 详解Java使用super和this来重载构造方法

    详解Java使用super和this来重载构造方法 实例代码: //父类 class anotherPerson{ String name = ""; String age = ""; public String getAge() { return age; } public void setAge(String age) { this.age = age; } public void setName(String name){ this.name = name;

  • Java的方法重载与变量作用域简介

    方法的重载 上面使用的max方法仅仅适用于int型数据.但如果你想得到两个浮点类型数据的最大值呢? 解决方法是创建另一个有相同名字但参数不同的方法,如下面代码所示: public static double max(double num1, double num2) { if (num1 > num2) return num1; else return num2; } 如果你调用max方法时传递的是int型参数,则 int型参数的max方法就会被调用: 如果传递的事double型参数,则doub

  • Java方法重载实现原理及代码实例

    方法的重载 重载就是在一个类中,有相同的函数名称,但形参不同的函数 方法重载的规则: 方法名称必须相同 参数列表必须不同(个数不同,类型不同,参数排列顺序不同) 方法的返回值类型可以相同也可以不相同 仅仅返回类型不同不足以成为方法的重载 实现理论 方法名称相同时,编译器会根据调用方法的参数个数,参数类型等去诸葛匹配,以选择对应的方法,如果匹配失败,则编译器报错 以比大小为例 package com.Xujie.Day09; public class Java09_01 { public stat

  • 简单谈谈Java中的方法和方法重载

    今天我们就讲一点内容,来说说Java中的方法和方法重载以及需要注意的一些地方: 方法: Java的方法类似与其他语言的函数,是一段用来完成特定功能的代码片段, 声明格式: [修饰符1 修饰符2 ....] ,返回值类型 方法名 (形式参数列表) { Java语句: - - -} 形式参数:在方法被调用时用于接受外界输入的数据: 实参: 调用方法时世界传给方法的数据: 返回值: 方法在执行完毕后返回给调用他的环境的数据: 返回值类型: 事先约定好的返回值的数据类型,如无返回值必须给出返回值类型vo

  • java必学必会之方法的重载(overload)

    一.方法的重载 方法名一样,但参数不一样,这就是重载(overload). 所谓的参数不一样,主要有两点:第一是参数的个数不一样,第二是参数的类型不一样.只要这两方面有其中的一方面不一样就可以构成方法的重载了. package cn.galc.test; public class TestOverLoad { void max(int a, int b) { System.out.println(a > b ? a : b); } /* * int max(int a, int b) { * r

  • 浅谈java实现重载的方法

    重载(重新载选方法): java允许在一个类中,存在多个方法拥有相同的名字,但在名字相同的同时,必须有不同的参数,这就是重载,编译器会根据实际情况挑选出正确的方法,如果编译器找不到匹配的参数或者找出多个可能的匹配就会产生编译时错误,这个过程被称为重载的解析. 重载包括:普通方法的重载和构造方法的重载 方法:即函数(文中我们统称之为"方法"),是一个固定的一个程序段,或称其为一个子程序,它在可以实现固定运算功能.而且,同时还带有一个入口和一个出口,所谓的入口,就是函数所带的各个参数,我们

  • Java方法重载的使用实战案例

    本文实例讲述了Java方法重载的使用.分享给大家供大家参考,具体如下: 一 重载方法valueOf的使用实战 1 代码 import java.lang.String ; public class OverloadValueOf { public static void main(String args[]){ byte num_byte = 12; short num_short = 34; int num_int = 12345; float num_float = 12.34f; bool

  • 解析Java继承中方法的覆盖和重载

    方法的覆盖 在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称.返回值类型.参数列表. 如果在新类中定义一个方法,其名称.返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法. 参数列表又叫参数签名,包括参数的类型.参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同. 被覆盖的方法在子类中只能通过super调用. 注意:覆盖不会删除父类中的方法,而是对子类的实例隐藏,暂时不使用. 请看下面的例子: public c

  • 详解Java中方法重写与重载的区别(面试高频问点)

    Java中方法重写与重载的区别 重 写 重 载 子类方法对父类方法的覆盖 同一个类中同名方法的重载(同一类包括从父类继承的方法) 方法名相同且参数个数类型顺序相同 参数个数或类型顺序至少满足一点不同 只允许访问权限更宽松 访问权限任意 返回值类型若是基本类型则不允许不同:若是复合类型则在子类与父类间必须至少存在继承关系 返回值类型任意 final修饰的父类,子类不能重写,反之可以 final任意 静态方法与实例方法不能互相重写 任意 构造方法不能被重写 构造方法可以重载,任意 一句话描述清楚:

  • 浅谈java中的对象、类、与方法的重载

    对象: 一切皆为对象. 对象包括两部分内容:属性(名词形容词),行为(动词). 对象和对象之间是有关系的: 派生,关联,依赖. 类: 对同一类别的众多对象的一种抽象. 类,还是用来生成对象的一种模板,对象是类的一种具体化的表现. 面向对象的三大特性:封装,继承,多态. class 类名{ 访问修饰符 成员变量的定义; 访问修饰符 成员函数(方法)的定义; } 访问修改符:默认不写,private,public. private,私有.只能被当前class 类名{}中的代码访问到.出了这个类的{}

  • Java方法重载和重写原理区别解析

    一.方法重写(0verride) 在Java 程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量. 子类可以定义新的特征,当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这样一种操作方法称为重写,也可以叫覆写或覆盖. 所以,所谓方法的重写是指子类中的方法和父类中继承的方法有完全相同的返回值类型.方法名.参数个数和参数类型.这样就可以实现对父类方法的覆盖. 如果子类将父类的方法重写了,调用的时候肯定是调用被重写过的子类的方法,但是

  • 带你深入概括Java!六、方法和方法重载!(推荐)

    一. 掌握方法和参数语法和反回值语 方法的分类: – 1. 无参无返(没有参数列表,没有返回值)单纯的作为 功能代码的聚合使用 便于功能复用. – 2.无参有返(没有参数列表,有返回值)例如: 我需要每次生成一个随机卡号 – 3.有参无返(有参数列表 没有返回值) 适用于功能需要根据参数来进行计算的情况,但是计算的最终结果又无需返回处理 – 4. 有参有返(有参数列表,有返回值)适用于功能需要根据参数来进行计算的情况,而且最终的结果需要被我们拿到(返回处理) 方法的形参和实参: 形参 :是定义在

  • java中的方法重载知识点总结

    什么是方法的重载? 方法重载是以统一的方式处理不同数据类型的一种手段. 怎样构成方法的重载? 方法名相同, 形参不同.而形参的不同又表示在: 1). 形参的个数不同 2). 形参的类型不同 3). 形参的顺序不同方法的重载主要是结局同一个方法,但参数不同的问题 举一个例子,比较两个整数的大小 和比较两个浮点数的大小 public class Testmax { /** 主方法 */ public static void main(String[] args) { int i = 5; int j

  • Java方法重载Overload原理及使用解析

    这篇文章主要介绍了Java方法重载Overload原理及使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 为什么要用方法重载: 对于功能类似的方法来说,因为参数列表不一样,如果定义不同名称的方法,太麻烦且难以记忆. 为了解决这个问题,引入方法的重载. 重载的定义: 多个方法的名称一样,但参数列表不一样. 不使用方法重载 定义三个功能类似的方法 public class TestOverload { public static int su

随机推荐