011、Java 语言有哪些特点?
- 面向对象编程,具有封装、继承、多态的特性。
- 平台无关性,因为 JVM 的存在,Java 语言可以一次编译、到处运行。
- 支持多线程和网络编程。
- 简单易学。
012、continue、break、和 return 的区别是什么?
- continue:跳出这一次循环,继续执行下一次循环。
- break:跳出整个循环体,继续执行循环体后面的代码。
- return:跳出所在方法,结束该方法的运行,常见用法如下。
return;
:不返回任何结果,直接结束方法的执行,用于没有返回值的方法return value;
:返回特定的值,用于有返回值的方法
013、什么是泛型?
泛型是 JDK 5 引入的一个新特性,提供了编译时类型安全检测机制,该机制允许程序员在编写代码时检测到非法的类型。
泛型一般有三种使用方式:泛型类、泛型接口、泛型方法。
-
泛型类
// 此处 T 可以随便写为任意标识,常见的如 T、E、K、V 等形式的参数常用于表示泛型 public class Generic<T>{ private T key; public Generic(T key) { this.key = key; } public T getKey(){ return key; } } // 在实例化泛型类时,必须指定 T 的具体类型,如下 Generic<String> genericInteger = new Generic<>("Hello World!");
-
泛型接口
public interface Generator<T> { public T method(); } // 实现泛型接口,不指定类型 class GeneratorImpl<T> implements Generator<T>{ @Override public T method() { return null; } } // 实现泛型接口,指定类型 class GeneratorImpl<T> implements Generator<String>{ @Override public String method() { return "hello"; } }
-
泛型方法
public static <E> void print(E e) { System.out.println(e); System.out.println(e instanceof String); }
什么是类型擦除?
Java 的泛型是伪泛型,在编译期间,Java 会将所有的泛型信息都擦掉。
014、== 和 equals() 的区别?
对于基本数据类型变量来说,==
是判断两个变量值是否相等,对于引用类型变量来说,==
是判断两个变量所存储的对象地址是否相等。
equals()
只能用于引用类型变量的比较,一般是用来判断两个引用类型变量所指向的对象是否相等。
equals()
是 Object
类的方法,对于其他类来说,如果没有重写 equals()
方法,那么 equals()
方法和 ==
则是等价的;如果重写了 equals()
方法,一般情况下重写逻辑都是用来判断两个对象所存储的内容是否相等。
015、为什么重写 equals() 时必须重写 hashCode()?
在 Java 开发过程中,我们几乎无可避免的要用到通过哈希表实现的 HashMap() 等集合,在使用这些集合时,一定会用到 equals() 和 hashCode() 两个方法,并且这两个方法需要遵守以下约定:
- equals() 相等的话,hashCode() 一定相等
- equals() 不相等的话,hashCode() 可能相等也可能不相等
- hashCode() 相等的话,equals() 可能相等也可能不相等
- hashCode() 不相等的话,equals() 一定不相等
016、Java 是值传递还是引用传递?
Java 是值传递,无论是基本类型还是引用类型,方法得到的所有参数都是参数本身的一个拷贝,也就是说,方法不能修改任何参数本身的值,但对于引用类型来说,可以修改该引用所指向的对象。
017、重载和重写的区别?
重载指的是同一个方法能够输入数据的不同做出不同的处理。重载发生在同一个类中,重载方法之间要求方法名相同,但参数列表不同,方法返回值和访问修饰符可以相同也可以不相同。
重写指的是子类继承父类的方法,但想要做出有别于父类的处理,就需要重写父类方法。
子类重写父类方法时,有以下几条限制:
- 两同:方法名、参数列表相同
- 两小:子类方法返回值类型应该小于等于父类方法,子类方法抛出异常的范围要小于等于父类方法
- 一大:子类方法访问修饰符的限制要大于等于父类
- 如果父类方法的修饰符为
private/final/static
的话,则子类不能重写该方法,但是被 static 修饰的方法能够被再次声明 - 构造方法无法被重写
018、浅拷贝和深拷贝
对基本类型来说,浅拷贝和深拷贝没有区别,都是直接拷贝变量值。
对引用类型来说,浅拷贝也是直接拷贝引用变量的值,但深拷贝会直接创建一个对象,并复制引用变量所指向的对象的所有内容到新对象。
019、构造器是否可以被重写?
不可以,构造器不可以被重写,但可以重载。
020、在 Java 中定义一个不做任何操作且没有参数的构造器的作用?
Java 程序在执行子类构造器之前,如果没有用 super() 显示调用父类特定的构造器,那么则会隐式调用父类的无参构造器,假如此时父类只定义了有参构造器,编译时将会发生错误,因为 Java 程序在父类中找不到对应的无参构造器可执行,解决办法就是在父类中定义一个无参构造器。