1、什么是面向对象?面向对象和面向过程的区别?
答:
面向对象是一种万物皆对象的编程思想,任何物体都可以归为一类事物,而一个个个体都是一类事物的实例。面向对象的编程是以对象为中心,以消息为驱动的。
区别:
①编程思路不同:面向过程以实现功能的函数开发为主,面向对象是首先抽象出类、属性及其方法,然后通过实例化、执行方法来完成功能。
②封装性:都具有封装性,但是面向过程是封装的是功能,而面向对象封装的是数据和功能。
③面向对象有继承性和多态性,而面向过程没有。
—————————————————————————————————
2、面向对象的三大特性?解释?
答:
①封装:把数据和操作数据的方法封装起来,对数据的访问和操作只能通过定义好的接口。
②继承:从已有类得到继承信息创建新类的过程。提供继承信息的类称为父类、超类、基类等,得到继承信息的类被叫做子类、派生类。
③多态:多态分为编译时多态(方法重载)和运行时多态(方法重写)。
这里需要注意以下几点:
(1)重写和重载的区别:
(2)⼦类拥有⽗类对象所有的属性和⽅法(包括私有属性和私有⽅法),但是⽗类中的私有属性和⽅法⼦类是⽆法
访问,只是拥有。因为在⼀个⼦类被创建的时候,⾸先会在内存中创建⼀个⽗类对象,然后在⽗类对象外部放上⼦
类独有的属性,两者合起来形成⼀个⼦类的对象; ⼦类可以拥有⾃⼰属性和⽅法; ⼦类可以⽤⾃⼰的
⽅式实现⽗类的⽅法。(重写)
——————————————————————————————————
3、JDK,JRE,JVM三者之间的关系为:
答:
JDK(Java Development Kit):是 Java 开发⼯具包,是整个 Java 的核⼼,包括了 Java 运⾏环境 JRE、Java ⼯具
和 Java 基础类库。
JRE( Java Runtime Environment):是 Java 的运⾏环境,包含 JVM 标准实现及 Java 核⼼类库。
JVM(Java Virtual Machine):是 Java 虚拟机,是整个 Java 实现跨平台的最核⼼的部分,能够运⾏以 Java 语⾔写作的软件程序。所有的 Java 程序会⾸先被编译为 .class 的类⽂件,这种类⽂件可以在虚拟机上执⾏
——————————————————————————————————
4、Java 中是否可以重写⼀个 private 或者 static ⽅法?
答:
Java 中 static ⽅法不能被覆盖,因为⽅法覆盖是基于运⾏时动态绑定的,⽽ static ⽅法是编译时静态绑定的。
static ⽅法跟类的任何实例都不相关,所以概念上不适⽤。
Java 中也不可以覆盖 private 的⽅法,因为 private 修饰的变量和⽅法只能在当前类中使⽤, 如果是其他的类继承当前类是不能访问到 private 变量或⽅法的,当然也不能覆盖。
静态⽅法补充:静态的⽅法可以被继承,但是不能重写。如果⽗类和⼦类中存在同样名称和参数的静态⽅
法,那么该⼦类的⽅法会把原来继承过来的⽗类的⽅法隐藏,⽽不是重写。通俗的讲就是⽗类的⽅法和⼦类的⽅法是两个没有关系的⽅法,具体调⽤哪⼀个⽅法是看是哪个对象的引⽤;这种⽗⼦类⽅法也不在存在多态的性质。
————————————————————————————————————
5、构造器是否可以被重写?
答:
⽗类的私有属性和构造⽅法并不能被继承,所以 Constructor 也就不能被Override(重写),但是可以 Overload(重载),所以你可以看到⼀个类中有多个构造函数的情况。
——————————————————————————————————————
6、构造方法有哪些特性?
答:
(1)名字与类名相同;
(2)没有返回值,但不能⽤ void 声明构造函数;
(3)成类的对象时⾃动执⾏,⽆需调⽤。
——————————————————————————————————————
7、在 Java 中定义⼀个不做事且没有参数的构造⽅法有什么作⽤?
答:
Java 程序在执⾏⼦类的构造⽅法之前,如果没有⽤ super() 来调⽤⽗类特定的构造⽅法,则会调⽤⽗类中“没有参
数的构造⽅法”。
因此,如果⽗类中只定义了有参数的构造⽅法,⽽在⼦类的构造⽅法中⼜没有⽤ super() 来调⽤⽗类中特定的构造
⽅法,则编译时将发⽣错误,因为 Java 程序在⽗类中找不到没有参数的构造⽅法可供执⾏。解决办法是:在⽗类
⾥加上⼀个不做事且没有参数的构造⽅法。
———————————————————————————————————————
8、Java中创建对象的几种方式?
答:
1、使⽤ new 关键字;
2、使⽤ Class 类的 newInstance ⽅法,该⽅法调⽤⽆参的构造器创建对象(反射):
Class.forName.newInstance(); 3、使⽤ clone() ⽅法;
4、反序列化,⽐如调⽤ ObjectInputStream 类的 readObject() ⽅法。
————————————————————————————————————————
9、抽象类和接口有什么区别?
答:
(1)抽象类中可以定义构造函数,接口不能定义构造函数。
(2)抽象类中可以有抽象方法和具体方法,但是接口中只能有抽象方法。
(3)抽象类中的成员权限可以是public、默认、protected(注意抽象类中抽象方法就是为了可以重写,所以不能被private修饰),而接口中的成员只可以是public,方法默认:public abstract、成员变量默认为:public static final)
(4)抽象类中可以包含静态方法,而接口中不可以。
JDK8中有所改变:
JDK1.8中,允许在接口中包含带有具体实现的方法,使用default修饰,这类方法就是默认方法。
抽象类中可以包含静态⽅法,在 JDK1.8 之前接⼝中不能包含静态⽅法,JDK1.8 以后可以包含。之前不能包含
是因为,接⼝不可以实现⽅法,只可以定义⽅法,所以不能使⽤静态⽅法(因为静态⽅法必须实现)。现在可以包
含了,只能直接⽤接⼝调⽤静态⽅法。JDK1.8 仍然不可以包含静态代码块。
——————————————————————————————————————————
10、静态变量和实例变量的区别?
答:
静态变量:是被 static 修饰的变量,也称为类变量,它属于类,因此不管创建多少个对象,静态变量在内存中有且
仅有⼀个拷⻉;静态变量可以实现让多个对象共享内存。
实例变量:属于某⼀实例,需要先创建对象,然后通过对象才能访问到它
——————————————————————————————————————————
11、short s1 = 1;s1 = s1 + 1;有什么错?那么 short s1 = 1; s1 += 1;呢?有没有错误?
答:
对于 short s1 = 1; s1 = s1 + 1; 来说,在 s1 + 1 运算时会⾃动提升表达式的类型为 int ,那么将 int 型值赋值给
short 型变量,s1 会出现类型转换错误。
对于 short s1 = 1; s1 += 1; 来说,+= 是 Java 语⾔规定的运算符,Java 编译器会对它进⾏特殊处理,因此可以正确
编译。
——————————————————————————————————————————
12、Integer和int的区别?
答
(1)int 是 Java 的⼋种基本数据类型之⼀,⽽ Integer 是 Java 为 int 类型提供的封装类;
(2)int 型变量的默认值是 0,Integer 变量的默认值是 null,这⼀点说明 Integer 可以区分出未赋值和值为 0 的
区分;
(3)Integer 变量必须实例化后才可以使⽤,⽽ int 不需要。
详细说说两者之间的对比:
—————————————————————————————————————————
13、Object 的常⽤⽅法有哪些?
答:
——————————————————————————————————————————
14、final、finally、finalize的区别?
答:
final:⽤于声明属性、⽅法和类,分别表示属性不可变、⽅法不可覆盖、被其修饰的类不可继承;
finally:异常处理语句结构的⼀部分,表示总是执⾏;
finallize:Object类的⼀个⽅法,在垃圾回收时会调⽤被回收对象的finalize。
——————————————————————————————————————————
15、==和equals的区别
答:
https://blog.csdn.net/why_youjjww/article/details/106352996?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163093356916780269844589%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=163093356916780269844589&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-2-106352996.first_rank_v2_pc_rank_v29&utm_term=%3D%3D%E5%92%8Cequals%E7%9A%84%E5%8C%BA%E5%88%AB&spm=1018.2226.3001.4187
——————————————————————————————————————————
16、两个对象的 hashCode() 相同,则 equals() 也⼀定为 true 吗?
答:
两个对象的 hashCode() 相同,equals() 不⼀定为 true。因为在散列表中,hashCode() 相等即两个键值对的哈希
值相等,然⽽哈希值相等,并不⼀定能得出键值对相等【散列冲突】。
——————————————————————————————————————————
17、为什么重写 equals() 就⼀定要重写 hashCode() ⽅法?
答:
——————————————————————————————————————————————
18、&和&&的区别?
答:
Java 中 && 和 & 都是表示与的逻辑运算符,都表示逻辑运输符 and,当两边的表达式都为 true 的时候,整个运算
结果才为 true,否则为 false。
&&:有短路功能,当第⼀个表达式的值为 false 的时候,则不再计算第⼆个表达式;
&:不管第⼀个表达式结果是否为 true,第⼆个都会执⾏。除此之外,& 还可以⽤作位运算符:当 & 两边的表达式
不是 Boolean 类型的时候,& 表示按位操作。
——————————————————————————————————————————————
19、Java中的参数传递是传值还是传引用。
答:
Java 的参数是以值传递的形式传⼊⽅法中,⽽不是引⽤传递。
当传递⽅法参数类型为基本数据类型(数字以及布尔值)时,⼀个⽅法是不可能修改⼀个基本数据类型的参数。
当传递⽅法参数类型为引⽤数据类型时,⼀个⽅法将修改⼀个引⽤数据类型的参数所指向对象的值。即使 Java 函
数在传递引⽤数据类型时,也只是拷⻉了引⽤的值罢了,之所以能修改引⽤数据是因为它们同时指向了⼀个对象,
但这仍然是按值调⽤⽽不是引⽤调⽤。
——————————————————————————————————————————————
20、Java中的Math.round(-1.5)等于多少?
答:
等于 -1,因为在数轴上取值时,中间值(0.5)向右取整,所以正 0.5 是往上取整,负 0.5 是直接舍弃
———————————————————————————————————————————————
21、两个⼆进制数的异或结果是什么?
答:
两个⼆进制数异或结果是这两个⼆进制数差的绝对值。表达式如下:a^b = |a-b|。
两个⼆进制 a 与 b 异或,即 a 和 b 两个数按位进⾏运算。如果对应的位相同,则为 0(相当于对应的算术相减),
如果不同即为 1(相当于对应的算术相加)。由于⼆进制每个位只有两种状态,要么是 0,要么是 1,则按位异或
操作可表达为按位相减取值相对值,再按位累加。
————————————————————————————————————————————————
22、深克隆和浅克隆的区别?
答:
————————————————————————————————————————————————
23、什么是Java的序列化,如何实序列化。
答:
对象序列化是⼀个⽤于将对象状态转换为字节流的过程,可以将其保存到磁盘⽂件中或通过⽹络发送到任何其他程
序。从字节流创建对象的相反的过程称为反序列化。⽽创建的字节流是与平台⽆关的,在⼀个平台上序列化的对象
可以在不同的平台上反序列化。序列化是为了解决在对象流进⾏读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现 Serializable 接⼝,该接⼝没有需要实现的⽅法,只是⽤于标注该对象是
可被序列化的,然后使⽤⼀个输出流(如:FileOutputStream)来构造⼀个 ObjectOutputStream 对象,接着使
⽤ ObjectOutputStream 对象的 writeObject(Object obj) ⽅法可以将参数为 obj 的对象写出,要恢复的话则使⽤
输⼊流。
什么情况下需要序列化?