Java小白的第十七课一一方法传递&Math&Object
方法传递&Math&Object
回顾
- String特性: 不变性,值在创建后不能修改,改的只是指向。
- StringBuffer和StringBuilder:可变字符串,效率比String快,在操作字符串的时候尽量使用两者,StringBuffer支持线程安全,方法里有同步关键字 Synchronize,但效率稍低。
1. 方法的参数传递
1.1 基本数据类型传值〖值传递〗
- 类
- 测试类
基本数据类型,在传递的是值的一个副本,在方法内对形参操作,不影响实参的值。
1.2 引用数据类型(数组、类)作为参数【引用/内存地址传递】
1.2.1 参数是数组
- 测试类
- 结果
1.2.2参数是类
- 测试类
- 结果
1.3 Sting字符串作为参数【值传递】
- 测试类
String传递的时候,其实传的是引用名在堆中地址,因为Sting具有不可变性,当方法内对该地址的字符串重新赋值,则相当于在内存中重新创建一对象,对实参不产生影响
1.4 可变参数作为参数
- 写法 : 修饰符 返回类型 方法名( 参数类型 … 引用名){};
1.4.1基本数型作为参数【值传递】
- 结果
1.4.2 String 作为可变参数作为传递【值传递】
1.4.3 类作为可变参数【引用传递】
总结
值传递
形式参数是基本数据类型
基本类型在传的是值的,形式参数和实参存的值是不同的地址,所以实参和形参。
引用传递
形式参数是引用数据类型
引用类型在传的是,所以实参和形参。
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是每一个类的,所有对象都实现这个类的方法。
4.1 重写父类的toString()、equals()方法
- toString(): 返回的是 。子类可以重写,输出想要的值,当子类实例化的时候,toString()会自动执行。
- equals(): 在Object中是用==实现的,所以比较的是两个对象的内存地址。
- 重写equals()
4.2 hashCode
- hashCode() 是用来获取类的地址,也是对象的"身份证"。
- hashCode是Java.lang.Object.hashCode()或者Java.lang.System.identityHashCode(),都能获取一个对象的标识,官方称呼: 标识哈希码;
面试题 子类可以重写父类的哪些方法?
- 在子类里使用==Alt+/==就会看到父类上的方法。
4.3 Object 克隆的方法
4.3.1 浅克隆
- 条件: 类实现Cloneable接口,且重写了clone方法。
以上是浅克隆的例子,浅克隆只对目标本身,但其内部保存的其它对象的引用地址不变。
4.3.2 深克隆
- 条件: 实现Cloneable,重写clone方法,把clone方法的修饰符 protected改成public,调用super.clone();
深克隆可以复制类的本身,也可以复制类里面保存的对象
【面试题】谈谈Java的克隆?
:创建一个新对象,新对象的属性和原来对象完全相同,对于 引用的其他对象属性,仍指向原有属性所指向的对象的内存地址。
:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。
总之深浅克隆都会在堆中新分配一块区域,区别在于 对象属性引用的对象是否需要进行克隆(递归性的)。
用处:当你的对象要求为不可变的时候,在传对象的时候,可以考虑clone。例如方法的参数传递,传递对象的时候是引用传递,如果不希望改变原始对象的数据,则就可以使用克隆。