• 1,方法的参数传递机制:值传递。

首先弄懂2个概念:形参和实参。 形参(形式参数):相当于函数(Java中也把函数称之为方法)中的局部变量,在函数被调用时创建,并以传入的实参作为起始值,函数调用结束时被释放。不会影响主程序中其他的变量(即使有变量跟他们同名),因为他们是不同作用域的变量,互不干扰。实参:调用函数时,实际传给函数形式参数的数据。

不管是基本类型的参数传递,还是引用类型的参数传递,统统采用的是值传递方式。有点区别的是引用类型的参数传递,实际上传递的是一个引用。记住下面一句话,就可以很好的理解值传递的实质:当系统开始执行方法时,系统为形参执行初始化,就是把实参变量的值赋值给方法的形参变量,方法里面操作的并不是实际的实参变量。

//java值传递测试
public class Test01 { //定义一个方法,里面交换2个变量的值
public static void test(int a,int b){
int temp = a;
a = b;
b = temp;
System.out.println("a="+a+";b="+b);
} public static void main(String[] args) {
int a = 1;
int b = 2;
test(a, b);
//这里的a还是实际存在的a,这里的b还是实际存在的b,所以值没有发生变化。
System.out.println("a="+a+";b="+b);
} }



public class Test03 {

    public static void test(Test02 test02){
int temp = test02.a;
test02.a = test02.b;
test02.b = temp;
System.out.println("a="+test02.a+";b="+test02.b);
//这里来验证下是值传递还是引用传递:要是值传递的话,原来的引用还可以操作对象,要是传递的参数的话,原来的引用就不能操作对象了
test02 = null;
} public static void main(String[] args) {
Test02 test02 = new Test02();
test02.a = 1;
test02.b = 2;
test(test02);
//test02 = null; 这里要是将引用赋值为null的话,就不能在操作对象了
//2个引用同时操作对象,实际在堆内存中的对象当然发生改变了
System.out.println("a="+test02.a+";b="+test02.b);
} } class Test02 {
public int a;
public int b;
}

,

  • 2,形参个数可变的方法。

这里情形经常遇到的,如果我们在使用hibernate的时候,给hql或者sql赋值的时候,要是有不确定的参数,就可以这样子写。

下面2个方法签名的效果完全一样:

public Static void test(int a,String... books);//以可变参数来定义方法

public Static void test(int a,String[]  books);//以数组形参来定义方法

关于上面这2者的区别是:1,可变形参这种比较简洁。如果采用数组形参的方式,调用时必须传入数组。

  2,数组形式的形参可以处于形参列表的任意位置,但是个数可变的形参只能处于形参列表的最后。

  3,一个方法最多只能包含一个长度可变的形参,调用这个方法时,既可以传入多个参数,也可以传入一个数组

//形参个数可变的方法
public class Test04 { public void test(int a,String... names){
for (String name : names) {
System.out.println(name);
}
} /**
* @desc ^形参个数可变的参数其实就是一个数组参数
* @param a
* @param names
*/
public void test1(int a,String[] names){
for (String name : names) {
System.out.println(name);
}
} public static void main(String[] args) {
Test04 test04 = new Test04();
test04.test(1, "赵云");
test04.test(0, "张飞","关羽","典韦");
// test04.test1(0, new String[]{"张飞","大乔"});
//和上面的test1test02有点区别的是 ...这种方式可以直接传入多个参数,也可以传入一个数组参数
test04.test(0, new String[]{"张飞","大乔"});
} }
  • 3,方法递归。

一个方法体内调用它本身,被称为方法递归。记住:递归有一条最重要的规定:递归一定要向已知方法递归,否则就是一个死循环。

递归很有用滴,举个例子:我们希望遍历某个路径下的所有文件。为了更好的记住递归的规定,下面是2个数学题:

1,已知有一个数列:f(0)=1,f(1)=2,f(n+2)=2*f(n+1)+f(n),其中n是大于0的整数,求f(10)的值;

