前文

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类型都是按值传递,其他对象是按引用的地址值传递

你可能感兴趣的:(前文)