细节二:参数、引用类型、实例化

1、null和""空字符串的区别
null不指向任何对象,相当于没有任何值,null不分配内存空间
""代表一个长度为0的字符串,""会分配内存空间
字符串类型的默认值为null

2、成员变量在new对象初始化的时候,会默认的给上初始值(默认值)
在方法中的局部变量没有初始值,要使用的话,必须先赋值

3、字符串类型属于引用类型,栈中的引用指向堆里的对象
一个String对象在 堆内存 中创建以后, 就不能被改变了
请注意String对象的所有方法都不会改变其本身,而是会返回一个新的String对象.

4、java对String类型做了特殊处理
String a = "123";
String b = "123";
System.out.println(a.equals(b)); 输出true
System.out.println(a==b); 输出true

正常情况下,比较对象是否相等
String a1 = new String("aaa");
String b1 = new String("aaa");
System.out.println(a1.equals(b1)); 输出true
System.out.println(a1 == b1); 输出false

5、实参和与其对应的形参各占用独立的存储单元

参数为基本数据类型
基本数据类型实参传递到形参的是值,形参的改变不会影响实参
static int [] a ;
public static int[] way(int[] a) {
  a = new int[5];
  return a;
}

public static void main(String[] args) {
  a = new int[3];
  way(a) ;
  System.out.println(a.length); 输出3

  a = way(a);
  System.out.println(a.length); 输出5
}

参数为引用类型,实参传递到形参的是地址
public class Manager {
  String name;
  int age;
  public void manager(Manager m) {
    m.name = "张三" ;
    m.age = 23;
    System.out.println(m.name+"\t"+m.age );
  }
}

public class Test{
  public static void main(String[] args) {
    Manager m = new Manager();
    m.name = "李四";
    m.age = 22;

    //将实参的地址传递给形参,实参与形参指向同一个对象
    m.manager(m);
    System.out.println(m.name+"\t"+m.age );
  }

}
运行:
张三 23
张三 23

public class Manager {
  String name;
  int age;
  public void manager(Manager m) {
    //在此处给形参m,重新new一个对象,形参m会指向新的地址
    m = new Manager();
    m.name = "张三" ;
    m.age = 23;
    System.out.println(m.name+"\t"+m.age );
  }
}

public class Test{
  public static void main(String[] args) {
    Manager m = new Manager();
    m.name = "李四";
    m.age = 22;

    //将实参的地址传递给形参,实参与形参指向同一个对象
    m.manager(m);
    System.out.println(m.name+"\t"+m.age );
  }

}
运行:
张三 23
李四 22

6、实例化一个对象的过程:
1、加载父类(有直接父类的情况下)
2、在堆内存中开辟空间,分配内存
3、对对象属性进行默认初始化
4、调用对应的构造方法进行初始化
5、在构造方法中,第一行先调用父类的构造方法进行初始化
6、进行子类构造函数初始化

如果一个函数的static修饰的成员变量是引用类型,那么就算这个函数进行多次实例化,它的static修饰的引用类型成员变量也只会实例化一次

public class Book {
  Test04 test1 = new Test04();
  public Book (int num) {
    System.out.println("book"+num);
  }
  static Test04 test2 = new Test04();
}

public class Test04 {

  public Test04() {
    System.out.println("Test04");
  }
  public static void main(String[] args) {
    Book book1 = new Book(1);
    Book book2 = new Book(2);
  }
}
运行:
Test04
Test04
book1
Test04
book2

posted @ 2018-08-07 20:45  别念茶茶  阅读(258)  评论(0编辑  收藏  举报