2,已知有一个数列:f(20)=1,f(21)=2,f(n+2)=2*f(n+1)+f(n),其中n是大于0的整数,求f(10)的值;

/**
*只要一个方法的方法体内再次调用了方法本身,这就是一个递归方法
* @version 1L
* @author LinkinPark
* @since 2014-10-22
* @motto 梦似烟花心似水,同学少年不言情
* @desc ^
*/
public class Test05 { public static int test(int n) {
if (n == 0) {
return 1;
} else if (n == 1) {
return 2;
} else {
return 2 * test(n - 1) + test(n - 2);
}
} public static int test1(int n) {
if (n == 20) {
return 1;
} else if (n == 21) {
return 2;
} else {
//不可以和上面写成一样,递归一定要向已知的方法递归
return test(n + 2) - 2 * test(n + 1);
}
} public static void main(String[] args) {
//循环的次数一样,初始值一样,所以最终2次输出结果相同
System.out.println(test(10));
System.out.println(test1(10));
} }
  • 4,方法重载Overload。

  在同一个类中,允许同时存在一个以上的同名函数,只要他们的参数列表不同即可。同一个类中方法名相同,但是参数列表不同,至于其他部分,如方法返回值类型,修饰符等等,与方法重载没有任何关系

    

    1、相同方法名,不同参数表。

    2、方法重载时,对于参数的匹配有个向上就近原则。(这样可以节省栈空间资源);

    3、为什么面向对象中要有方法重载?

       方法的重载使同一类方法由于参数造成的差异对于对象的使用者是透明的。

       对象的使用者只负责把参数交给对象,而具体怎么实现由对象内部决定。

    4、Java中的运算符重载

      java中唯一重载的运算符是String类型的“+”号,任何类型+String类型结果都为Stirng类型。

    5、注意点:重载不仅出现在同一个类中,也可以出现在父子类中。重载的方法只是刚好有相同名字的不同方法

//方法的重载
public class Test06 {
public void test(){ }
public void test(String msg){
System.out.println(msg);
}
}

5,关于main方法说明的一点:启动java程序的main方法的参数是一个字符串数组,通过反射来调用这个方法时,如何为invoke方法传递参数呢?因为JDK1.5要兼容JDK1.4,所以当我把一个字符串数组作为参数传递给invoke方法时,它会把数组打散成若干个单独的参数。所以:

在给main方法传递参数时,不能使用代码:mainMethod.invoke(null,new String[]{"1","2"});javac只会把它当做JDK1.4的语法进行理解,不会把他当成1.5的,因此出现参数类型不对的报错。解决办法:

mainMethod.invoke(null,object[]{new String[]{"1","2"}});或者mainMethod.invoke(null,(object)new String[]{"1","2"})



