Java数据类型和方法参数

目录

[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行开始)

初始状态:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

原文地址:https://www.cnblogs.com/RohanZhang/p/9501216.html

时间: 2024-10-10 15:22:38

Java数据类型和方法参数的相关文章

Java中的方法参数传递方式

最近在系统学习Core Java,Java中的数据类型分为两种,第一种是基本数据类型(数字型和布尔型),第二种是类类型(即对象),起初,我以为第一种类型的参数是按值传递,第二种是按引用传递,但在学习Core Java的过程中,我发现这是错误的,先抛出最终结论:在Java中,所有的方法参数都是按值传递的!!!下面来进行解释. 第一种类型的参数是按值调用很好理解,主要是要说明第二种类型的参数也是按值调用的,看下面的一段程序: 1 public static void swap(A x, A y) 2

java如何获取方法参数名

在java中,可以通过反射获取到类.字段.方法签名等相关的信息,像方法名.返回值类型.参数类型.泛型类型参数等,但是不能够获取方法的参数名.在实际开发场景中,有时需要根据方法的参数名做一些操作,比如像spring-mvc中,@RequestParam.@PathVariable注解,如果不指定相应的value属性,默认就是使用方法的参数名做为HTTP请求的参数名,它是怎么做到的呢? 在这样情况下,有两种方法获取方法来解决这种需求,第一种方法是使用注解,在注解中指定对应应的参数名称,在需要使用参数

JAVA 类中方法参数与返回值

无参无返回值的方法,用public void 方法名,来声明: 有参无返回值的方法,用public void 方法名,来声明: 有参有返回值的方法,用public int 方法名(int i,int n),来声明(int 是参数的数据类型指定,也可以是其它数据类型,例如:String.char.double.int). 实例: //定义类 public class Test{ //无参无返回值的方法 public void eat(){ System.out.println("我在吃饭.&quo

java 匿名内部类的方法参数需要final吗?

内部类通常都含有回调,引用那个匿名内部类的函数执行完了就没了,所以内部类中引用外面的局部变量需要是final的,这样在回调的时候才能找到那个变量,而如果是外围类的成员变量就不需要是final的,因为内部类本身都会含有一个外围了的引用(外围类.this),所以回调的时候一定可以访问到. 来自知乎http://www.zhihu.com/question/21395848

Java函数(方法)的默认值问题

Java不能为函数(方法)设置默认参数. 原因是“默认参数”和“方法重载”同时支持的话有二义性的问题,但使用“方法重载”可以间接地实现”默认参数“的效果,例如: public class A{ public void doA(int a){ } public void doA(){ this.doA(0);//这里默认传入0,可以近似认为通过重载实现了默认值的设置 } } 参考: 1)java 能为方法参数设置默认参数吗 原文地址:https://www.cnblogs.com/GjqDream

java 方法参数-值调用,引用调用问题

(博客内容来自于core java卷一) 1. xx调用:程序设计语言中方法参数的传递方式: 引用调用(call by reference):表示方法接收的是调用者提供的变量地址. 值调用(call by value):表示方法接收的是调用者提供的值. 命名调用(call by name):已经成为历史. 2. Java使用值调用,而且只有值调用.也就是说方法得到的是参数值的一个拷贝,并不是参数值本身,所以,方法不能修改传递给它的的任何参数变量本身. 看下面代码: public class te

Java的方法参数-想想挺有趣的问题

一直认为Java的方法参数都是传递值,调用后对本身不影响. Java不存在C/C++中的指针,在快速排序中,传入的数组,却发生了值的改变.由此引发的思考: //为方便举例,以下为部分快速排序伪代码 传入的数组,在递归中,数组值被操作. void quickSort(int s[], int l, int r){ if (l < r){ quickSort(s, l, i - 1); quickSort(s, i + 1, r); } } 结论:Java方法参数中传递的是值,在参数是引用类型(如数

java方法参数

java程序设计语言总是采用按值调用.也就是说,方法得到的是所有参数值的一个拷贝,特别:方法不能修改传递给它的任何参数变量的内容. 方法参数共有两种类型: 1.基本类型(数字,布尔值). 2.对象引用. java中方法参数的使用情况: 1.一个方法不能修改一个基本数据类型的参数(数值 布尔型). 2.一个方法可以改变一个对象参数的状态. 3.一个方法不能让对象参数引用一个新的对象. 一个方法不可能修改一个基本数据类型的参数,而对象引用作为参数就不同了

java方法参数传递面试题

传值还是传引用是Java中很基础的一个问题,也是笔试的时候经常被考察的一个问题,总结一下. 题目1: 写出以下程序的输出内容. public class Test { public static void changeValue(int value){ value = 0; } public static void main(String[] args) { int value = 2010; changeValue(value); System.out.println(value); } }