什么是面向对象
在我理解,面向对象是向现实世界模型的自然延伸,这是一种“万物皆对象”的编程思想。在现实生活中的任何物体都可以归为一类事物,而每一个个体都是一类事物的实例。面向对象的编程是以对象为中心,以消息为驱动,所以程序=对象+消息。
面向对象有三大特性,封装、继承和多态。
封装就是将一类事物的属性和行为抽象成一个类,使其属性私有化,行为公开化,提高了数据的隐秘性的同时,使代码模块化。这样做使得代码的复用性更高。
继承则是进一步将一类事物共有的属性和行为抽象成一个父类,而每一个子类是一个特殊的父类--有父类的行为和属性,也有自己特有的行为和属性。这样做扩展了已存在的代码块,进一步提高了代码的复用性。
如果说封装和继承是为了使代码重用,那么多态则是为了实现接口重用。多态的一大作用就是为了解耦--为了解除父子类继承的耦合度。简单来说,多态就是允许父类引用(或接口)指向子类(或实现类)对象。很多的设计模式都是基于面向对象的多态性设计的。
面向对象和面向过程的区别
面向过程:是分析解决问题的步骤,然后用函数把这些步骤一步一步地实现,然后在使用的时候一一调用则可。性能较高,所以单片机、嵌入式开发等一般采用面向过程开发
面向对象:是把构成问题的事务分解成各个对象,而建立对象的目的也不是为了完成一个个步骤,而是为了描述某个事物在解决整个问题的过程中所发生的行为。面向对象有封装、继承、多态的特性,所以易维护、易复用、易扩展。可以设计出低耦合的系统。 但是性能上来说,比面向过程要低。
jdk8 新特性
Lambda表达式
函数式接口
方法引用和构造器调用
Stream API
接口中的默认方法和静态方法
新时间日期API
集合
标识符的命名规则
标识符的含义:
是指在程序中,我们自己定义的内容,譬如,类的名字,方法名称以及变量名称等等,都是标识符。
命名规则:(硬性要求)
标识符可以包含英文字母,0-9的数字,$以及_
标识符不能以数字开头
标识符不是关键字
命名规范:(非硬性要求)
类名规范:首字符大写,后面每个单词首字母大写(大驼峰式)。
变量名规范:首字母小写,后面每个单词首字母大写(小驼峰式)。
方法名规范:同变量名。
八种基本数据类型的大小,以及他们的封装类
final的作用
修饰类:表示不可以被继承
修饰方法:表示方法不可被子类覆盖,但可以重载;
修饰变量:表示变量一但被赋值,不可以更改它的值;
为什么局部内部类和匿名内部类只能访问局部final变量?
内部类和外部类处于同一级别,内部类不会因为定义在方法中就会随着方法的执行完毕就会被销毁;
将局部变量设置为final,对它初始化后,就不让你去修改这个变量,保证了内部类的成员变量和方法局部变量的一致性;
java中String、StringBuffer和StringBuilder的区别
三者共同之处:都是final类,不允许被继承
StringBuffer是线程安全,可以不需要额外的同步用于多线程中;
StringBuilder是非同步,运行于多线程中就需要使用着单独同步处理,但是速度就比StringBuffer快多了;
StringBuffer与StringBuilder两者共同之处:可以通过append、indert进行字符串的操作。
String实现了三个接口:Serializable、Comparable<String>、CarSequence
StringBuilder只实现了两个接口Serializable、CharSequence,相比之下String的实例可以通过compareTo方法进行比较,其他两个不可以。
重载和重写的区别
重载:发生在同一类中,方法名必须相同,参数类型个数不同,顺序不同,方法返回值和访问修饰符可以不同,发生在编译时;
重写:发送在父子类中,方法名,参数列表必须相同。返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。如果父类访问修饰符为private,就不能重写该方法。
接口和抽象类的区别
抽象类可以存在普通成员函数,而接口中只能存在public abstract方法;
抽象中的成员变量可以是各种类型的,而接口中的成员变量只能是public abstract final类型的;
抽象类只能继承一个,接口可以实现多个;
接口的设计目的是对类的行为进行约束,也就是提供了一种机制,可以强制要求不同的类具有相同的行为,它只约束了行为是对的有无,当不对如何实现行为进行限制。
而抽象类的设计目地,是代码复用,当不同的类具有一些相同的行为时,其中一部分行为的实现方式一致时,可以让这些类都派生出一个抽象类;
equals与==的区别
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。
1、比较的是操作符两端的操作数是否是同一个对象。
2、两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。
3、比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为true,如:
int a=10 与 long b=10L 与 double c=10.0都是相同的(为true),因为他们都指向地址为10的堆。
equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。
List和Set的区别
List:有序,按照对象进入的顺序保存对象,可重复,容许多个null对象,可以使用iterator取出所有元素在逐一遍历,还可以使用get获取指定下标的元素
Set:无序,不可重复,最多容许一个null元素对象。获取元素时,只能使用iterator取出所有元素在逐一遍历。
ArraysList与LinkedList的区别
ArraysList:基于动态数组,连续内存存储,适合下标访问。扩容机制:因为数组长度固定,超出长度存数据时需要新建数组,然后将老数组的数据拷贝到新数组,若不是尾部插入数据还会涉及到元素移动。使用尾插法并指定初始容量可以极大的提升性能。
LinkedList: 基于链表,可以存储在分散的内存中,适合做数据插入及删除操作。不适合查询,需要逐一遍历;遍历必须使用iterator不能使用for循环,因为每次for循环体内通过get取得默一元素时都需要对list进行重新遍历;
Servlet的生命周期
生命周期有5部分:加载,初始化,服务,销毁,卸载
1)加载Servlet:
Web容器负责加载Servlet,当web容器启东时或者在第一次使用这个Servlet的时候,容器会负责创建Servlet实例,但是用户必须通过web.xml指定Servlet的位置,成功加载后,Web容器会通过反射的方式对Servlet进行实例化。
2)初始化:
当一个servlet被实例化之后,容器将调用init()方法初始化这个对象,以便在处理请求之前完成一些动作。
3)服务
当有请求提交时,将会先调用Servlet的service方法进行处理,然后service通过反射获取请求方法,转发到相应的doGet()或者其他方法。当自己实现service方法时,如果想直接在service方法里实现逻辑,就不用调用父类的方法。否则,还会先转发到相应的get/post方法里执行后在调用service方法里自己的逻辑。
4、销毁
大部分web容器关闭或者检测到一个servlet要从容器中被删除时,会自动调用destory方法。
5、卸载
但一个servlet调用玩destory后,此实例将被垃圾回收,当需要再次使用时,将会重新调用init方法。需要注意的是,在正常情况下,Servlet只会初始化一次,但是当Servlet长时间不使用的话,也会被容器自动销毁,而如果需要再次使用时,会重新进行初始化操作,即在特殊情况下初始化操作和销毁操作也会执行多次。
TreeSet(二叉树)
- TreeSet()是使用二叉树的原理对新 add()的对象按照指定的顺序排序(升序、降序),每增加一个对象都会进行排序,将对象插入的二叉树指定的位置。
- Integer 和 String 对象都可以进行默认的 TreeSet 排序,而自定义类的对象是不可以的,自己定义的类必须实现 Comparable 接口,并且覆写相应的 compareTo()函数,才可以正常使用。
- 在覆写 compare()函数时,要返回相应的值才能使 TreeSet 按照一定的规则来排序
- 比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
LinkHashSet(HashSet+LinkedHashMap)
对于 LinkedHashSet 而言,它继承与 HashSet、又基于 LinkedHashMap 来实现的。LinkedHashSet 底层使用 LinkedHashMap 来保存所有元素,它继承与 HashSet,其所有的方法操作上又与 HashSet 相同,因此 LinkedHashSet 的实现上非常简单,只提供了四个构造方法,并通过传递一个标识参数,调用父类的构造器,底层构造一个 LinkedHashMap 来实现,在相关操作上与父类 HashSet 的操作相同,直接调用父类 HashSet 的方法即可。
Java创建对象有几种方式
new创建新对象
通过反射机制
采用clone机制
通过序列化机制
instanceof 关键字的作用
instanceof 严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例
Java自动装箱与拆箱
装箱就是自动将基本数据类型转换为包装器类型(int–>Integer);调用方法:Integer的valueOf(int) 方法
拆箱就是自动将包装器类型转换为基本数据类型(Integer–>int)。调用方法:Integer的intValue方法