java_方法重载、可变参数、作用域

方法重载

基本介绍

java 中允许同一个类中,多个同名方法的存在,但要求 形参列表不一致!
比如:System.out.println(); out 是 PrintStream 类型

重载的好处

  1. 减轻了起名的麻烦
  2. 减轻了记名的麻烦

案例

public class OverLoad01 {
    //编写一个 main 方法
    public static void main(String[] args) {
        // System.out.println(100);
        // System.out.println("hello,world");
        // System.out.println('h');
        // System.out.println(1.1);
        // System.out.println(true);
        //
        MyCalculator mc = new MyCalculator();
        System.out.println(mc.calculate(1, 2));
        System.out.println(mc.calculate(1.1, 2));
        System.out.println(mc.calculate(1, 2.1));
    }
}
class MyCalculator {
    //下面的四个 calculate 方法构成了重载
    //两个整数的和
    public int calculate(int n1, int n2) {
        System.out.println("calculate(int n1, int n2) 被调用");
        return n1 + n2;
    }

    //没有构成方法重载, 仍然是错误的,因为是方法的重复定义
    // public void calculate(int n1, int n2) {
    // System.out.println("calculate(int n1, int n2) 被调用");
    // int res = n1 + n2;
    // }

    //看看下面是否构成重载, 没有构成,而是方法的重复定义,就错了
    // public int calculate(int a1, int a2) {
    // System.out.println("calculate(int n1, int n2) 被调用");
    // return a1 + a2;
    // }

    //一个整数,一个 double 的和
    public double calculate(int n1, double n2) {
        return n1 + n2;
    }

    //一个 double ,一个 Int 和
    public double calculate(double n1, int n2) {
        System.out.println("calculate(double n1, int n2) 被调用..");
        return n1 + n2;
    }

    //三个 int 的和
    public int calculate(int n1, int n2,int n3) {
        return n1 + n2 + n2;
    }
}

注意事项和使用细节

在这里插入图片描述

练习题

在这里插入图片描述

public class OverLoadExercise {
    //编写一个 main 方法
    public static void main(String[] args) {
    
        Methods method = new Methods();
        method.m(10);
        method.m(10,20);
        method.m("您好 Hello");

        // 测试  筛选最大值
        System.out.println(method.max(10,24));
        System.out.println(method.max(10.0,21.4));
        System.out.println(method.max(10.0,1.4,30.0));
    }
}

class Methods {

/*定义三个重载方法 max(),第一个方法,返回两个 int 值中的最大值,
第二个方法,返回两个 double 值中的最大值,
第三个方法,返回三个 double 值中的最大值,并分别调用三个方法 */

    public int max(int n1,int n2){
        return n1>n2 ? n1; n2;
    }
    
    public double max(double n1,double n2) {
        return n1>n2 ? n1; n2;
    }

    public double max(double n1,double n2,double n3) {
        System.out.println("max(double n1, double n2, double n3)");
        double max1 =  n1>n2 ? n1; n2;
        return max1>n3?max1;n3;
    }

    public double max(double n1,double n2,int n3) {
        System.out.println("max(double n1, double n2, int n3)");
        double max1 = n1>n2 ? n1; n2;
        return max1>n3?max1;n3;
    }

    /* 编写程序,类 Methods 中定义三个重载方法并调用。方法名为 m。
    三个方法分别接收一个 int 参数、两个 int 参数、一个字符串参数。分别执行平方运算并输出结果,
    相乘并输出结果,输出字符串信息。在主类的 main ()方法中分别用参数区别调用三个方法 */

    public void m(int n) {
        System.out.println("平方=" + (n*n));
    }

    public void m(int n1,int n2) {
        System.out.println("相乘=" + (n1*n2));
    }

    public void m(String str) {
        System.out.println("传入的str = " + str);
    }
}

可变参数

基本概念

java 允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。就可以通过可变参数实现

基本语法

访问修饰符 返回类型 方法名(数据类型… 形参名) {
}

案例

看一个案例 类 HspMethod,方法 sum 【可以计算 2 个数的和,3 个数的和 , 4. 5, 。。】

public class VarParameter01 {
  
