博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java数据类型和方法参数
阅读量:4975 次
发布时间:2019-06-12

本文共 3238 字,大约阅读时间需要 10 分钟。

目录

[tpc]

Java数据类型

Java变量类型可以分为两种,一种是存储在堆栈中的基本数据类型,一种是存储在堆里的Java对象。

基本数据类型有9种,4种整型,2种浮点型,1种Unicode字符型,1种布尔类型,1种void类型。

void类型用于方法返回值,表示没有返回值。

基本类型 大小(字节) 包装器类型
byte 1 Byte
short 2 Short
int 4 Integer
long 8 Long
float 4 Float
double 8 Double
char 2 Character
boolean -- Boolean
void -- Void

引用

引用是一个经常看到的词,可以理解为一种操纵对象的手段。创建对象的引用并不代表着创建对象。

比如String str表示创建了一个对象的引用变量,变量str目前还没有引用任何对象。

str="hello",此时变量str引用"hello"字符串对象。

父类的变量可以引用子类的对象。接口的变量可以引用实现类的对象。

方法参数

Java中方法参数的传递全部是按值传递,也就是说传递给方法的参数都是一份新的拷贝。

以下是想要交换两个数的方法,但结果是错误的。因为传递给方法的参数是一份新的拷贝,之前的值是没有变化的。

package com.hnzhrh.fundamental;      import java.util.*;     public class Test{                                                                              public static void main(String[] args){           int a=10;                                                                                   int b=5;                                                                                    swap(a,b);                                                                             }                                                                                          private static void swap(int a,int b){                                                         int temp=a;            a=b;                                                                                       b=temp;                                                                                }                                                                                      }

方法的执行依赖着操作数栈、局部变量表和程序计数器,并且是方法私有的。对上述程序反编译:

javap -v -p Test.class得到带有附加信息的字节码,-v选项表示输出带有附加信息,-p选项表示显示所有类和成员。

截取main方法部分和swap方法部分内容:

40   public static void main(java.lang.String[]); 41     descriptor: ([Ljava/lang/String;)V 42     flags: ACC_PUBLIC, ACC_STATIC 43     Code: 44       stack=2, locals=3, args_size=1 45          0: bipush        10 46          2: istore_1 47          3: iconst_5 48          4: istore_2 49          5: iload_1 50          6: iload_2 51          7: invokestatic  #2                  // Method swap:(II)V 52         10: return 53       LineNumberTable: 54         line 7: 0 55         line 8: 3 56         line 9: 5 57         line 10: 10 58  59   private static void swap(int, int); 60     descriptor: (II)V 61     flags: ACC_PRIVATE, ACC_STATIC 62     Code: 63       stack=1, locals=3, args_size=2 64          0: iload_0 65          1: istore_2 66          2: iload_1 67          3: istore_0 68          4: iload_2 69          5: istore_1 70          6: return 71       LineNumberTable: 72         line 12: 0 73         line 13: 2 74         line 14: 4 75         line 15: 6

(44行开始)

初始状态:

1170438-20180819143923676-349883117.png

main方法的参数args存储在局部变量表0号位置中。

bipush 1010进入操作数栈,istore_1栈顶元素10出栈并存入局部变量表1号位置。

1170438-20180819143931097-145593829.png

iconst_5 常数5进入操作数栈,istore_2 栈顶元素5出栈并存入局部变量表2号位置。

1170438-20180819143940321-485465963.png

iload_1 局部变量表1号位置里的10入栈。

iload_2 局部变量表2号位置里的5入栈。

1170438-20180819143946997-406706394.png

调用方法swap(10,5),该方法有自己的操作数栈、局部变量表和程序计数器。

参数10存储在局部变量表0号位置,参数5存储在局部变量表1号位置。

1170438-20180819143953953-1338897524.png

iload_0局部变量表0号位置的10元素入栈。

istore_2操作数栈栈顶元素10出栈并存储到局部变量表2号位置。

1170438-20180819143959112-2129910312.png

iload_1局部变量表1号位置的5入栈。

istore_0操作数栈栈顶元素5出栈并存入局部变量表0号位置。

1170438-20180819144004507-645234672.png

iload_2局部变量表2号位置的10入栈。

istore_1栈顶元素10出栈并存储到局部变量表1号位置。

1170438-20180819144014161-388139684.png

return方法,方法执行完毕,销毁栈帧,只是把swqp方法里局部变量表里的参数a跟b互换了,而原本的a和b还原封不动。

需要注意的是,静态方法局部变量表0号位置的元素是方法第一个参数,而非静态方法的局部变量表0号元素是this,即对象本身。

技术上使静态方法不能通过this调用方法。

转载于:https://www.cnblogs.com/RohanZhang/p/9501216.html

你可能感兴趣的文章
C#中得到程序当前工作目录和执行目录的五种方法
查看>>
扫描线与悬线
查看>>
用队列和链表的方式解决约瑟夫问题
查看>>
python 迭代器与生成器
查看>>
基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD)
查看>>
[django实践]投票app
查看>>
[django]form的content-type(mime)
查看>>
JQUERY —— 绑定事件
查看>>
在TabControl中的TabPage选项卡中添加Form窗体
查看>>
oracle中SET DEFINE意思
查看>>
个人作业-最长英语链
查看>>
JMeter-性能测试之报表设定的注意事项
查看>>
1066-堆排序
查看>>
仿面包旅行个人中心下拉顶部背景放大高斯模糊效果
查看>>
强大的css3
查看>>
c#中的组件拖拽和MouseMove事件
查看>>
C# 小叙 Encoding (二)
查看>>
python创建对象数组避免浅拷贝
查看>>
CSS自学笔记(14):CSS3动画效果
查看>>
项目应用1
查看>>