java面试题总结及详解(一)

1、什么是面向对象(OOP)?

面向对象简称是OOP,是目前主流的编程思想,可能许多读者并不了解,希望能通过下面的讲解能让大家了解什么是面向对象。JavaScript本身也是面向对象的编程语言,对于动态网页行为的编程,只要稍微对它有了解就可以的。对象这个词在是从英文“object”中翻译过来的,在之前的编程过程中,我们过多的考虑的是计算机硬件的工作方式,导致编程的难度增加,经过不断的发展和改良,主流的程序语言在人类的自然语言转变,不过编程的思想还是没有重大性的突破。

对象就是人对各种具体物体抽象之后的概念,人们每天都在跟各种各样的对象打交道,比如说一本书就是一个对象。在面向对象的编程过程中,对象有很多的特性,比如说高度、宽度、颜色等等,这些都是对象的属性,而且对象还有更多的功能,比如一部手机,可以听歌,看视频,打电话,这些可以理解成有个对象的方法,这些方法可以看成是函数,并且对象不是孤立的,它还具有对象的继承性。在编程的过程中,我们可以把所有的问题看做是对象,以人的思维解决问题。

对象实际上就是一组数据的集合,并且都已经被命名,这些数据的根据就是对象的属性,可以被访问。如果想访问一个外部的对象我们就必须先引进它,好比你想用国外的东西一样,只有你从国外把它带回来你才能使用。

下面请看实例:

Class Person{

private String name;

private int age;

private char sex;

Person(){//无参构造函数

}

Person(String name,int age,char sex)//有参构造函数,给属性赋值方法1

this.name = name;

this.age = age;

this.sex = sex;

}

//通过set方法分别给属性赋值方法2

public void setName(String name) {

this.name = name;

}

public void setAge(int age) {

this.age = age;

}

public void setSex(char sex) {

this.sex = sex;

}

//利用get方法获得属性值

public String getName() {

return name;

}

public int getAge() {

return age;

}

public char getSex() {

return sex;

}

//使用方法

public static void main(String[] args) {

// TODO Auto-generated method stub

//调用无参构造函数

Person zrh = new Person();

//1、调用有参构造函数初始化对象

Person zdb = new Person("zdb",20,'w');

System.out.println(zdb.getName());

//2、调用set方法初始化对象

//这是两种最传统的初始化方法,还有一个很重要的方法就是通过java反射机制

zdb.setName("zrh");

System.out.println(zdb.getName());

}

对象的类型,如果想创建一个空的对象,可以使用object()构造函数。还有就是定义对象的属性,其实定义对象的属性很简单,直接在对象后面用点运算符号声明属性的名称,并可直接赋值。创建对象所用的构造函数是预定义的,如Object()可以用于创建一个空对象,而创建数组对象我们可以使用Array()构造函数。这些都是些内置的构造函数,当然我们也可以自定义,就是自定义构造函数,比如你想构造有个食物的对象,就是构造food()的对象,通过向这个构造函数传递参数以初始化对象实例。不过构造函数只能初始化对象实例而不能返回对象实例,需要使用new运算符才能创建食物的对象实例。

我的理解:将所需要处理的事件全部封装为对象,将多个属性绑定到了一个对象,类似于c语言的结构体,实现了每个对象的独立性与内部关系紧密性。我们可以利用这个类,也可以叫模板,创造出很多个对象,做多个事情,而不用像面向过程语言一样增加重复的代码。

 

2、什么是多态?实现多态的机制是什么?
多态

用公式表达:多态=继承+重写/重载+父类引用指向子类对象

多态又分为 编译时多态和运行时多态。
编译时多态:比如重载
运行时多态:比如重写(常见)

 

多态的实现机制

原理也很简单,父类或者接口定义的引用变量可以指向子类或者具体实现类的实例对象,由于程序调用方法是在运行期才动态绑定的,那么引用变量所指向的具体实例对象在运行期才确定。所以这个对象的方法是运行期正在内存运行的这个对象的方法而不是引用变量的类型中定义的方法。

多态机制:https://www.cnblogs.com/xdp-gacl/p/3644035.html

 

3、接口(Interface)与抽象类(Abstract Class)的区别?

抽象类:https://www.cnblogs.com/xdp-gacl/p/3648398.html

接口:https://www.cnblogs.com/xdp-gacl/p/3651121.html

相信看完这两篇文章你就会明白

我的理解:

抽象类:一个不完整的类,里面用abstract修饰的公共方法都是没有实现的,这造成整个类都必须定义为抽象类,谁继承这个类,就必须负责把类中的抽象方法实现。这样做呢,也就提高了父类的拓展性。

接口:接口就是一个里面方法全部是公有的(不然外部无法访问),并且都是用abstract修饰(关键词省略了而已),需要用接口,就必须实现接口的方法。

为什么接口用得这么多呢?

一个类只能继承(extends)一个父类(抽象类),而可以实现(implements)多个接口,这样使得子类的拓展性更高。

那要抽象类干嘛?

抽象类中可以有私有的实现了的方法,而接口不可以,也就是说,人家抽象类还是能实现部分方法的,这部分功能也就类似继承,你说继承有没有用啊,肯定有啊

 

4、重写(Override)与重载(Overload)的区别?

 

重写:方法的重写,前提条件是子类继承了父类,便继承了父类所有的非静态方法,然后重写父类的方法。

重载:https://www.cnblogs.com/xdp-gacl/p/3637321.html

