1. 面向对象
1. 什么是面向对象
面向对象的概念要对比面向过程来说,这二者就是处理问题不同的角度
面向过程注重事情的步骤和顺序,面向对象更注重事情有哪些参与者(对象),及各自需要做什么
举个栗子:比如把大象装进冰箱
对于面向过程来说,把大象装进冰箱,需要打开冰箱门→将大象放进冰箱→关上冰箱门
对于面向对象来说会拆分成两个对象:
人:打开冰箱 把大象放进冰箱
大象:需要进入冰箱中
由此例子可以看出,面向过程比较直接高效,面向对象更易于复用,扩展和维护
2.面向对象的特性
首先面向对象的有三大特性:封装,继承,多态 也可以扩展为四大,多一个抽象
1.封装:封装的意义在于明确标识处允许外部使用的所有成员变量函数和数据,也就是说对所有的属性和数据进行一个封装,保证了数据的安全性和方便外部的调用,外部的调用无需关心内部的实现
2.继承:简单来说就是子承父业,基于父类已有的属性和方法,可对自己进行扩展和改变,并且父类已有的属性和方法不需要再进行定义,可直接使用
3.多态:基于对象所属类的不同,对外部同一个方法的调用,使用多态必须要有继承,方法的重写,父类引用指向子类对象,但是无法调用子类独有的方法
2.JDK、JRE、JVM三者区别和联系
JDK:(Java Develpment Kit) java的开发工具 提供给开发人员使用
JRE:(Java Runtime Environment) java运行时环境 只能运行java项目
JVM:(Java Virtual Machine) java虚拟机 编译class文件,让操作系统可以执行
JDK包含JRE和java工具,JRE包含JVM和lib类库
编译的过程:
.java文件通过javac编译成.class文件→.class文件通过不同系统的JVM进行解析→成功运行
所以可体现java的跨平台性,根据不同系统的JVM进行解析,只需要一处编译多处运行
3.==和equals
==对比的是栈中的值,基本属性比较的是变量的值,引用类型比较的是堆中内存的地址值
栈和堆:一般基本类型的值都存在与栈中,而引用类型创建的对象都存在与堆中
equals:在object中通常也采用==方式比较,但是通常会进行重写,重写后的equals用来比较方法两个对象的内容是否相等 ,注意equals方法不能用于基本数据类型的变量
4.Java中的重写和重载有哪些区别
方法的重写和重载都是实现多态的方式,,区别是重载实现的是编译时的多态,重写是实现运行时的多态
重载:发生在一个类中,同名的方法如果有不同的=参数列表(参数列表不同,参数的个数不同或者二者都不同),则视为重载;
重载的规则:
1.方法名一致,参数列表中参数的顺序,类型,个数不同
2.重载与方法的返回值无关,存在于父类和子类中,同类中
3.可以抛出不同的异常,可以有不同的修饰符
重写:发生在子类与父类之间,重写要求子类被重写的方法与父类被重写的方法有相同的返回值,比父类的方法更好访问,不能比父类被重写的方法声明更多的异常.而重载对返回值没有特殊的要求
重写的规则:
1.参数列表必须完全与被重写的方法一致,返回值类型必须完全与重写的方法返回值类型一致
2.重写的方法能够抛出任何非运行时异常,无论被重写的方法是否抛出异常.但是,重写的方法不能抛出新的强制性异常,或者比重写的方法声明的更广泛的强制性异常,反之则可以
英文 | 位置 | 修饰符 | 返回值 | 方法名 | 参数 | 抛出异常 | 方法体 | |
---|---|---|---|---|---|---|---|---|
重载 | overload | 同一个类中 | 无关 | 无关 | 必须相同 | 必须相同 | 无关 | 不同 |
重写 | override | 子类父类中 | 父类权限修饰符要低于子类 | 父类的返回值类型大于子类 | 必须相同 | 必须相同 | 小于等于 | 不同 |
5.接口和抽象类有哪些区别
不同点:
抽象类:
1.抽象类中可以定义构造器
2.抽象类中的方法可以有吧方法体
3.抽象类中可以定义成员变量
4.有抽象方法的类必须声明成抽象类,而抽象类未必要有抽象方法
5抽象类中可以报包含静态方法
6.一个类只能继承一个抽象类
接口:
1.接口中不能定义构造器
2.接口中的方法全部都是抽象方法
3.接口中的方法都是public修饰的
4.接口中定义的成员变量实际上都是常量
5.接口中不能有静态方法
6.一个类可以实现多个接口
相同:
1.不能实例化
2.可以将抽象类和接口类型作为引用类型
3.一个类如果继承了某个抽象对象或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍需要被声明为抽象类
6.怎么声明一个类不会被继承,什么场景下会用
如果一个类用final修饰,此类不可以有子类,不能被其他类继承,如果一个类中的方法都没有重写的需要,当前类没有子类也罢,就可以用final修饰
7.String、StringBuffer、StringBuilder的区别及应用场景
Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,他们可以储存操作字符串
区别:
String:是只读字符串,也就是String引用的字符串内容是不可改变的
StringBuffer/StringBuilder:表示字符串对象可以直接进行修改
StringBuffer可应用于多线程,且是线程安全的,但是效率相比StringBuilder要低
StringBuilder是单线程环境下使用的,它是线程不安全的,但是效率要高于StringBuffer
8.Java代理的几种实现方式
1.静态代理:也叫jdk代理,只能静态代理某些类或者方法,不推荐谁用,功能比较弱,但是编码简单
2.动态代理:包含Proxy代理和CGlib代理
9.HashMap和HashTable的区别
相同点:都实现了map,cloneable(可克隆),Serializable(可序列化)三个接口
不同点:
1.底层数据结构不同:JDK1.7之前都是数组+链表结构,但是JDK1.8以后,Hashmap加入了红黑树
2.Hashtable不允许key和value值为null,Hashmap的key和value值可以为null
3.添加key-value的Hash算法不同:Hashmap添加元素时,时使用自定义的哈希算法,而Hashtable添加元素时是使用的key的HashCode()算法
4.实现的方式不同:Hashtable继承的是Dictonary类,而Hashmap继承的是AbstractMap类
5.初始化容量不同:Hashmap的初始化容量是16,Hashtable的初始容量是11.负载因子都是0.75
6.扩容的机制不同:当 已用容量>总容量*负载因子,Hashmap的扩容机制是当前容量翻倍,Hashtable的扩容机制是当前容量翻倍+1
7.支持遍历的种类不同:Hashmap只支持Iterator,而Hashtable支持Iterator还支持Enumeration
8.迭代器不同:Hashmap的迭代器是fail-fast
9.部分API不同:Hashmap不支持contains和toString,而Hashtable则支持
10.同步性不同:Hashtable是同步的,适用于多线程,Hashmap是不同步的,适用于单线程
10.多线程的几种实现方式
1.继承Thread类,重写run()
2.实现Runnable接口,重写run(),实现Runnable接口的实现类的实例对象作用Thread构造函数的target
3.通过Callable和FutureTask创建线程
4.通过线程池创建线程