一.面向对象的三大特征:继承,封装,多态
继承的含义:指可以让某个类型的对象获得另一个类型的对象的属性的方法,可以使用现有的类的所有功能,并且无需编写,并对这些功能进行扩展
封装:把客观的实物封装成一个抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。对信息进行封装打包防止被随意使用
多态:(多种不同的表现方式)指一个类实例的相同的方法在不同的情形有不同的表现方式,多态机制使具有不同内部结构的对象可以共享相同的外部接口。
二.Abstract不能与那些类共存:
1.首先abstract是抽象关键字,通常用来修饰一个需要被重写的方法,所以被他修饰的类需要重写,而final修饰的是不可更改的方法,所以不能共存
2.因为abstract方法需要被重写,所以private(私有修饰符)表示不能被其他人使用所以不能共存
3.static表示静态,已经被分配了空间,但是abstract是没有实现的,是抽象的所以不能共存
三.访问修饰符private、protected、default、public每一个的意义
Private:表示私有,指被其修饰的方法或变量是不能够被其他的类或者方法使用
Protect:表示受保护,指比私有的安全性能差一点,在他自己的类里面能够被调用和使用,但是不能被其他的类使用
Default:是指其他的意思,但是只在switch里才有,意思是当没有case到相应的值时就执行default里的方法
Public:表示公共的,被public修饰的类或方法表示这个类或者方法是能够被其他的类或者方法使用
四. static的特点:
Static:表示静态,static修饰的元素是类信息,所以在类的初始化时,这些信息就会被执行;相对的类的实例化,则是在类的初始化之后才可以执行的。
五. 类与类、类与接口、接口与接口的关系:
类与类的关系:类与类存在继承关系,关键字extends,类与类之间只能单继承,可以多层继承(子类只可以继承一个父类,但是一个父类可以有多个子类),如果不实现父类中的所有方法,那么这个子类也是一个抽象类)。
类与接口的关系:类实现一个接口,关键字:implements(实现一个接口),interface(定义一个接口),一个类可以实现一个接口也可以实现多个接口,并且在继承一个类的同时还可以实现多个接口
1. 非抽象类实现一个接口时,必须要把接口中所有方法全部实现
2. 抽象类实现一个接口时,可以实现也可以不实现接口中的方法。
3. 一个类可以实现多个接口 。
接口与接口的关系:继承关系,如果A接口继承了B接口,那么在实现A接口的时候,A与B的方法都要实现。
接口与接口之间的注意事项:
1. 一个接口是可以继承多个接口的
六.final、finally、finalize的区别
这三者并没有什么联系,只是长得像而已。
Final的作用:用来定义不可更改的变量或者方法或类,被final定义之后其修饰的变量或者方法无法再被改变,被final声明的变量必须在声明时给定初始值,在之后的引用中只能读取不能修改;被final声明的方法只能使用,不能重载
Finally的作用:是try-catch-finally结构的一部分,一般用来关闭文件或释放其他系统资源。在流结构中,可以没有finally语句,但是如果存在finally语句的话,不论try块中是否发生异常,是否执行过catch语句,都执行finally语句,
Finalize的作用:finalize第object类的一个方法,在垃圾收集器执行的时候会调用被回收的对象的方法,供垃圾收集时的其他资源回收,例如关闭文件等
七.String、StringBuffer和StringBuilder的区别:
String:指字符串常量,每一次对String类型进行改变是其实等同于生成了一个新的String对象,然后指针指向新的String对象,所以经常改变内容的字符串最好不要用String
StringBuffer:字符串变量(线程安全)每次结果都会对StringBuffer对象本身进行操作,而不是生成新的对象,在改变对象引用。所以一般情况下推荐使用StringBueffer
StringBuilder:字符串变量(非线程安全)被用来做StringBuffer的一个简单替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍),如果有可能优先采用此类,因为在大多数实现中,它比StringBuffer更快,两者的方法基本相同。
八.equlas方法和”==”的区别,hashCode方法和equlas方法之间的关系
Equals方法:地址比较
“==”:一般是用来比较两个变量(基本类型和对象类型)的值是否相等,属于数值比较
如果两个变量是对象类型的,比较的是这两个对象在栈中的引用(即地址)那就要用equals比较
1.在object类中如果没有重写equals方法,equals和“==”也就相当于一样的
2.通常要重写equals方法,因为比较对象的内容比比较对象的引用(地址)要更好理解
3.在object类中如果没有重写hashcode,那么任何对象的hashcode都是不相等的
4.通常在集合类的时候需要重写hashcode和equals方法,如果需要给集合类添加对象,再添加之前需要查看集合里是否有了该对象,一般情况下用hashcode来比较
5.当对象的基本数据类型相同,那么hashcode一定相同
6.equals()相等的两个对象,hashcode()一般是相等的;equals()方法不相等的两个对象,hashcode()有可能相等
7.hashcode()不相等,一定能推出equals不相等;hashcode()相等,equals()可能相等,可能不相等,因为在object类中hashcode()方法是返回的的是对象的引用(地址值),equals()方法比较的也是两个对象的引用(地址值),如果equals()相等,说明两个对象的地址值也相等,当然hashcode()也就相等了
九.Collections:与Collection的区别
Collections:Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作,他包含了各种有关集合操作的静态多态方法,此类不能实例化就像一个工具类
Collection: Collection是集合类的上级接口,继承与他的接口主要有Set 和List. Collection接口在java库中有很多具体的实现,它的意义是为各种具体的集合提供了最大化的同意操作,方式:list、LinkedList、ArrayList、Vector、Stack、Set
十.Iterable/Iterator:二者的关系,与集合中其他接口/类的关系?什么是快速失败机制?解决了什么问题?迭代器的本质是啥?
Iterable:collection本身是实现的iterable,iterable是一个接口,这个方法只返回一个iterator的迭代器
Iterator:是常用的集合的迭代器,能遍历集合中的所有元素
所有集合类都实现了Collection接口,而Collection继承了iterable接口
什么是快速失败机制(fail-fast):当多个线程对同一个集合进行操作时,某个线程访问集合的过程中,该集合的内容被其他线程改变(即其他线程通过add、remove、clear等方法,改变了modCount的值)这时就会抛出ConcurrentModificationException异常,产生fail-fast事件。
快速失败机制解决了什么问题?
防止发生并发修改异常
迭代器的本质是什么?
迭代器的本质是:重载运算符和封装指针,算法使用迭代器来访问数据结构中的元素,实现了算法和数据结构的分离。使算法不依赖于特定的数据结构
十一.泛型:出现的意义,解决的问题,有啥优点?实现原理?与其他语言(比如C#)的泛型实现的机制相同吗?什么是语法糖,Java的语法糖还有那些,具体是怎么实现的?泛型类、泛型接口、泛型方法是怎么实现的?泛型中通配符怎么使用,extends和super的区别(此处特指泛型中的用法),理解集合源码中泛型的使用
泛型:提供和限制参数类型
优点:保证了类型安全,消除了类型的强制转换,提高了代码的通用性,提高了性能
解决了:强制转换类型的问题
具体是怎么实现的:java中的泛型都是在编译期间进行的,但是在编译期间,所有的泛型信息都会被擦除,在编译之后都会变成原始类型。这也是java的泛型被称为“伪泛型”的原因
与其他语言(比如C#)的泛型实现的机制相同吗?
不同,