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


    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+" "+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+" "+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+" "+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+" "+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

  • 相关阅读:
    java集合:ArrayList(1)
    java虚拟机:堆内存
    计算机三种编码与加减运算
    java虚拟机:程序计数器
    java虚拟机:JIT编译器
    java虚拟机:运行时常量池
    java虚拟机:方法区
    java虚拟机:本地方法栈
    java虚拟机:class文件结构
    linux安装mysql
  • 原文地址:https://www.cnblogs.com/snzd9958/p/9439338.html
Copyright © 2020-2023  润新知