什么是面向对象?
对比面向过程,面向对象更注重事情有哪些参与者(对象),以及各自需要做什么,而面向过程仅仅是注重事情的步骤以及顺序。就像洗衣机洗衣服这件事,面向过程会拆分成一个个小步骤,从打开洗衣机,放衣服,一直到烘干。面向对象会拆出人和洗衣机两个对象,人要做什么,洗衣机要做什么。面向过程比较直接,面向对象更易于复用,扩展和维护。
面向对象还有三大特性:封装、继承、多态 封装的意义在于明确出允许外部使用的所有成员变量和方法,而无需关系内部是怎么实现的 最常见的封装就是Javabean中的属性私有,对外开放getter和setter方法,还有就是mybatis调用方法操作数据库。
继承:就是基于父类去扩展子类,一个父类可以有多个子类,父类是子类共有的特性,子类是他们独有的特性。在项目中通常会把模型的id,gmtCreated,gmtModified放入一个类当中,让其他的类去继承,减少了代码的重复
多态:多态首先得满足有几个条件,1是得有继承关系,2.子类要重写方法,3.父类引用要指向子类对象 多态的好处是便于维护,更易于扩展,但它也有个坏处,就是不能调用子类特有的方法。
==与equals的区别
==对比的是栈中的值,对基本数据类型比较的是变量值,对引用类型比较的就是内存对象的地址
equals在object类中作用是和==是一样的,但通常来说我们会重写equals,比如String中的equals方法就是比较String对象的值是否是相同,底层是将一个个字符拆出来对比的。
后期理解String直接创建与new String的区别?
简述final作用
final可以修饰类,方法和变量,修饰类,表示该类不可以被继承,修饰方法,表示该方法不可以被重写,但可以被重栽,修饰变量,表示该变量不可以被重新赋值。
final修饰的成员变量,在声明的时候就要赋值,或者在代码块中和构造器中赋值,类变量在声明的时候就要赋值或者在静态代码块中进行赋值。 final修饰的局部变量,在声明时可以不赋值,但在使用之间一定要赋值, final修饰的引用类型的变量,一旦声明就不能指向另一个对象,也不能=null,但引用的值时可变的,像数组可以改变某一索引值的位置,对象可以改变它的属性。
为什么局部内部类和匿名类只能访问局部final变量
当外部类方法结束时,局部变量就销毁了,这时如果内部类还没有结束,访问了外部类方法已经被销毁的变量,就会出现一个错误,为了解决这个问题,内部类就会复制局部变量称为内部类的成员变量,内部类任可访问它,但如果局部变量发生改变与这个copy的变量不一样时,也会发生错误,所有给局部变量加个final,不给它改变,这实际上就是个妥协。在idea中好像是给内部类调用的局部变量自动加了个final。
String、StringBuffer、StringBuilder区别以及使用场景
String的源码是用final修饰的,每次创建不会改变对象,而是产生新的对象 这就造成了内存的浪费 StringBuffer和StringBuilder是在原对象上进行操作,不会产生新的对象,所以说要经常改变值的话,最好用StringBuffer和StringBuilder
StringBuffer在源码中方是法被synchronized修饰,是线程安全的,StringBuilder没有synchronized修饰是线程不安全的,性能方面是StringBuilder比StringBuffer要要好一点。
如果在单线程情况下,考虑性能选择用StringBuffer,在多线程情况下,多个线程共享变量使用StringBuffer
重载和重写的区别
重载是发生在一个类当中,方法名必须相同,参数个数,类型,顺序不同。访问修饰符和返回类型是没有关系的,如果只有这个不同编译时是会发生错误的
重写是发生在父子类当中,方法名,参数列表必须相同,返回值范围要小于等于父类,抛出的异常范围小于等于父类,访问修饰符要大于等于父类;如果父类访问修饰符为private,则方法不能被重写。
|