1.3再谈方法

1.3.1 什么是方法(函数)

①方法是类或对象行为特征的抽象,也称为函数。

②Java里的方法不能独立存在,所有的方法必须定义在类里。

修饰符 返回值类型 方法名(参数类型 形参1,参数类型 形参2,….){

程序代码

return 返回值;

形式参数:在方法被调用时用于接收外部传入的数据的变量。

参数类型:就是该形式参数的数据类型。

返回值:方法在执行完毕后返还给调用它的程序的数据。

返回值类型:方法要返回的结果的数据类型。

实参:调用方法时实际传给函数形式参数的数据。

思考:如何理解方法返回值类型为void的情况 ?

1.3.2 方法的调用

方法只有被调用才会被执行;

方法调用的过程分析:

注  意:

①没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一行可以省略不写。

②定义方法时,方法的结果应该返回给调用者,交由调用者处理。

③方法中只能调用方法,不可以在方法内部定义方法。

输入语句:

import java.util.Scanner;//不是自己创建的,要导入包

//实例化Scanner类的对象,通过此对象.nextXxx()调用,完成相应的功能。

Scanner s = new Scanner(System.in);

int i = s.nextInt();

1.3.3 方法的重载(overload)

要求:

①同一个类中

②方法名必须相同

③方法的参数列表不同(个数、类型或顺序不同)

 

注意:方法的重载与方法的返回值类型没有关系!

【eclipse快捷键】

1.单行注释:Ctrl +/,再次取消。

2.多行注释:Ctrl+shift +/,Ctrl+shift +\(反斜杠)取消。

3.格式化:Ctrl+shift+F

1.3.4 可变个数的形参的方法

格式:

对于方法的形参: 数据类型 ... 形参名

①可变个数的形参的方法与同名的方法之间构成重载

②可变个数的形参在调用时,个数从0开始,到无穷多个都可以。

③使用可变多个形参的方法与方法的形参使用数组是一致的。

④若方法中存在可变个数的形参,那么一定要声明在方法形参的最后。

⑤在一个方法中,最多声明一个可变个数的形参。

//如下四个方法构成重载

//在类中一旦定义了重载的可变个数的形参的方法以后,如下的两个方法可以省略

//     public void sayHello(){

//            System.out.println("hello world!");

//     }

//     public void sayHello(String str1){

//            System.out.println("hello " + str1);

//     }

//可变个数的形参的方法

public void sayHello(String ... args){

for(int i = 0;i < args.length;i++){

System.out.println(args[i] + "$");

}

//System.out.println("=====");

}

public void sayHello(int i,String ... args){

//public void sayHello(String ... args,int i){

System.out.println(i);

for(int j = 0;j < args.length;j++){

System.out.println(args[j] + "$");

}

}

public void sayHello1(String[] args){

for(int i = 0;i < args.length;i++){

System.out.println(args[i]);

}

}

//可变个数形参的使用的例子

//     public int getSum(int i,int j){

//            return i + j;

//     }

//     public int getSum(int i,int j,int k){

//            return i + j + k;

//     }

public int getSum(int ... args){

int sum = 0;

for(int i = 0;i < args.length;i++){

sum += args[i];

}

return sum;

}

1.3.5 Java内存的主要划分

好书推荐:深入java虚拟机第二版(重点第五章)

 

//对象没有更多的引用指向,则变成垃圾.

public class OOTest03{

public static void main(String[] args){

//u1是引用,保存内存地址指向堆中的对象。

User u1 = new User();

//程序执行到此处,u1不再指向堆中的对象。

       //对象变成了垃圾。

u1 = null;

//使用一个空的引用去访问成员,会出现什么问题?

              //System.out.println(u1.name); //java.lang.NullPointerException (空指针异常)

Star s = new Star();

s = null;

s.sing(); //java.lang.NullPointerException

}

}

class Star{

//成员方法

public void sing(){

System.out.println("Sing a song!");

}

}

1.3.6 Java的值传递机制

方法的值的传递:

①形参:方法声明时,方法小括号内的参数

②实参:调用方法时,实际传入的参数的值

规则:java中的参数传递机制:值传递机制

①形参是基本数据类型的:将实参的值传递给形参的基本数据类型的变量

②形参是引用数据类型的:将实参的引用类型变量的值(对应的堆空间的对象实体的首地址值)传递给形参的引用类型变量。

以下程序传递基本数据类型:

public class OOTest04{

public static void m1(int i){

i++;

System.out.println("m1--->" + i); //11

}

public static void main(String[] args){ //入口

int i = 10; //局部变量

m1(i); //调用

System.out.println("main--->" + i); //10

}

}

以下程序传递引用数据类型:

public class OOTest05{

public static void m1(Animal a){

a.age++;

System.out.println("m1--->" + a.age); //11

}

//入口

public static void main(String[] args){

//1.创建Animal对象

Animal a = new Animal(10);

m1(a);

System.out.println("main--->" + a.age); //11

}

}

//动物

class Animal{

//Field

int age;

//Constructor

Animal(int _age){

age = _age;

}

}

【例题1

public static void main(String[] args) {

TestArgsTransfer tt = new TestArgsTransfer();

int i = 10;

int j = 5;

System.out.println("i:" + i + " j:" + j);//i : 10  j : 5

//            //交换变量i与j的值

//            int temp = i;

//            i = j;

//            j = temp;

tt.swap(i, j);//将i的值传递给m,j的值传递给n

System.out.println("i:" + i + " j:" + j);//i : 10  j : 5

}

//定义一个方法,交换两个变量的值

public void swap(int m,int n){

int temp = m;

m = n;

n = temp;

System.out.println("m:" + m + " n:" + n);

}


使用swap方法前后内存结构:

【例题2

public class TestArgsTransfer1 {

public static void main(String[] args) {

TestArgsTransfer1 tt = new TestArgsTransfer1();

DataSwap ds = new DataSwap();

System.out.println("ds.i:" + ds.i + " ds.j:" + ds.j);

tt.swap(ds);

System.out.println(ds);

System.out.println("ds.i:" + ds.i + " ds.j:" + ds.j);

}

//交换元素的值

public void swap(DataSwap d){

int temp = d.i;

d.i = d.j;

d.j = temp;

System.out.println(d);//打印引用变量d的值

}

}

class DataSwap{

int i = 10;

int j = 5;

}

【例题3

class Value {

int i = 15;

}

class Test {

public static void main(String argv[]) {

Test t = new Test();

t.first();

}

public void first() {

int i = 5;

Value v = new Value();

v.i = 25;

second(v, i);

System.out.println(v.i);

}

public void second(Value v, int i) {

i = 0;

v.i = 20;

Value val = new Value();

v = val;

System.out.println(v.i + " " + i);

}

}

Java再谈方法的更多相关文章

  1. 沉淀再出发:再谈java的多线程机制

    沉淀再出发:再谈java的多线程机制 一.前言 自从我们学习了操作系统之后,对于其中的线程和进程就有了非常深刻的理解,但是,我们可能在C,C++语言之中尝试过这些机制,并且做过相应的实验,但是对于ja ...

  2. Java继承之再谈构造器

    目录 Java继承之再谈构造器 初始化基类 默认构造器 带参数的构造器 子类调用父类构造器 Java继承之再谈构造器 初始化基类 前面提到,继承是子类对父类的拓展.<Thinking in Ja ...

  3. 再谈Java数据结构—分析底层实现与应用注意事项

    在回顾js数据结构,写<再谈js对象数据结构底层实现原理-object array map set>系列的时候,在来整理下java的数据结构. java把内存分两种:一种是栈内存,另一种是 ...

  4. 再谈java clone 以及 浅/深拷贝

    简单对象的拷贝,直接使用其clone方法 即可, 不会有什么问题: class Dog implements Cloneable public Dog clone() { int age; Strin ...

  5. JAVA构造方法与方法是啥意思,方法重载方法覆盖俗谈

    构造函数跟构造方法是一样的,只是称呼不同; C语言里叫函数,Java里叫方法. 成员方法必须有返回类型即使是没有返回,也要写上void 构造方法没有返回类型,而且和类名一样!一个类里面,一看就知道了譬 ...

  6. 再谈angularJS数据绑定机制及背后原理—angularJS常见问题总结

    这篇是对angularJS的一些疑点回顾,是对目前angularJS开发的各种常见问题的整理汇总.如果对文中的题目全部了然于胸,觉得对整个angular框架应该掌握的七七八八了.希望志同道合的通知补充 ...

  7. 在Java中谈尾递归--尾递归和垃圾回收的比较(转载)

    我不是故意在JAVA中谈尾递归的,因为在JAVA中谈尾递归真的是要绕好几个弯,只是我确实只有JAVA学得比较好,虽然确实C是在学校学过还考了90+,真学得没自学的JAVA好 不过也是因为要绕几个弯,所 ...

  8. 在Java中谈尾递归--尾递归和垃圾回收的比较

    我不是故意在JAVA中谈尾递归的,因为在JAVA中谈尾递归真的是要绕好几个弯,只是我确实只有JAVA学得比较好,虽然确实C是在学校学过还考了90+,真学得没自学的JAVA好 不过也是因为要绕几个弯,所 ...

  9. GoF设计模式三作者15年后再谈模式

    Erich Gamma, Richard Helm, 和 Ralph Johnson在GoF设计模式发表15年以后,再谈模式,另外一位作者,也是四色原型的发明者Peter已经过世. 提问者:如今有85 ...

随机推荐

  1. shell script 二 判断符号【】 shift 偏移量 if then fi

    判断符号[]类似于test.但是[]有通配符及正则表达式,为了区分,利用[]来做判断时,前后都需要加空格来区分.又一个坑 [ -z "$HOME" ];echo $? 例: 1 r ...

  2. Linear Regression(一)——

    Linear Regression(一)-- 机器学习 回归 定义 回归的定义 在平面上存在这些点我希望能用一条直线尽可能经过它们. 于是我们画了下面的一条直线 这样的过程就叫做回归. 这个过程中我们 ...

  3. 喜讯!联诚发创始人龙平芳荣获2019LED行业优秀女企业家称号!联诚发横揽三项大奖!

           2019年12月20日,在深圳大梅沙京基喜来登度假酒店隆重举行“蝶变跨越”慧聪LED显示屏行业品牌盛会颁奖典礼!在来自全国各地的LED显示屏行业协会领导,企业领袖,精英代表以及来自全国各 ...

  4. C++如何阻止一个类被实例化

    (1)定义一个无用的抽象函数,使得类成为抽象类 (2)将构造函数定义为private. 为什么要这样做? 一些工具类,没有被实例化的必要.

  5. laravel多字段模糊匹配

    use App\Models\Resume; $resume = Resume::query(); $content = $request->input('content'); $resume ...

  6. Robot Framework:环境安装

    Windows Python2.7                                                前置条件:安装python2.7,下载地址:https://www.p ...

  7. 文件上传 和 base64编码

    base64编码 1.关于Base64编码  :  https://www.cnblogs.com/liyiwen/p/3814968.html (个人猜测),file表单发送文件,肯定是将文件转换为 ...

  8. Java桌球小游戏1

    版本三.使小球动起来package cn.xjion.game;/** * 水平滚动 * @author xjion * */import java.awt.*;import javax.swing. ...

  9. GO语言延迟函数defer用法分析

    这篇文章主要介绍了GO语言延迟函数defer用法,较为详细的分析了GO语言的特性与具体用法,并给出了一个比较典型的应用实例,具有一定的参考借鉴价值,需要的朋友可以参考下   本文实例讲述了GO语言延迟 ...

  10. C++——指针与引用

    1.指针本身为对象,引用只是对象的别名.故有指针的引用,没有引用的引用,没有引用的指针.指针必须指向一个实际的对象.引用也必须是实际对象的别名. 2.允许指针赋值和拷贝,指针可指向不同的对象 3.指针 ...