首页 > 系统相关 >五(三)、方法堆内存 和 栈内存的简单理解

五(三)、方法堆内存 和 栈内存的简单理解

时间:2022-09-29 15:08:23浏览次数:51  
标签:形参 int System 理解 内存 简单 println public out

一、方法:类应该具有的功能;比如 Math.random();Arrays.sort();....

public void eat() {
    System.out.println("人可以吃饭");
  }
  public void talk(String lanuage) {
    System.out.println("人可以说话,使用"+lanuage+"语言。");
  }
  public String getName(){}

 

1.1方法的声明:

权限修饰符 返回值类型 方法名(形参列表){

    方法体

    };

  1.1.1 权限修饰符 private public 缺省 protected

  1.1.2 返回值类型 有返回值、没有返回值;

    ①若有返回值,在声明时需要指定返回值类型,在方法中使用return 返回指定类型的变量or常量

    ②若方法没有返回值,则方法声明时使用void来表示,通常没有返回值的方法中,就不用return返回;如果只用 只能 "return;"表示结束此方法;

  1.1.3 我们定义方法该不该有返回值?凭经验;

  1.1.4方法名 属于标识符;需要遵循标识符规范;

  1.1.5 形参列表:方法可以声明0个 1个或者多个形参;格式:数据类型1 形参1,数据类型2 形参二;

  1.1.6 方法体:方法功能的体现;

二、再谈方法

1.方法的重载:在同一个类中,允许存在一个以上的同名方法,只用他们的参数个数或者参数类型不同即可。“两同一不同”
同类,同方法名;参数列表不同;参数个数不同,参数类型不同;
重载的特点:与返回值类型无关,只看参数列表,且参数列表必须不同。调用时感觉方法参数列表的不同来区分;
举例;Arrays.sort,/binerySearch();
判断是否是重载:跟方法的修饰符、返回值类型,形参变量名,方法体都没有关系;、
在通过对象调用方法时,如何确定指定方法?1.方法名,2.参数列表
  2.可变个数的形参,
a.格式:数据类型 ...变量名
b.当调用可变个数形参方法时,传入的参数个数可以使 0个,1个,2个。。。
c.可变个数形参方法与本类方法名相同,形参不同的方法之间构成重载;但是调用确定参数的方法
d.可变个数形参的方法与本来方法相同,形参了下也相同的数组之间不构成重载,也就是说,二者不能共存。
e.可变个数形参在方法的形参中,必须声明在末尾;
f.可变个数形参在方法的形参中,最多只能声明一个可变形参;

public static void main(String[] args) {
Day9Method10 day9Method10 = new Day9Method10();
//重载
day9Method10.getSum(1,2);//默认调用 getSum(int i, int j)若getSum(int i, int j)注释掉,则调用getSum(double i, double j)
day9Method10.show(0, "A","B");
day9Method10.show(0, "A");//优先调用确定参数的方法
}

public void getSum(int i, int j) {

}

public void getSum(double i, double j) {

}

public void getSum(String i, String j) {

}

//可变个数的形参 str参数个数可变
public void show(int a,String ...str) {
System.out.println("可变参数:"+str);
for(int i=0;i<str.length;i++) {
System.out.println(str[i]);
}
}
public void show(int a,String str) {
System.out.println(str);

}

 三、关于变量的赋值

1.如果变量是基本数据类型,此时赋值的是变量所保存的数据值;
2.如果变量是引用数据类型,此时赋值的是所保存的数据的地址值

 四、方法形参的值传递机制

  1.形参:方法定义时声明的小括号里面的参数;
   实参:方法调用时,(实际传递给形参的数据)
  2.值传递机制;
          a.如果参数是基本数据类型,此时实参赋值给形参的是,实参真实存储的数据值
          b.如果参数是引用数据类型,此时实参赋值给形参的是,实参的地址值;

