文章目录
一、JAVA的三大特性
1、封装
Java中的封装是指一个类把自己内部的实现细节进行隐藏,只暴露对外的接口。封装又分为属性的封装和方法的封装,把属性定义为私有的,他们通过setter和getter方法对属性的值进行设定和获取。
封装目的:增强安全性和简化编程,使用者不必在意具体实现细节,通过外部接口就可以访问类的成员。
2、继承
继承是指将多个相同的属性和方法提取出来,新建一个父类。Java中一个类只能继承一个父类,且只能继承访问权限非private的属性和方法。
继承目的:实现代码复用
3、多态
它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。
对面向对象来说,多态分为编译时多态和运行时多态。
- 编译时多态:是指Java允许方法名相同而参数不同。
- 运行时多态: 是指Java运行根据调用该方法的类型决定调用哪个方法。
二、什么是JAVA的序列化以及反序列化?
序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
对象的序列化主要有两种用途:
- 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
- 在网络上传送对象的字节序列;
对象序列化机制(object serialization)是java语言内建的一种对象持久化方式,通过对象序列化,可以将对象的状态信息保存未字节数组,并且可以在有需要的时候将这个字节数组通过反序列化的方式转换成对象,对象的序列化可以很容易的在JVM中的活动对象和字节数组(流)之间进行转换。
Java为了方便开发人员将java对象序列化及反序列化提供了一套方便的API来支持。
java.io.Serializable
三、说说你对反射的理解
Java中创建对象大概有这几种方式:
- 使用new关键字:最简单的方式
- 使用Clone方法:无论何时调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去。
- 使用反序列化
简单来说,反射就是在程序的运行过程中被允许对程序本身进行操作,比如自我检查、进行装载、获取类本身、类的所有成员变量和方法、类对象。还可以在运行过程中动态的创建类的实例,通过实例来调用类的方法。
利用反射机制可以获取类对象
- 类名.class();
- 对象名.getClass();
- Class.forName(类的路径名);
四、说说你对Java中泛型的理解
泛型指的就是广泛通用的类型,就是为了参数化类型,或者说可以将类型当做参数传递给一个类或者方法。
泛型好处
泛型的主要目的是实现java的类型安全,泛型可以使编译器知道一个对象的限定类型是什么,消除了强制类型转换,使得代码可读性好,减少了很多出错的机会。
泛型的实现原理
泛型的实现时靠类型擦除技术,类型擦除是在编译期完成的,也就是在编译期编译器会将泛型的类型参数都擦除成它的限定类型,如果没有则擦除为object类型之后在获取的时候再强制类型转换为对应的类型。在运行期间并没有泛型的任何信息,因此也没有优化。
五、说说抽象类和接口的区别?
下面比较一下两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。
下面接着再说说两者在应用上的区别:
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重
六、java中重写equals后为什么还有重新hashcode方法?
hashCode:是一个native方法,返回的是对象的内存地址,
equals:对于基本数据类型,==比较的是两个变量的值。对于引用对象,==比较的是两个对象的地址。
从hashCode的注释中我们看到,hashCode方法在定义时做出了一些常规协定,即
1,当obj1.equals(obj2) 为 true 时,obj1.hashCode() == obj2.hashCode()
2,当obj1.equals(obj2) 为 false 时,obj1.hashCode() != obj2.hashCode()
hashcode是用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。如果我们将对象的equals方法重写而不重写hashcode,当我们再次new一个新的对象的时候,equals方法返回的是true,但是hashCode方法返回的就不一样了,如果需要将这些对象存储到结合中(比如:Set,Map …)的时候就违背了原有集合的原则。