    //编写一个 main 方法
    public static void main(String[] args) {
        HspMethod m = new HspMethod();
        System.out.println(m.sum(1, 5, 100)); //106
        System.out.println(m.sum(1,19)); //20
    }
}

class HspMethod {
    //可以计算 2 个数的和,3 个数的和 , 4. 5, 。。
    //可以使用方法重载
    // public int sum(int n1, int n2) {
        //2 个数的和
        // return n1 + n2;
    // }
    // public int sum(int n1, int n2, int n3) {
        //3 个数的和
        // return n1 + n2 + n3;
    // }
    // public int sum(int n1, int n2, int n3, int n4) {
        //4 个数的和
        // return n1 + n2 + n3 + n4;
    // }

    //..... 
    //上面的三个方法名称相同,功能相同, 参数个数不同-> 使用可变参数优化
    //1. int... 表示接受的是可变参数,类型是 int ,即可以接收多个 int(0-多)
    //2. 使用可变参数时,可以当做数组来使用 即 nums 可以当做数组
    //3. 遍历 nums 求和即可

    public int sum(int... nums) {
        //System.out.println("接收的参数个数=" + nums.length);
        int res = 0;
        for(int i = 0; i < nums.length; i++) { 
            res +=nums[i];
        }
        return res; 
    } 
}

注意事项和使用细节

在这里插入图片描述

public class VarParameterDetail {
    public static void main(String[] args) {
        int[] arr = {1,2,34};
        T t1 = new T();
        t1.f1(arr);
    }
}

class T {


    //
    public void f1(int... sum){
        System.out.println(sum.length);
    }

    // 细节:可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后
    public void f2(String str, double... nums) {

    }
    // 细节:一个形参列表中只能出现一个可变参数
    // 下面的写法是错误的
    public void f3(int... nums1,int... nums2) {

    }


}

练习

在这里插入图片描述

public class VarParameterExercise {
    public static void main(String[] args) {
        HspMethod hm =  new HspMethod();
        System.out.println(hm.showScore("milan",90.1,80.0));
        System.out.println(hm.showScore("jerry",90.1,80.0,10,30.5,70));

    }
}

class HspMethod {
    public String showScore(String name,double... scores) {

        double totalScore = 0;
        for(int i = 0;i<scores.length;i++) {
            totalScore += scores[i];
        }
        return name + "有 " + scores.length + " 门课的成绩总分为 " + totalScore;
    }
}

作用域

基本介绍

在这里插入图片描述

public class VarScope {
    public static void main(String[] args) {
        Cat cat1 = new Cat();
        cat1.hi();
        cat1.cry();
        cat1.eat();
    }
}

class Cat {
    //全局变量:也就是属性,作用域为整个类体 Cat 类:cry eat 等方法使用属性
    //属性在定义时,可以直接赋值
    int age = 10; //指定的值是 10
    //全局变量(属性)可以不赋值,直接使用,因为有默认值,
    double weight; //默认值是 0.0
    public void hi() {
    //局部变量必须赋值后,才能使用,因为没有默认值
        int num = 1;
        String address = "北京的猫";
        System.out.println("num=" + num);
        System.out.println("address=" + address);
        System.out.println("weight=" + weight);//属性
    }
    public void cry() {
        //1. 局部变量一般是指在成员方法中定义的变量
        //2. n 和 name 就是局部变量
        //3. n 和 name 的作用域在 cry 方法中
        int n = 10;
        String name = "jack";
        System.out.println("在 cry 中使用属性 age=" + age);
    }

    public void eat() {
        System.out.println("在 eat 中使用属性 age=" + age);
        //System.out.println("在 eat 中使用 cry 的变量 name=" + name);//错误
    }
}

在这里插入图片描述

注意事项和使用细节

在这里插入图片描述
在这里插入图片描述

public class VarScopeDetail {

    //编写一个 main 方法
    public static void main(String[] args) {
        Person p1 = new Person();
        /*
        属性生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁。
        局部变量,生命周期较短,伴随着它的代码块的执行而创建,
        伴随着代码块的结束而销毁。即在一次方法调用过程中
        */
        //p1.say();//当执行 say 方法时,say 方法的局部变量比如  name,会创建,当   say 执行完毕后
        //name 局部变  量就销毁,但是属性(  全局变量)仍然可以使用
        //
        T t1 = new T();
        t1.test(); //第 1 种跨类访问对象属性的方式
        t1.test2(p1);//第 2 种跨类访问对象属性的方式
    }
}

