Java再谈方法
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再谈方法的更多相关文章
- 沉淀再出发:再谈java的多线程机制
沉淀再出发:再谈java的多线程机制 一.前言 自从我们学习了操作系统之后,对于其中的线程和进程就有了非常深刻的理解,但是,我们可能在C,C++语言之中尝试过这些机制,并且做过相应的实验,但是对于ja ...
- Java继承之再谈构造器
目录 Java继承之再谈构造器 初始化基类 默认构造器 带参数的构造器 子类调用父类构造器 Java继承之再谈构造器 初始化基类 前面提到,继承是子类对父类的拓展.<Thinking in Ja ...
- 再谈Java数据结构—分析底层实现与应用注意事项
在回顾js数据结构,写<再谈js对象数据结构底层实现原理-object array map set>系列的时候,在来整理下java的数据结构. java把内存分两种:一种是栈内存,另一种是 ...
- 再谈java clone 以及 浅/深拷贝
简单对象的拷贝,直接使用其clone方法 即可, 不会有什么问题: class Dog implements Cloneable public Dog clone() { int age; Strin ...
- JAVA构造方法与方法是啥意思,方法重载方法覆盖俗谈
构造函数跟构造方法是一样的,只是称呼不同; C语言里叫函数,Java里叫方法. 成员方法必须有返回类型即使是没有返回,也要写上void 构造方法没有返回类型,而且和类名一样!一个类里面,一看就知道了譬 ...
- 再谈angularJS数据绑定机制及背后原理—angularJS常见问题总结
这篇是对angularJS的一些疑点回顾,是对目前angularJS开发的各种常见问题的整理汇总.如果对文中的题目全部了然于胸,觉得对整个angular框架应该掌握的七七八八了.希望志同道合的通知补充 ...
- 在Java中谈尾递归--尾递归和垃圾回收的比较(转载)
我不是故意在JAVA中谈尾递归的,因为在JAVA中谈尾递归真的是要绕好几个弯,只是我确实只有JAVA学得比较好,虽然确实C是在学校学过还考了90+,真学得没自学的JAVA好 不过也是因为要绕几个弯,所 ...
- 在Java中谈尾递归--尾递归和垃圾回收的比较
我不是故意在JAVA中谈尾递归的,因为在JAVA中谈尾递归真的是要绕好几个弯,只是我确实只有JAVA学得比较好,虽然确实C是在学校学过还考了90+,真学得没自学的JAVA好 不过也是因为要绕几个弯,所 ...
- GoF设计模式三作者15年后再谈模式
Erich Gamma, Richard Helm, 和 Ralph Johnson在GoF设计模式发表15年以后,再谈模式,另外一位作者,也是四色原型的发明者Peter已经过世. 提问者:如今有85 ...
随机推荐
- NFS(网络文件系统)
NFS(网络文件系统) 1.关于NFS介绍 1.1NFS在企业中的应用场景 在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频,图片,附件等静态资源文件,通常网站用户上传的文件都会放 ...
- dubbo-源码阅读之容器启动
dubbo Main 例子 public class Start { public static void main(String[] args) throws Exception { com.ali ...
- printf sscanf进阶
printf ; printf (3d", a);//将打印 035 printf(“%-*s”, width, string): “*”: 在这里用width代替,其实和printf(“% ...
- ANdroid手机屏幕反横向等参数设定
经过我一番百度和看Android文档,我才发现,Android对旋转屏,特别是只有横屏或者竖屏虽重力旋转的支持是到Android4.3.1才有完美支持的 unspecified - 默认值,由系统选择 ...
- vue 点击切换图标
<div @click="showImg" class="showSearch"> <img class="header_img&q ...
- 循环神经网络(Recurrent Neural Network)
传统的神经网络模型,隐藏层的节点之间是无连接的,如下图所示. 而循环神经网络隐藏层的节点之间有连接,主要用于对序列数据进行分类.预测等处理.有连接意味着需要接受信息,这种网络通常用来对序列数据进行处理 ...
- Dubbo---Multicast 注册中心---xml配置
1.项目结构(maven项目) 2.dubbotest.pom <?xml version="1.0" encoding="UTF-8"?> < ...
- git——修改已经提交并push后的commit注释
把代码push到远程后,发现commit的注释居然多了几个错别字,不行,必须改了! 搜索了一些答案之后自己做了一个总结如下: ①修改倒数第次的commit 指令:$ git rebase -i HEA ...
- linux IPC socket
套接字是通讯端点的抽象 创建一个套接字 #include <sys/types.h> #include <sys/socket.h> int socket(int domain ...
- jmeter测试之-脚本制作
一.脚本录制 1.遇见的问题,回放的时候总是登录失败 解决方式:设置HTTP请求为—跟随重定向 2.新增一个用户的时候,脚本参数里面输入汉字,在浏览器查看的时候显示问号 解决方式:脚本编码方式增加u ...