一、何为面向对象
面向对象简单来说就是一种编程方式,也可以说是一种思维方式,面向对象会注重一件事情的参与者(对象)、以及各自需要做什么动作。而面向过程则是更注重一件事情的每一个步骤以及顺序。
因此面向过程编程比较直接,而面向对象更利于代码的复用和扩展以及后续维护。
面向对象三大特点:
1、封装
封装在于明确标识出允许外部使用的所有成员函数和数据项,而不必在乎内部的实现细节,重在使用。
经典的封装的场景Javabean。实体的属性私有,对外提供getter、setter方法,对属性的赋值或者获取逻辑只能由JavaBean本身决定,而不能由外部修改。
2)orm框架:当我们需要去操作数据库,不需要关心如何在Java与SQL之间建立连接,也不用关心SQL怎么执行,只需要引入mybatis,调用方法就可以了。
2、继承
继承基类的方法,并做出自己的改变或者扩展。比如在许多类里面存在相同的业务逻辑,那么就可以把这一段相同的业务逻辑提取出来成为一个单独的类,给别的需要使用的类继承,而不是自己再去定义。从而降低代码冗余,也方便在后续开发中对代码的维护。
3、多态
基于对象所属类的不同,外部对同一个方法的调用,实际执行逻辑不同
条件:继承、方法重写、父类引用指向子类对象。
比如:父类 变量名=new 子类
变量名.方法名();
同时多态也存在一个弊端 无法调用子类特有的方法。
二、JDK、JRE、JVM三者区别和联系
JDK:开发环境 JRE:运行环境 JVM:Java虚拟机(实现Java跨平台的重要工具)
具体关系如图:
三、==和equals的区别
首先
equals():是超类Object中的方法。
==:是操作符
2、
equals():用来检测两个对象是否相等,即两个对象的内容是否相等。
==:用于比较引用和比较基本数据类型时具有不同的功能,具体如下:
(1)、基础数据类型:比较的是他们的值是否相等,比如两个int类型的变量,比较的是变量的值是否一样。
(2)、引用数据类型:比较的是引用的地址是否相同,比如说新建了两个User对象,比较的是两个User的地址是否一样。
3、
equals():没有==运行速度快。
==:运行速度比equals()快,因为==只是比较引用。
四、string、stringBuffer、stringBuilder
1、string是final修饰的,不可变,每次操作会产生新的string对象。
2、stringBuffer、stringBuilder都是在原对象上操作。
3、stringBuffer:线程安全、stringBuilder:线程不安全。
4、stringBuffer的方法都是synchronized修饰的
5、性能:stringBuilder>stringBuffer>string
五、重载和重写的区别
重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同、方法返回值和访问修饰符可以不同
重写:发生在父子类中,方法名、参数列表相同返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类,如果父类方法访问修饰符为private则子类就不能重写。
六:接口和抽象类的区别
1、抽象类可以存在普通成员函数、而接口中只能存在公共的抽象(public abstract)方法
2、抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public final类型的
3、抽象类只能继承一个,接口可以实现多个。
4,接口的设计目的是对类的行为进行约束,提供一种机制,可以强制要求不同类具有相同的行为,它只约束了行为的有无,但是不对实现行为进行限制。
而抽象类的设计目的是代码的复用,当不同的类有相同的行为,
(未完...)
七、List和Set的区别
List、Set都继承自Collection接口;
1、List:有序、按照对象进入的顺序存储对象,可重复,允许多个Null元素,可以使用迭代器(Iterator)取出所有元素,在逐一遍历,还可以使用get(int index)获取指定下标的元素。有三个实现类:LinkedList,ArrayList,Vector。
2、Set:无序,不可重复(注意:元素虽然无放入顺序,但是元素在Set中的位置是由该元素的HashCode决定的,其位置是固定的),最多允许一个Null元素,只能通过迭代器(Iterator)取出所有元素再逐一遍历各个元素。
有两个实现类:
HashSet:底层由HashMap实现,元素的唯一性是靠所存储元素类型是否重写hashCode()和equals()方法来保证的,
LinkedHashSet:底层数据结构采用链表和哈希表共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。线程不安全,效率高。
TreeSet:底层数据结构采用二叉树来实现,元素唯一且已经排好序;唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性。根据构造方法不同,分为自然排序(无参构造)和比较器排序(有参构造),自然排序要求元素必须实现Compareable接口,并重写里面的compareTo()方法,元素通过比较返回的int值来判断排序序列,返回0说明两个对象相同,不需要存储;比较器排需要在TreeSet初始化是时候传入一个实现Comparator接口的比较器对象,或者采用匿名内部类的方式new一个Comparator对象,重写里面的compare()方法;
八、hashCode()和equals()
hashCode():
作用:是获取哈希码,返回的是一个int整数
equals()
作用:是判断两个对象是否相等
总结:
1.HashCode方法和equals方法都是Object类中的方法,即所有对象都有equals方法和HashCode方法;
2.两个对象通过equals比较是相等的,那么HashCode肯定相等;相反的,两个对象通过HashCode比较是相等的,那么equals不一定相等;
3.只要重写equals方法,就必须重写HashCode方法;