1,java对象的引用
package com.cute.leetcode.editor.cn;
/**
* @author xiaofeng
* @date 2020/7/21 上午10:33
*/
public class Test {
//基本类型的参数传递
public static void fun1(int m){
m = 100;
}
//参数为对象,不改变引用的值
public static void fun2(A a){
a.setName("小风fun2_name");
a.setAdress("小风fun2_address");
}
//参数为对象,改变引用的值
public static void fun3(A a){
a = new A("小风fun3_name","小风fun3_address");
}
public static void main(String[] args) {
int m = 1;
fun1(m);
System.out.println(m);//m = 1
A a = new A("xiaofeng","henan");
fun2(a);
System.out.println(a.toString());
fun3(a);
System.out.println(a.toString());
}
static class A{
public A(String name, String adress) {
this.name = name;
this.adress = adress;
}
String name;
String adress;
public void setName(String name) {
this.name = name;
}
public void setAdress(String adress) {
this.adress = adress;
}
@Override
public String toString() {
return "A{" +
"name='" + name + '\'' +
", adress='" + adress + '\'' +
'}';
}
}
}
控制台输出------------
1
A{name='小风fun2_name', adress='小风fun2_address'}
A{name='小风fun2_name', adress='小风fun2_address'}
针对fun3,其实是变量A(对象A的引用指向了另一个对象地址,原来的对象A还是没变)
值传递是指对象被值传递,意味着传递了对象的一个副本,即使副本被改变,也不会影响源对象。
引用传递是指对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。
2,bit,byte,B,KB的关系
1,bit就是位,也叫比特位,是计算机表示数据最小的单位
2,byte就是字节,也是B (1byte就是1B,1byte=8bit)
3,一个字符=2字节
4,1KB=1024B 1B= 8b (注意大别B是byte,小写b是bit)
3,成员变量,局部变量
--------
成员变量指的是在类里定义的变量。
局部变量指的是在方法里定义的变量。
成员变量被分为类变量和实例变量两种。
没有static修饰的就是实例变量,有static修饰的就是类变量。
成员变量是在堆内存中,变量指向的对象也在堆中。
局部变量在栈内存中,变量指向的对象依然在堆中。
【重点】总之呢,Java所有创建的对象都在堆中,等待垃圾回收。
public class HahaTest {
String name; // 成员变量 【存在堆内存】【成员变量存储在堆中的对象里面,由垃圾回收器负责回收】
static String xxx;//静态变量 【存在方法区】
final String ooo;//常量 【存在常量池,常量池也可以说是在方法区】
public static final String kkk;//全局变量(前面需要加public才是全局) 【存在常量池,常量池也是由方法区分配而来】
public void methodA(int param) { // 方法的参数就是局部变量
System.out.println(param);
int num = 20; // 局部变量 ,int 为基础类型,引用和值都存在栈中。
Person p = new Person(); // 局部变量,p为对象引用,存在栈中,new Person()存在堆中。
...
}
注:方法methodA(param)执行完毕后,param,num,p将从栈中消失,new Person()将等待垃圾回收。
}