Java面试知识点总结-JavaSE基础篇(持续更新)
Posted 程序猿·李
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java面试知识点总结-JavaSE基础篇(持续更新)相关的知识,希望对你有一定的参考价值。
目录
2.两个对象的hashcode值相同,那equals是否一定为true
一、Java面向对象
1.面向对象的特性及理解
Java的特性为以下几种:
继承:将不同类型对象所包含的相同属性、方法提取出来,构成一个父类,子类可以继承父类并获得它的所有属性和方法(private修饰的私有属性和方法除外)。子类对象可以使用父类的属性方法,也可以使用自己的,即对父类信息进行扩展。同时可以对父类的属性和方法进行修改并使用。
public class Main{
public static void main(String[] args) {
System.out.println("Hello World");
}
}
封装:将一个对象的信息(即属性)放到其对应类的内部,外部无法直接访问,只能够通过其提供的方法对隐藏的信息进行部分的操作和访问。一般只会将外界可以访问的属性通过方法来实现访问。
public class Person {
private Integer id;
private String name;
// 获取id方法
public Integer getId() {
return id;
}
// 设置id方法
public void setId(Integer id) {
this.id = id;
}
// 获取name方法
public String getName() {
return name;
}
// 设置name的方法
public void setName(String name) {
this.name = name;
}
}
多态:一个对象具有多种状态。其主要表现形式是在类的继承和接口实现的前提下,父类创建的对象由子类(继承类或实现类)去实现,即父类对象子类实现。其实例代码如下:
class Animal {
public double weight;
public double height;
public Animal(double weight, height) {
this.weight = weight;
this.height = height;
}
}
class Lion extends Animal {
super();
}
public class Main1 {
public static void main(String[] args) {
// 父类对象子类实现
Animal animal = new Lion();
}
}
如果子类重写了父类的方法。真正执行的是子类覆盖的方法,如果子类没有覆盖父类的方法,执行的是父类的方法。
class Person {
public int id;
public String name;
public Person() {
}
public Person(int id, String name){
this.id = id;
this.name = name;
}
public void say(){
System.out.println("person");
}
public void run(){
System.out.println("Person run");
}
}
class Child extends Person {
public Child() {
}
public void say() {
System.out.println("child");
}
/**
public void run(){
System.out.println("Child run");
}
**/
}
public class Main{
public static void main(String[] args){
Person person = new Child();
person.say();
person.run();
}
}
执行结果:
child
Person run
2.访问修饰符都有哪些,它们的区别有哪些
访问修饰符 | 当前类 | 当前包 | 子类 | 其他包 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default(默认,一般不写) | √ | √ | × | × |
private | √ | × | × | × |
Java中包含四种不同的修饰符,包括public,protected,default,private。
public:此修饰符的范围是所有类,都可以正常访问被修饰符修饰的部分。
protected:对于继承与此类的导出类或其他任何位于同一个包内的类来说都可以访问。
default:对于同一个包中的内容可见(不需要书写,默认就是被default修饰)。
private:被访问的范围只限于当前类中,其它均不可访问。
对应public,protected,default和private,它们的范围逐渐变小。
它们的适用范围如下:
外部类/接口 | 成员属性 | 方法 | 构造函数 | 成员内部类 | |
public | √ | √ | √ | √ | √ |
protected | √ | √ | √ | √ | |
default | √ | ||||
private | √ | √ | √ | √ |
3.为什么使用clone
在开发过程中,遇到情况。存在一个已经包含了有效值的对象A,这时需要一个与A完全相同的对象B,并且B的后续操作不会影响到A,即A和B是两个完全独立的对象,对象B由对象A来确定。此时可以用到clone()方法来快速高效地实现。
4.浅拷贝和深拷贝
浅拷贝:对于基本数据类型采用值传递,对于引用数据类型采用引用传递,即拷贝后的对象仍然指向参考对象。如果这是拷贝对象修改了某些值,那么这些变动会影响到参考对象。
深拷贝:对于基本数据类型采用值传递,对于引用数据类型会创建一个新的对象,并将原有的内容复制给它。如果这是拷贝对象修改了某些值,那么这些变动不会影响到参考对象。
二、JavaSE语法
1. & 和 && 的区别 ,那 | 和 ||
短路运算符:
&:逻辑与,它们的判别条件是,计算符号两边的值,如果有一个值为假,则返回假;如果两个值都为真,则返回真。
|:逻辑或,它们的判别条件是,计算符号两边的值,如果有一个值为真,则返回真;如果两个值都为假,则返回假。
断路运算符:
&&:逻辑与,它们的判别条件是,计算符号前边的值,如果值为假,则不计算后边的值,直接返回假;如果前后两个值都为真,则返回真。
||:逻辑或,它们的判别条件是,计算符号前边的值,如果值为真,则不计算后边的值,直接返回真;如果前后两个值都为假,则返回假。
2.两个对象的hashcode值相同,那equals是否一定为true
首先hashcode是根据对象内容,使用算法获取其hashcode值,取其整数结果时会出现不同对象hashcode值相同的情况,越糟糕的哈希算法越容易出现碰撞。
而equals的判定方法是比较两个对象的地址是否相同,也就是两个对象是否指向同一个地址。
3.String类是否可以被继承
String类由final关键字修饰,其不可以被继承。
4.重载和重写的区别
重载:一般发生在同一个类中,方法名一致,参数列表的参数顺序、类型、个数不同。而方法返回值和修饰符可以被修改。
重写:发生在继承类或实现接口场景下,子类或实现类去实现父类或接口的方法,其返回值类型、方法名、参数列表必须相同。
区别点 | 重写方法 | 重载方法 |
发生范围 | 子类 | 同一个类 |
参数列表 | 一定不能修改 | 必须修改 |
返回类型 | 子类方法返回值应比父类方法返回值类型更小或相等 | 可修改 |
异常 | 子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等 | 可修改 |
访问修饰符 | 一定不能做更严格的限制(可以降低限制) | 可修改 |
发生阶段 | 运行期 | 编译期 |
以上是关于Java面试知识点总结-JavaSE基础篇(持续更新)的主要内容,如果未能解决你的问题,请参考以下文章