linkin大话面向对象--方法详解的更多相关文章

  1. linkin大话面向对象--构造器详解

       对象的产生格式:类名称  对象名 = new  类名称(); 因为有(),所以是方法,实际上它就是构造方法,并且是非私有的构造方法.如:CellPhone cp = new CellPhone( ...

  2. linkin大话面向对象--属性详解

    成员变量和局部变量 成员变量: 1.在一个类中,任何方法之外定义的变量:     2.从面向对象的思想来说我们又把实例变量看成一个类的属性.     3.实例变量在没有符初值时系统会自动帮我们做初始化 ...

  3. Python中格式化format()方法详解

    Python中格式化format()方法详解 Python中格式化输出字符串使用format()函数, 字符串即类, 可以使用方法; Python是完全面向对象的语言, 任何东西都是对象; 字符串的参 ...

  4. ES6 类(Class)基本用法和静态属性+方法详解

    原文地址:http://blog.csdn.net/pcaxb/article/details/53759637 ES6 类(Class)基本用法和静态属性+方法详解 JavaScript语言的传统方 ...

  5. PHP 中 16 个魔术方法详解

    PHP 中 16 个魔术方法详解   前言 PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __constru ...

  6. session的使用方法详解

    session的使用方法详解 Session是什么呢?简单来说就是服务器给客户端的一个编号.当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站.当每个用户首次与这台WWW服务器 ...

  7. Kooboo CMS - Html.FrontHtml[Helper.cs] 各个方法详解

    下面罗列了方法详解,每一个方法一篇文章. Kooboo CMS - @Html.FrontHtml().HtmlTitle() 详解 Kooboo CMS - Html.FrontHtml.Posit ...

  8. HTTP请求方法详解

    HTTP请求方法详解 请求方法:指定了客户端想对指定的资源/服务器作何种操作 下面我们介绍HTTP/1.1中可用的请求方法: [GET:获取资源]     GET方法用来请求已被URI识别的资源.指定 ...

  9. ecshop后台增加|添加商店设置选项和使用方法详解

    有时候我们想在Ecshop后台做个设置.radio.checkbox 等等来控制页面的显示,看看Ecshop的设计,用到了shop_config这个商店设置功能 Ecshop后台增加|添加商店设置选项 ...

随机推荐

  1. 表单验证插件--formvalidation

    表单验证是一个非常基础的功能,当你的表单项少的时候,可以自己写验证,但是当你的表单有很多的时候,就需要一些验证的插件.今天介绍一款很好用的表单验证插件,formvalidation.其前身叫做boot ...

  2. Windows程序设计笔记(二) 关于编写简单窗口程序中的几点疑惑

    在编写窗口程序时主要是5个步骤,创建窗口类.注册窗口类.创建窗口.显示窗口.消息环的编写.对于这5个步骤为何要这样写,当初我不是太理解,学习到现在有些问题我基本上已经找到了答案,同时对于Windows ...

  3. linux系统的磁盘空间限制的两种方法

    最近在搞VPS,要用到磁盘的限额,在网上找了一些相关的资料,总结起来,有两个方法能实现,一是用quota,另外一种是限制目录大小,下面我就将这两种方法写出来,与大家一起分享! 首先我们来看第一种方法, ...

  4. Zabbix实战-简易教程(9)--触发器函数(triggers)

    Zabbix触发器函数学习 本文主要讲述zabbix触发器函数. 1.abschange 参数:缺省 值类型:float, int, str, text, log 返回值解析: Returns abs ...

  5. Python模块之信号学习(signal)

    信号概述 在学习Python前应该学习下Linux下的信号,软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.进程之间可以互相通过系统调用kill发送软中断信号.内核也可以因为内部事 ...

  6. Linux系统下安装jdbc与tomcat

    一.下载Linux版本的jdbc与tomcat 1.1 下载Linux版本的jdbc: 1.1.1 1.1.2 1.1.3 在进行1.1.3操作之前得先勾选我同意协议 1.1.4 下载完成 1.2下载 ...

  7. 使用reqire.js 生成二维码

    最新项目中使用到 reqiure.js  ; 使用了一个月的感觉是: 这个确实是一个利器,如果会使用的话,能轻易理顺js之间的依赖关系,从而可以重复使用js,可以减少代码量,可以提升开发速度,但是  ...

  8. 在什么情况下使用@ResponseBody 注解?

    @Controller @RequestMapping("/") public class HelloController { @RequestMapping(value = &q ...

  9. 基于Xilinx FPGA的视频图像采集系统

    本篇要分享的是基于Xilinx FPGA的视频图像采集系统,使用摄像头采集图像数据,并没有用到SDRAM/DDR.这个工程使用的是OV7670 30w像素摄像头,用双口RAM做存储,显示窗口为320x ...

  10. 微积分入门("SX"T版)

    哎,微积分,表示暂时并没有很深入的研究……虽然高中有教,但是好像跟小西瓜学的顺序不太一样,嗯……教微积分之前不应该把极限学下来么……不管了,本文按傻X腾的理解来搞吧. 极限……大学的东西喔,我们先来认 ...