我的理解:

重写:在继承了父类的继承上在把父类的方法再写一次,java虚拟机在编译的时候就会用你子类中重写的这个方法,覆盖父类中的这个方法,增加了代码的灵活性。

重载:重载分为方法重载与构造重载,通过参数的变化,编译器在代码区寻找方法时,首先会根据方法寻找,然后再比对参数,只有这两个条件都满足,才能被加载到内存中。

 

5、父类的静态属性和静态方法是否可以被继承?是否可以被重写?为什么?

Static关键词:https://www.cnblogs.com/xdp-gacl/p/3637407.html

 

我的理解:

局部变量存放在栈内存中,new出来的对象存放在堆内存,常量存放在堆内存的常量池中,静态数据存放在数据区,其他数据存放在代码区。

静态属性和静态方法是否可以被继承?

肯定是可以的,就像你爸名下栋房子,当你爸走后,这栋房子自然就能够由你和你的兄弟解密继承。

是否可以被重写?

答案是不行的。

就相当于说,这栋房子是属于你跟几个兄弟姐妹的,你们都能够使用它,但是你们没有任何一个人有权利随意处置它。

静态属性和方法都存放在静态区,即这些数据属于整个类,不属于类的某个对象,自然也就能够继承这些静态数据,但是不能重写它们。

 

6、什么是内部类?内部类、静态内部类、局部内部类和匿名内部类的区别及作用?

内部类解析:https://blog.csdn.net/qq_36528311/article/details/87883120

 

 

7、== 和 equals() 和 hashCode() 的区别?

详解:https://www.cnblogs.com/skywang12345/p/3324958.html

内容比较多,请大家认真看,讲得很好。

我的理解:

equals()方法比较对象的地址。实质用的是“==”,其中官方已经重写了String和Data类equals()方法。我们可以

hashcode()方法是在使用到散列表时,比较哈希值,即键值对是否相等,实质也是用“==”比较,只不过是比较哈希值了。但是在类的对象不用散列表时,这个方法没什么用。

如果我们想要真正知道两个对象的内容是否相等,需要重写方法,将他们的属性值进行比较,得出结论

 

8、Integer 和 int 之间的区别?

详解:https://www.cnblogs.com/gaopeng527/p/5258884.html

我的理解:

首先Integer可以生成对象,自然对象就有方法,也可以赋值为null,而int则没有方法,也不能赋值为null

其次Integer为封箱基本类型,int为基本类型

Integer存在封箱(将int类型数据赋值为Integer类对象)和拆箱(将Integer类对象取值)操作,方法分别为valueof(int i)、intvalue();在Integer和int比较时,Integer将自动拆箱后与int型数据进行比较,在封箱时(int->Integer)要注意一点,在-127---128之间的数,数值将存入缓存区,下次再次用到该数值时,就会直接从缓存中取,就不会new了,所以取得了同意缓冲区的同一地址,如果是new出来的Integer对象,自然堆内存中的地址自然不同,也就不会相等

 

9、String 转换成 Integer 的方式及原理?

String与Integer的相互转化:https://blog.csdn.net/u011983531/article/details/50888139

 

我的理解:

两者之间的转化,主要用到了两类的静态方法valueof(...),即赋值包装成相应对象

 

10、自动装箱实现原理?类型转换实现原理?

我的理解:

类型转化原理与自动装箱实现原理类似

 

11、对 String 的了解?

String详解:https://www.cnblogs.com/zhangyinhua/p/7689974.html

特别要注意的是String的不变性知识点

 

 

12、String 为什么要设计成不可变的?

为什么String要设计成不可变的?:https://blog.csdn.net/renfufei/article/details/16808775

我的理解:

常量池需要:是一块存于在堆内存的空间,顾名思义,里面的对象不得改变。

安全需要:常量的随意改变,必将导致程序的错误

保证hash码的唯一性:这也是一种性能优化手段,意味着不必每次都去计算新的哈希码

在java中,String被设计成final类,那为什么平时使用时,String的值可以被改变呢?

字符串常量池是java堆内存中一个特殊的存储区域,当我们建立一个String对象时,假设常量池不存在该字符串,则创建一个,若存在则直接引用已经存在的字符串。

看下面的代码:

s="abcd";

s = s + "ef";

//得到s为abcdef

看到这,感觉有点奇怪,这不是能改变嘛

其实s没有改变,编译器是为我们有创建了一个新的String对象,然后让s更改指向,指向新的String,随后旧的String对象就会被编译器销毁

 

 

13、final、finally 和 finalize 的区别?

详解:https://www.cnblogs.com/ktao/p/8586966.html

我的理解:

final:修饰符,被修饰的方法不能被重写,变量不能改变,类不能被继承

finally:在程序执行了try或者catch,并且它们的方法体中没有直接结束程序语句块,那么finally语句块就将在程序结束前执行,注意,finally中有结束语句块时,将覆盖其他方法体中的语句块,即优先级更高

finalize:用于资源回收,一个对象的finalize()方法只会被调用一次,谨慎使用

 

14、static 关键字有什么作用?

Static关键词:https://www.cnblogs.com/xdp-gacl/p/3637407.html

我的理解:

被Static修饰的方法、变量属于类,不属于某个对象,存放于数据区,可以通过类名直接访问,并且如此访问效率更高,因为通过对象访问,底层依旧是通过类名访问

猜你喜欢

转载自blog.csdn.net/qq_36528311/article/details/87887819