什么是值传递,什么是引用传递?
1、什么是值传递,什么是引用传递?
值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
Java中只有值传递
1.传值调用(值传递):在传值调用中,实际参数先被求值,然后其值通过复制,在传递给被调函数的形式参数。因为形式参数拿到的只是一个"局部拷贝",所以如果在被调函数中改变了形式参数的值,并不会改变实际参数的值。
2.传引用调用(引用传递)在传引用调用中,传递给函数的是它的实际参数的隐式引用而不是实参的拷贝。因为传递的是引用,所以,如果在被调函数中改变了形式参数的值,改变对于调用者来说是可见的。
3.传共享对象调用(共享对象传递)传共享对象调用中,先获取到实际参数的地址,然后将其复制,并把该地址的拷贝传递给被调函数的形式参数。因为参数的地址都指向同一个对象,所以我们也称之为"传共享对象",所以,如果在被调函数中改变了形式参数的值,调用者是可以看到这种变化的。
因为传共享对象调用的过程和传值调用的过程是一样的,而且都有一步关键的操作,那就是"复制",所以,通常我们认为传共享对象调用是传值调用的特例
传值调用是指在调用函数时将实际参数复制一份传递到函数中,传引用调用是指在调用函数时将实际参数的引用直接传递到函数中。
char 型变量中能不能存贮一个中文汉字,为什么?
答:
char 类型可以存储一个中文汉字,因为 Java 中使用的编码是 Unicode(不选择
任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一
个 char 类型占 2 个字节(16 比特),所以放一个中文是没问题的。
抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被 synchronized修饰?
都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛
盾的。本地方法是由本地代码(如 C 代码)实现的方法,而抽象方法是没有实现
的,也是矛盾的。synchronized 和方法的实现细节有关,抽象方法不涉及实现细
节,因此也是相互矛盾的。
如何实现对象的拷贝
1). 实现 Cloneable 接口并重写 Object 类中的 clone()方法;
public class StaticTest implements Cloneable{
private Integer age;
private String name;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public static void main(String[] args) throws CloneNotSupportedException {
StaticTest test = new StaticTest();
test.setName("王慧洁");
test.setAge(18);
StaticTest h = (StaticTest)test.clone();
h.setAge(19);
System.out.println(test.getAge()); //18
}
2). 实现 Serializable 接口,通过对象的序列化和反序列化实现克隆
public static void main(String[] args) throws Exception {
Person test = new Person();
test.setName(“王慧洁”);
test.setAge(18);
Person t = StaticTest.clone(test);
t.setAge(19);
System.out.println(test.getAge()); //18
}
@Data
public class Person implements Serializable {
private Integer age;
private String name;
}
public class StaticTest {
@SuppressWarnings("unchecked")
public static <T extends Serializable> T clone(T obj) throws Exception {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bout);
oos.writeObject(obj);
ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bin);
return (T) ois.readObject();
}
}
抽象类是否可继承具体类
抽象类可继承具体类也可以继承抽象类。
怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串?
String s1 = “你好”;
String s2 = new String(s1.getBytes(“GB2312”), “ISO-8859-1”);
List、Set、Map 是否继承自 Collection 接口?
public interface List<E> extends Collection<E>
public interface Set<E> extends Collection<E>
public interface Map<K,V>
List、Set 是,Map 不是。Map 是键值对映射容器,与 List 和 Set 有明显的区别,而 Set 存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形。
Comparable和Comparator
Comparable:
若一个类实现了Comparable接口,就意味着该类支持排序。实现了 Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。
此外,实现此接口的对象可以用作有序映射中的键或有序集合中的集合,无需指定比较器。
此接口只有一个方法compareTo,比较此对象与指定对象的顺序,如果该对象小于、等于或大于指定 对象,则分别返回负整数、零或正整数。
Comparator:int compare(T o1, T o2);
@Data
public class Solution implements Comparable<Solution> {
private Integer age;
private String name;
private Integer grade;
public static void main(String[] args) throws Exception {
}
@Override
public int compareTo(Solution other) {
return this.age-other.getAge();
}
class ageCompare implements Comparator<Solution>{
@Override
public int compare(Solution o1, Solution o2) {
return o1.age=o2.age;
}
}
class gradeCompare implements Comparator<Solution>{
@Override
public int compare(Solution o1, Solution o2) {
return o1.grade=o2.grade;
}
}
}