class T {
    //全局变量/属性:可以被本类使用,或其他类使用(通过对象调用)
    public void test() {
        Person p1 = new Person();
        System.out.println(p1.name);//jack
    }

    public void test2(Person p) {
        System.out.println(p.name);//jack
    }
}

class Person {
    //细节: 属性可以加修饰符(public protected private..)
    // 局部变量不能加修饰符
    public int age = 20;
    String name = "jack";

    public void say() {
        //细节 属性和局部变量可以重名,访问时遵循就近原则
        String name = "king";
        System.out.println("say() name=" + name);
    }
    public void hi() {
        String address = "北京";
        //String address = "上海";//错误,重复定义变量
        String name = "hsp";//可以
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/903229.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SCI一区级 | Matlab实现SSA-TCN-LSTM-Attention多变量时间序列预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.基于SSA-TCN-LSTM-Attention麻雀搜索算法优化时间卷积长短期记忆神经网络融合注意力机制多变量时间序列预测&#xff0c;要求Matlab2023版以上&#xff0c;自注意力机制&#xff0c;一键单头注意力机制替换成多头注…

leetcode刷题(76-80)

算法是码农的基本功&#xff0c;也是各个大厂必考察的重点&#xff0c;让我们一起坚持写题吧。 遇事不决&#xff0c;可问春风&#xff0c;春风不语&#xff0c;即是本心。 我们在我们能力范围内&#xff0c;做好我们该做的事&#xff0c;然后相信一切都事最好的安排就可以啦…

深度生成模型 - 受限玻尔兹曼机(RBM)篇

前言 受限玻尔兹曼机&#xff08; Restricted Boltzmann Machine&#xff0c;RBM \text{Restricted Boltzmann Machine&#xff0c;RBM} Restricted Boltzmann Machine&#xff0c;RBM&#xff09;是深度学习领域中的一种重要模型&#xff0c;其起源于统计物理学&#xff0c;由…

【再谈设计模式】单例模式~唯一性的守护者

一、引言 在软件工程中&#xff0c;软件开发&#xff0c;设计模式是提高代码复用性和可维护性的有效工具。单例模式&#xff08;Singleton Pattern&#xff09;作为一种创建型设计模式&#xff0c;旨在确保一个类只有一个实例&#xff0c;并提供对该实例的全局访问。这一模式在…

如何在 Elasticsearch Ruby 客户端中使用 ES|QL Helper

作者&#xff1a;来自 Elastic Fernando Briano 了解如何使用 Elasticsearch Ruby 客户端编写 ES|QL 查询并处理其结果。 简介 Elasticsearch Ruby 客户端可用于编写 EQ|QL 查询&#xff0c;使处理从 esql.query 返回的数据更加容易。ES|QL 允许开发人员通过查询过滤、转换和分…

redis详细教程(3.ZSet,Bitmap,HyperLogLog)

ZSet Redis 的 ZSet&#xff08;有序集合&#xff09;是一种特殊的数据类型&#xff0c;它允许存储一系列不重复的字符串元素&#xff0c;并为每个元素关联一个分数&#xff08;score&#xff09;。这个分数用于对集合中的元素进行排序。ZSet 的特点是&#xff1a; 唯一性&am…

MYSQL-SQL-03-DQL(Data Query Language,数据查询语言)(单表查询)

DQL&#xff08;数据查询语言&#xff09; DQL英文全称是Data Query Language(数据查询语言)&#xff0c;数据查询语言&#xff0c;用来查询数据库中表的记录。 查询关键字: SELECT 在一个正常的业务系统中&#xff0c;查询操作的频次是要远高于增删改的&#xff0c;当我们去访…

Cisco Packet Tracer 8.0 路由器的基本配置和Telnet设置

文章目录 构建拓扑图配置IP地址配置路由器命令说明测试效果 构建拓扑图 1&#xff0c;添加2811路由器。 2&#xff0c;添加pc0。 3&#xff0c;使用交叉线连接路由器和pc&#xff08;注意线路端口&#xff09;。 4&#xff0c;使用配置线连接路由器和pc&#xff08;注意线路…

优化网站结构提升用户体验的关键要素

内容概要 在数字时代&#xff0c;网站的架构和用户体验密切相关。一个合理的网站结构不仅能帮助用户快速找到所需信息&#xff0c;还能提升整体的访问满意度。为了达到这一目的&#xff0c;网站需要强调几个关键要素。 首先&#xff0c;清晰的导航设计至关重要。导航应当直观…

Android Gradle

#1024程序员节&#xff5c;征文# Gradle 是一款强大的自动化构建工具&#xff0c;广泛应用于 Android 应用开发。它通过灵活的配置和丰富的插件系统&#xff0c;为项目构建提供了极大的便利。本文只是简单的介绍 Gradle 在 Android 开发中的使用&#xff0c;包括其核心概念、构…

微积分复习笔记 Calculus Volume 1 - 3.8 Implicit Differentiation

3.8 Implicit Differentiation - Calculus Volume 1 | OpenStax

Java——lambda表达式和StreamAPI

一、lambda 1. lambda表达式 1.1 Lambda表达式的使用举例: (o1,02)->Integer.compare(o1,o2); 1.2 Lambda表达式的格式举例: Lambda形参列表->lambda 1.3 Lambda表达式的格式 lambda操作符或箭头操作符 的左边:lambda形参列表&#xff0c;对应着要重写的接口中的…

django游戏门户系统

想做毕业设计但还没有头绪&#xff1f;&#x1f64b;‍♂️django游戏门户系统了解一下&#xff01;这个系统不仅功能全面&#xff0c;还能轻松解决你的项目选题难题&#xff01; 我们这个基于Django开发的游戏门户系统提供了用户注册、登录、内容发布以及管理功能&#xff0c…

大数据日志处理框架ELK方案

介绍应用场景大数据ELK日志框架安装部署 一&#xff0c;介绍 大数据日志处理框架ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;是一套完整的日志集中处理方案&#xff0c;以下是对其的详细介绍&#xff1a; 一、Elasticsearch&#xff08;ES&#xff09; 基本…

【SQL实验】表的更新和简单查询

完整代码在文章末尾 在上次实验创建的educ数据库基础上&#xff0c;用SQL语句为student表、course表和sc表中添加以下记录 【SQL实验】数据库、表、模式的SQL语句操作_创建一个名为educ数据库,要求如下: (下面三个表中属性的数据类型需要自己设计合适-CSDN博客在这篇博文中已经…

LeetCode反转链表

题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例 3&#…

011:软件卸载工具TotalUninstall安装教程

摘要&#xff1a;本文详细介绍软件卸载工具TotalUninstall安装流程。 一、软件介绍 TotalUninstall是一款功能强大的卸载与清理工具&#xff0c;它能够彻底卸载不需要的应用程序&#xff0c;并清除相关的注册表项、文件残留和临时文件&#xff0c;确保系统干净无残留&#xff…

美畅物联丨视频上云网关如何配置上级联网云平台

在当今的智慧交通与安防监控体系中&#xff0c;视频上云网关发挥着至关重要的作用。以美畅视频上云网关为例&#xff0c;具备强大的兼容性&#xff0c;能够对接来自不同厂家、不同型号的视频设备&#xff0c;将这些设备输出的各异视频流进行汇聚整合。在获取摄像机视频流后&…

深入理解JavaScript:两大编程思想和ES6类以及对象概念解析

文章目录 两大编程思想ES6中的类和对象 两大编程思想 面向过程 &#xff08;Procedural-Oriented Programming&#xff0c;POP&#xff09; 定义&#xff1a;面向过程的编程是一种基于过程调用的编程范式&#xff0c;它将程序看作是一系列函数或过程的集合。每个函数负责完成…

推荐一个好用的VSCode插件

还在花馒头使用 Copilot&#xff1f;别再做大冤种啦&#xff01; 现在有个更好用的AI编程助手--豆包 MarsCode&#xff01;它不仅完全免费&#xff0c;而且功能强大&#xff0c;让你在编程时得心应手&#xff01;再也不用担心高昂的订阅费用&#xff0c;省下来的馒头&#xff…