前文

作者: WhiteSpace123 | 来源:发表于2017-10-23 23:30 被阅读0次
    String s;    //仅仅是创建一个引用,并没有指向对象,作为字段会默认初始化为null,作为局部变量不显示初始化会报错
    
    String s = new String("1234");    //创建一个引用并将其连接到对象(显示初始化)
    

    栈内存:

    存放变量(基本数据类型)以及引用(引用数据类型),当方法调用完成后,变量以及引用会被销毁
    变量中直接存放值,而引用存放对象的地址值
    String s = "123"; //将s引用指向字符串对象
    s = "234"; //这里重新将s引用指向新创建的字符串对象
    String类型改变字符串时就会将引用指向到新的对象,不会改变原对象

    堆内存:

    存放对象的位置,当对象没有引用指向它时,会被垃圾回收器处理

    基本类型:

    boolean(布尔):无明确大小,true/false
    char(字符):根据编码/16bit,'a'用单引号包裹一个字面量来表示一个字符
    byte(字节):1字节/8bit
    short(短整型):2字节/16bit
    int(整型):4字节/32bit
    long(长整型):8字节/64bit
    float:(单精度浮点型)4字节/32bit
    double(双精度浮点型):8字节/64bit
    基本类型运算会丢失精度,使用精确类型的类BigInteger(整数)或者BigDecimal(浮点数)需要精确的数

    作用域:

    public class Demo{
        private String name = "1";
        private String name = "2";    //已经定义过,会报错
        {
            String name = "3";    //已经定义过,会报错
        }
        public void test(){
            String name = "123";    //在构造器/任意方法中的不会报错,这里的name实际上是局部变量
        }
    }
    

    在同一个类的代码块中/构造器中/方法中可以访问到定义的字段

    public class Demo{
        private String name = "1";
        public void test(String name){
            name = "123";    //这里的name实际上是显示参数的name
        }
        public void test(){
            name = "123";    //这里的name实际上字段的name
        }
    }
    

    当构造器/方法中需要传入参数的时候,即使参数变量名与字段变量名一致,也不是同一个变量

    默认初始化:

    如果字段没有显示初始化,JAVA会默认初始化
    局部变量没有显示初始化会报错
    boolean:false
    char:'\u0000'(空字符)
    byte:(byte)0
    short:(short)0
    int:0
    long:0L
    float:0.0F
    double:0.0D
    引用类型:null

    方法:

    方法签名是方法名以及参数列表
    调用时括号内的为显示参数,方法前的为隐式参数也就是对象本身
    JAVA参数传递为按值传递:

    public class Demo {
         private void test1(A a) {
             //a = new A();    //这里将传入的对象替换了
               a.age = 20;    //这里将传入的参数中的字段的值修改了
               System.out.println("test1方法中的age=" + a.age);
         }
         public static void main(String[] args) {
               Demo t = new Demo();
               A a = new A();    //创建对象
               a.age = 10;
               t.test1(a);    //传入引用的地址值(对象)
               System.out.println("main方法中的age=" + a.age);    //打印20,20    下划线位置没有注释的话为20,10
         }
    }
    class A {
         public int age = 0;
    }
    

    这里可以看出按值传递的是A对象,并用test1方法中的显示参数a引用传入的对象,这个时候两个引用指向该对象,分别是main中的a和test1中的a,所以修改的是同一个对象中的字段值
    而下划线位置则是抛弃传入的对象,将test1的a指向在方法中创建的新对象,这时候main中的a指向一个对象,test1指向另一个对象,所以test1方法中修改字段值不会影响main方法的字段值

    JAVA中基本类型和String类型都是按值传递,其他对象是按引用的地址值传递

    相关文章

      网友评论

          本文标题:前文

          本文链接:https://www.haomeiwen.com/subject/iimzuxtx.html