1 public static void main(String[] args) {
2 System.out.println("****************基本数据类型************************");
3 int m = 10;
4 int n = m;
5 System.out.println("m = "+m+",n = "+n);//m = 10,n = 10
6 n = 20;
7 System.out.println("m = "+m+",n = "+n);//m = 10,n = 20
8
9 System.out.println("****************引用数据类型************************");
10 Order o1 = new Order();
11 o1.orderId = 1001;
12 Order o2 = o1;
13 System.out.println("o1.orderId = "+o1.orderId+",o2.OrderId = "+o2.orderId);//o1.orderId = 1001,o2.OrderId = 1001
14 o2.orderId = 1002;
15 System.out.println("o1.orderId = "+o1.orderId+",o2.OrderId = "+o2.orderId);//o1.orderId = 1002,o2.OrderId = 1002
16
17 //交换两个变量的值
18 Day9ValueTransfer15 day9ValueTransfer15 = new Day9ValueTransfer15();
19 System.out.println("m = "+m+",n = "+n);
20 day9ValueTransfer15.swap(m, n);
21 System.out.println("m = "+m+",n = "+n);
22 Data data = new Data();
23 data.m = 10;
24 data.n = data.m;
25 data.n = 20;
26 System.out.println("m = "+data.m+",n = "+data.n);
27 day9ValueTransfer15.swap1(data);
28 System.out.println("m = "+data.m+",n = "+data.n);
29 }
30
31 //交换两个变量的值
32 public void swap(int m,int n) {
33 int temp = m;
34 m = n;
35 n = temp;
36 }
37
38 //交换两个变量的值
39 public void swap1(Data data) {
40 int temp = data.m;
41 data.m = data.n;
42 data.n = temp;
43 }
44 }
45 class Order{
46 int orderId;
47
48 }
49
50 class Data{
51 int m;
52 int n;
53

基本数据类型,传递的是数据值,所以n = m,改变n的值,不会影响m的值

引用数据类型,传递的是地址值,所以”******************引用数据类型*************“,更改orderId会影响两对象相应的值;

具体请查看内存解析的详解:堆内存 和 栈内存的简单理解

这里String的值传递也是一个比较好面试题​

 

补充题目:为什么for(Integer item: arr)不可以改变基本类型对象数组的值,却可以改变引用类型对象数组(比如for(Person item :arr))的值呢?(这里的引用类型对象不包括String)

1 @Test
2 public void testFor() {
3 Integer[] intArr = new Integer[]{1,2,3,4};
4 for(int i = 0;i<intArr.length;i++) {
5 intArr[i] = intArr[i]+i;
6 }
7 System.out.println("***********普通for循环***********");
8 for(int i = 0;i<intArr.length;i++) {
9 System.out.print(intArr[i]);
10 }
11 System.out.println("");
12 }
13
14 @Test
15 public void testFor1() {
16 Integer[] intArr = new Integer[]{1,2,3,4};
17 int count = 0;
18 for(int i :intArr) {
19 i= i+count;
20 count++;
21 }
22 System.out.println("***********增强for循环更改基本类型数组的值***********");
23 for(int i = 0;i<intArr.length;i++) {
24 System.out.print(intArr[i]);
25 }
26 System.out.println("");
27 }
28
29 @Test
30 public void testFor2() {
31 Person person1 = new Person();
32 Person person2 = new Person();
33 person1.setName("tom");
34 person1.setAge(10);
35 person2.setName("jerry");
36 person2.setAge(10);
37 Person[] intArr = new Person[] {person1,person2};
38 for(Person item :intArr) {
39 item.setAge(11);
40 }
41 System.out.println("***********增强for循环更改引用类型数组的值***********");
42 for(int i = 0;i<intArr.length;i++) {
43 System.out.print(intArr[i]);
44 }
45 System.out.println("");
46

结果为:

***********普通for循环***********
1357
***********增强for循环更改基本类型数组的值***********
1234
***********增强for循环更改引用类型数组的值***********
Person [age=11, name=tom]Person [age=11, name=jerry]

附上Person :

1 public class Person {
2
3 private int age;
4 private String name;
5 public int getAge() {
6 return age;
7 }
8 public void setAge(int age) {
9 this.age = age;
10 }
11 public String getName() {
12 return name;
13 }
14 public void setName(String name) {
15 this.name = name;
16 }
17 @Override
18 public String toString() {
19 return "Person [age=" + age + ", name=" + name + "]";
20 }
21
22
23

View Code

 

我从来不相信什么懒洋洋的自由。我向往的自由是通过勤奋和努力实现的更广阔的人生。 我要做一个自由又自律的人,靠势必实现的决心认真地活着。



标签:形参,int,System,理解,内存,简单,println,public,out
From: https://blog.51cto.com/u_10632206/5722937

相关文章

  • js作用域的理解
    一、变量作用域解析过程​​对于s​​​​cript脚本中的变量:自上而下全局变量、全局函数​​​​对于函数中的变量:由里到外​​​​浏览器解析变量过程:​​​​“JS解析器......
  • 百度工程师带你探秘C++内存管理(理论篇)
    作者|daydreamer在互联网的服务中,C++常用于搭建高性能、高并发、大流量、低延时的后端服务。如何合理的分配内存满足系统高性能需求是一个高频且重要的话题,而且因为内存自......
  • Rsync的简单使用
    Rsync的简单使用需求一个运行很久的系统里面可能包含了非常多的垃圾文件.但是又不可能随便删除,很多垃圾可能有某些奇葩的用法.有时候新建一个应用复制文件的话比......
  • 实现一个简单的Database3(译文)
    前文回顾实现一个简单的Database1(译文)实现一个简单的Database2(译文)实现一个简单的Database3(译文)译注:cstsck在github维护了一个简单的、类似sqlite的数据库实现,通......
  • 力扣202(java&python)-快乐数(简单)
    题目:编写一个算法来判断一个数n是不是快乐数。「快乐数」 定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为1,......
  • CI\CD工具 TeamCity和Jenkins简单介绍
    JenkinsJenkins是CI市场中最知名且最常见的名号之一。其最初是由Sun公司的一位工程师打造的一个辅助项目,并迅速扩展为最大的开源CI工具之一,可帮助工程团队实现自动化部署......
  • C#中的简单DBHelper类
    publicclassDBHelper{//创建数据库连接字符串publicstaticstringconstr="server=.;database=你的数据库名称;Uid=数据库登录用户名;pwd=数据库登录密码";//......
  • 简单配置拨号服务器
    防人之心不可无。网上总有些无聊或者有意的人。不多说了。上干货,配置vpsapf防小流量ddos。对于大流量的ddos,需要机房的硬件防火墙,vps内部可能也扛不住。1.安装DDoSdef......
  • ActiveMQ的最简单应用-队列消息
    有一段时间不使用JMS了。现在的项目又有可能需要应用JMS,来提高服务质量和提高系统资源的利用率。提高服务质量,主要是保证不间断的服务。用JMS服务器接收任务,排成队列。应用......
  • 4类 JavaScript 内存泄露及如何避免
    译者|涂鸦码龙译文|http://jinlong.github.io/2016/05/01/4-Types-of-Memory-Leaks-in-JavaScript-and-How-to-Get-Rid-Of-Them/index.html简介内存泄露是每个开发者最......