Java小白的第十七课一一方法传递&Math&Object

回顾

  1. String特性: 不变性,值在创建后不能修改,改的只是指向。
  2. StringBuffer和StringBuilder:可变字符串,效率比String快,在操作字符串的时候尽量使用两者,StringBuffer支持线程安全,方法里有同步关键字 Synchronize,但效率稍低。

1. 方法的参数传递

1.1 基本数据类型传值〖值传递〗


  • Java小白的第十七课一一方法传递&Math&Object
  • 测试类
    Java小白的第十七课一一方法传递&Math&Object
    基本数据类型,在传递的是值的一个副本,在方法内对形参操作,不影响实参的值。

1.2 引用数据类型(数组、类)作为参数【引用/内存地址传递】

1.2.1 参数是数组
Java小白的第十七课一一方法传递&Math&Object

  • 测试类
    Java小白的第十七课一一方法传递&Math&Object
  • 结果
    Java小白的第十七课一一方法传递&Math&Object

1.2.2参数是类
Java小白的第十七课一一方法传递&Math&Object

  • 测试类
    Java小白的第十七课一一方法传递&Math&Object
  • 结果
    Java小白的第十七课一一方法传递&Math&Object

1.3 Sting字符串作为参数【值传递】

Java小白的第十七课一一方法传递&Math&Object

  • 测试类
    Java小白的第十七课一一方法传递&Math&Object
    String传递的时候,其实传的是引用名在堆中地址,因为Sting具有不可变性,当方法内对该地址的字符串重新赋值,则相当于在内存中重新创建一对象,对实参不产生影响

1.4 可变参数作为参数

  • 写法 : 修饰符 返回类型 方法名( 参数类型 … 引用名){};

1.4.1基本数型作为参数【值传递】

Java小白的第十七课一一方法传递&Math&Object

  • 结果
    Java小白的第十七课一一方法传递&Math&Object
    \color{#ff0036}{值传递,实参不影响}

1.4.2 String 作为可变参数作为传递【值传递】

Java小白的第十七课一一方法传递&Math&Object
Java小白的第十七课一一方法传递&Math&Object
Java小白的第十七课一一方法传递&Math&Object
String\color{#ff0036}{符合String值传递的规则}

1.4.3 类作为可变参数【引用传递】

Java小白的第十七课一一方法传递&Math&Object
Java小白的第十七课一一方法传递&Math&Object

总结

值传递
形式参数是基本数据类型
基本类型在传的是值的\color{#ff0036}{副本},形式参数和实参存的值是不同的地址,所以实参和形参\color{#ff0036}{互不影响}

引用传递
形式参数是引用数据类型
引用类型在传的是\color{#ff0036}{引用地址},所以实参和形参\color{#ff0036}{相互影响}


2 Math类

返回值类型 语法 用法
static double ceil(double a) 向上取整
static double floor(double a) 向下取整
static long round(double a) 四舍五入
static double random() 返回[0,1)之间的随机数

3.Random类

构造方法
Random() 创建一个数随机数生成器
  • nextInt()方法
    • 返回值 : double;
    • 非静态方法;
    • Random对象名.nextInt( int a );
    • 返回[0,a)之间的一个数

4.Object类

  • Object类是类层次结构的根类,Object是每一个类的\color{#ff0036}{超类},所有对象都实现这个类的方法。

4.1 重写父类的toString()、equals()方法

  • toString(): 返回的是 +@+\color{#ff0036}{类名[email protected]+哈希地址}。子类可以重写,输出想要的值,当子类实例化的时候,toString()会自动执行
  • equals(): 在Object中是用==实现的,所以比较的是两个对象的内存地址。
  • 重写equals()
    Java小白的第十七课一一方法传递&Math&Object
    Java小白的第十七课一一方法传递&Math&Object
    Java小白的第十七课一一方法传递&Math&Object

4.2 hashCode

  • hashCode() 是用来获取类的地址,也是对象的"身份证"。
  • hashCode是Java.lang.Object.hashCode()或者Java.lang.System.identityHashCode(),都能获取一个对象的标识,官方称呼: 标识哈希码;

面试题 子类可以重写父类的哪些方法?

  • 在子类里使用==Alt+/==就会看到父类上的方法。

4.3 Object 克隆的方法

4.3.1 浅克隆

  • 条件: 类实现Cloneable接口,且重写了clone方法。
    Java小白的第十七课一一方法传递&Math&Object
    Java小白的第十七课一一方法传递&Math&Object
    Java小白的第十七课一一方法传递&Math&Object
    Java小白的第十七课一一方法传递&Math&Object
    以上是浅克隆的例子,浅克隆只对目标本身,但其内部保存的其它对象的引用地址不变

4.3.2 深克隆

  • 条件: 实现Cloneable,重写clone方法,把clone方法的修饰符 protected改成public,调用super.clone();
    Java小白的第十七课一一方法传递&Math&Object
    Java小白的第十七课一一方法传递&Math&Object
    Java小白的第十七课一一方法传递&Math&Object
    深克隆可以复制类的本身,也可以复制类里面保存的对象

【面试题】谈谈Java的克隆?

\color{#0000ff}{浅克隆}:创建一个新对象,新对象的属性和原来对象完全相同,对于 引用的其他对象属性,仍指向原有属性所指向的对象的内存地址。

\color{#0000ff}{深克隆}:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。
总之深浅克隆都会在堆中新分配一块区域,区别在于 对象属性引用的对象是否需要进行克隆(递归性的)。

用处:当你的对象要求为不可变的时候,在传对象的时候,可以考虑clone。例如方法的参数传递,传递对象的时候是引用传递,如果不希望改变原始对象的数据,则就可以使用克隆。