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