• Java 方法与数组


    方法

    什么是方法?

    方法定义:方法(Method),函数(function),其实就指一个特定的功能操作,程序中完成独立功能,可重复使用的一段代码的集合。

    方法的定义

    方法定义格式:

    [修饰符]  返回值的类型  方法名称 ( [形式参数,....] ) {
    		 方法体
    		 [ return 值 ];
    }
    

    注意点

    (1)方法必须声明在类(class)当中。
    (2)创建的方法要定义在其它方法之外(跟其他的方法是兄弟关系)
    (3)定义方法不分先后顺序。
    (4)如果有一个方法前面有static,那么在该方法中调用其它的方法前面也应该有static。
    (5)void 返回值为空,什么都不返回;如果有返回值,必须要有return。
    (6)两个方法的名称不能相同。
    (7)方法必须要先定义,再执行。

    方法术语

    修饰符

    public,static等,static修饰的方法属于类,直接使用类名调用即可。

    返回值类型

    方法其实是在完成一个功能,该功能操作完毕之后,是否需要给调用者返回一个结果。

    如果不需要给调用者返回结果,此时使用关键字void来声明,无返回的意思。

    方法名称

    遵循标识符的规范,使用动词表示,首字母小写,若是多个单词组成,使用驼峰表示法,以后的每一个单词首字母都大写,myName

    形式参数

    方法圆括号中的变量,仅仅只是占位而已,参数的名称其实无所谓,形式参数可以有多个。

    参数列表

    参数列表 == 参数的类型 + 参数的个数 + 参数的顺序。

    方法签名

    方法签名 = 方法名称 + 方法参数列表;

    在同一个类中,方法签名是唯一的,否则编译报错。

    方法体

    方法的 { } 中的代码,表示具体完成该功能的代码。

    返回值:

    在方法内部,使用return关键字;
    功能1:给调用者返回一个结果值,此时该方法不能使用void修饰.
    功能2:结束当前方法.

    实际参数

    调用者在调用某一个具体方法的时候,实际传递的参数值。

    方法重载

    什么是方法重载?

    重载方法的定义是在同一个类中,某方法允许存在一个以上的同名方法,只要它们的参数列表不同即可。

    方法重载作用

    解决了 同一功能的方法,由于参数不同所造成方法名称不同。

    判断的原则

    方法重载判断原则: “两同一不同”

    • 两同:同类中,方法名相同;
    • 一不同:方法参数列表不同(参数类型、参数个数、参数顺序);

    只要参数类型,参数个数,参数顺序有一个不同,参数列表就不同.

    注意:方法重载和方法的返回值类型无关,只是一般要求返回值类型一致。
    参数列表和参数的名称没关系,方法的重载和形参没关系。

    数组

    什么是数组?

    所谓数组,是在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来的一种数据形式。

    这些按一定顺序排列的同类型数据的集合称为数组。

    而数组中的每一个数据称之为数组元素,数组中的元素以索引来表示其存放的位置,索引从0开始,步长是1,有点像Excel表格的行号,逐行递增。

    数组的定义

    变量的定义: 数据类型 变量名; 如: int age;

    数组的定义:
    方式1:: 数组元素的类型[] 数组名; 如: int[] ages;
    方式2: 数组元素的类型 数组名[]; 如: int ages[];

    推荐方式1: 可以吧 int[] 看成是一种数据类型,int类型的数组类型。

    数组必须先初始化,才能使用。因为初始化表示在内存中分配空间。

    数组的初始化

    Java中数组必先初始化后才能使用,所谓初始化就是给数组元素分配内存,并为每个元素赋初始值。

    初始化数组的两种方式:

    • 静态初始化;
    • 动态初始化;

    无论以哪种方式初始化数组,一旦初始化完成,数组的长度就固定了,不能改变,除非重新初始化。也就是说数组是定长的

    静态初始化

    数组的静态初始化操作:

    特点:由我们自己来为每一个数组元素设置初始化值,而数组的长度由系统(JVM)决定。

    语法:

    数组元素类型[]  数组名 = new 数组元素类型[]{元素1,元素2,元素3,.......};
    

    举例:

    int[] nums = new  int[]{1,3,5,7,9};
    int[] nums = {1,3,5,7,9};
    

    说明:

    简单写法,必须声明之后,立刻初始化,不能先声明后初始化:以下写法是错误

    int[] nums;
    nums = {1,3,5,7,9};
    

    动态初始化

    数组的动态初始化操作:

    特点:由我们来设置数组的元素个数(数组长度),而每一个数组元素的初始值有系统决定。

    语法:

    数组元素类型[]  数组名 = new  数组元素类型[ length ];
    

    举例:

    int[] ages = new int[100];
    

    说明:

    不能同时使用静态初始化和动态初始化:以下写法是错误

    int[] nums = new int[5]{1,3,5,7,9};
    

    数组的基本操作

    基本操作 操作说明
    获取元素 元素类型 变量 = 数组名[index];
    设置元素 数组名[index] = 值;
    遍历数组元素 建议使用for循环,事先知道循环的次数。
    数组长度 int len = 数组名.length; length是属性,不是方法。
    索引范围 从0开始,逐一递增. [0,数组名.length-1]

    多维数组

    什么是多维数组

    一维数组:就是数组,数组中的每一个元素都是一个值。
    二维数组:数组中的数组,数组中的每一个元素都是一个数组。(可以表示二维空间(行/竖))
    三维数组:数组中的每一个元素都是一个二维数组。

    举例:

    int[][] a = new int[][] { 
    	{ 1, 2, 3 }, 
    	{ 4, 5 }, 
    	{ 6 } 
    };
    

    feach 循环

    普通循环

    定义数组,给数组元素赋值。当取出数组中的元素值的时候,咱们会使用循环(while,do while,for)来操作,该操作,称之为循环遍历,但是循环变量是数组的索引。

    增加for循环

    从Java5开始,提供了增强for循环(for-each),就可以直接地取出数组中的每一个元素。

    for(元素类型 变量 : 数组名)
    {
        变量就表示每一个元素值
    }
    

    举例:

    public static void main(String[] args) {
    	String[] strs = { "爸爸", "妈妈", "爷爷", "奶奶", "外公", "外婆" };
    	for (String str : strs) {
    		System.out.println(str);
    	}
    }
    

    增加for循环本质

    增强for循环,其实是一个语法糖(编译器级别的新特性),但是在字节码中底层依然是for循环

    代码反编译后:

    public static void main(String args[])
    {
    	String strs[] = {
    		"爸爸", "妈妈", "爷爷", "奶奶", "外公", "外婆"
    	};
    	String args1[];
    	int j = (args1 = strs).length;
    	for (int i = 0; i < j; i++)
    	{
    		String str = args1[i];
    		System.out.println(str);
    	}
    }
    

    那到底,咱们是使用for循环还是使用增强for循环?

    • 若需要取出数组元素,则使用for-each更简单。
    • 但是若需要操作数组索引,就只能使用普通的循环。

    方法的可变参数

    得出结论:可变参数就是,方法的数组参数。

    注意::为了避免歧义,语法规定,可变参数必须作为方法的最后一个参数。

    static void sum(int[] args) {	// 把数组当作参数进行传递
    	int res = 0;
    	for (int i = 0; i < args.length; i++) {
    		res += args[i];
    	}
    	System.out.println(res);
    }
    
    public static void main(String[] args) {
    	int[] params = { 1, 2, 3 };
    	sum(params);
    }
    

    可变参数:

    // 可变参数(他是数组参数的一种简写,会自动把...转成数组)
    static void sum(int... args) { 
    	int res = 0;
    	for (int i = 0; i < args.length; i++) {
    		res += args[i];
    	}
    	System.out.println(res);
    }
    
    public static void main(String[] args) {
    	int[] params = { 1, 2, 3, 4 };
    	sum(params);
    	sum(1, 2, 3, 4);
    }
    

    可变参数的本质:

    可变参数是语法糖的一种,代码反编译后:

    static transient void sum(int args[])
    {
    	int res = 0;
    	for (int i = 0; i < args.length; i++)
    		res += args[i];
    
    	System.out.println(res);
    }
    
    public static void main(String args[])
    {
    	int params[] = {
    		1, 2, 3, 4
    	};
    	sum(params);
    	sum(new int[] {
    		1, 2, 3, 4
    	});
    }
    

    语法糖

    什么是语法糖

    语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法。

    这种语法对语言的功能并没有影响,但是更方便程序员使用。简而言之,语法糖让程序更加简洁,有更高的可读性。

    解语法糖

    语法糖的存在主要是方便开发人员使用。但其实,Java 虚拟机并不支持这些语法糖,这些语法糖在编译阶段就会被还原成简单的基础语法结构,这个过程就是解语法糖。

    说到编译,大家肯定都知道,Java 语言中,javac命令可以将后缀名为.java的源文件编译为后缀名为.class的可以运行于 Java 虚拟机的字节码。

    如果你去看com.sun.tools.javac.main.JavaCompiler的源码,你会发现在compile()中有一个步骤就是调用desugar(),这个方法就是负责解语法糖的实现的。

  • 相关阅读:
    Java泛型T与?
    json解析出现:java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to XXX
    Html 项目使用自定义字体文件问题
    修复 WordPress 通过邮箱 找回密码时的链接无效&新用户注册时提示的链接无效
    Linux查询进程和结束进程
    Linux --- 程序后台运行的几种方法
    bash_profile和bashsrc的区别
    在CentOS中安装与配置Server JRE 8
    JRE和JDK的区别
    java中静态代码块详解
  • 原文地址:https://www.cnblogs.com/xzh0717/p/10891896.html
Copyright © 2020-2023  润新知