java初学者知识小总结-03(6.30)

数据参数传递问题,
java的数据类型分为两大类,基本数据类型,引用数据类型,,,,,基本数据类型下有数值型(int,byte,double等等),字符型(char),布尔型(boolean)。引用数据类型有类(class,其中String也是类的一种),接口(还没看到),数组

java是由类构成的,c语言是由函数构成的,类和函数的存储地点也是不一样的函数中的数据随着函数的调用而存在在栈中,函数调用结束函数出栈,里面的数据也就自动消失,但是类是不一样的,当你用类new一个对象时这个对象的数据是在堆中申请的,堆中的数据有初始值,栈中的数据没有初始值,这就是为什么类中的数据不赋初值也能有值可以输出而栈中的数据不赋初值使用就会报错,,,举例来说:


```
package javatest;
class hi{
static int a;
}//堆中存储
class Shit{
public static void main (String[] args) {
System.out.println(hi.a);

}//栈中存储
}//输出为0,自动赋初值

class hi{
static int a;
}
class Shit{
public static void main (String[] args) {
int a;
System.out.println(a);
}
}//输出报错,因为没有赋初值

```
举两个参数传递的例子来说明基本数据类型和引用数据类型的区别
```
//基本数据类型参数传递
class test{
public static void main(String[] args){
int x=3;
change(x);
System.out.println(x);
}
public static void change(int x)
{
x=4;
}
}
```
函数显示从主函数中进入,将x的值赋值为3,之后调用change函数,函数的参数是x,将x放到函数中执行,执行的结果是将x赋值为4,但是随着函数的调用结束,执行的结果是4,也随着消失了,只剩下在赋值的3,所以会输出3,这里要说一下,是函数的输出是先从堆中找,然后再从栈中找,由于这个部分一直没有调用所以直接去栈中寻找了。


```
class test{
public static void main(String[] args){
int x=3;
test a=new test();

a.x=4;
change(a);
System.out.println(x);
}

public static void change(test a)
}
a.x=5;

}
}
这段代码用到了类的概念,首先还是从主函数开始,先定义了一个x,附上初值为3;之后定义了一个test的对象(要注意对象是在堆中申请的内存),将x赋值为4;之后调用change函数,这个函数是这个类中的函数,所以申请的内存也是在堆中申请的,函数调用之后将这个类中的x赋值为5;最后打印的也是这个类中的x输出的是5.。。
总的来说就是使用基本数据类型传递函数的参数值,函数调用之后对类中的成员变量是没有影响的,而要是用引用型变量传递参数对类的成员变量是有影响的。因为应用型变量传进去的是一个引用,而基本数据类型穿进去的是一个数据,数据存放在栈中,随着函数的调用,通过入栈和出栈并没有改变原来数据的值,而传递引用就不一样了学过c++的人都知道引用就可以当作数据本身的另一种叫法,传递进去的是数据本身,函数里面对其操作的也是数据本身,所以成员变量也会有变化。。虽然最后一个程序中change函数也会弹出栈,但是没有change的参数a传递的是对象a的地址,也就是说地址指向的那个数是test类中的对象a,所以函数中的操作就是对对象本身进行操作一样。a的地址就是对象在堆中申请的地址,所以a才能值指向它的对象,a给函数传递参数的时候把它的地址赋值给了形式参数,导致形式参数也指向了堆中的a对象,所以函数中的操作会对对象有影响。




还没有搞明白markdown的用法,代码有点乱,,,,








你可能感兴趣的:(java初学者知识小总结-03(6.30))