Java基础

106 阅读2分钟

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()将等待垃圾回收。
}