1、面向对象和面向过程的区别:
- 面向对象:将问题抽象成对象,通过调用对象的方法解决问题(容易维护、扩展、复用);
- 面向过程:将问题抽象成一个个方法,执行一个个方法去解决。
2、对象的相等和引用相等的区别?
- 对象的相等:一般判断的是对象的内容是否一样;(equals)
- 引用相等:判断它们指向的内存地址是否相同。(==)
【想起一个知识点:“==”和“equals”的区别:
“==” 比较的是值是否相等
- 如果作用于基本数据类型的变量,则直接比较其存储的值是否相等,
- 如果作用于引用类型的变量,则比较的是所指向的对象的地址是否相等。
其实==比较的不管是基本数据类型,还是引用数据类型的变量,比较的都是值,只是引用类型变量存的值是对象的地址。
“equals”比较的是是否是同一个对象
- equals()方法不能作用于基本数据类型的变量
- 在没有重写equals()方法的类中,调用equals()方法其实和使用==的效果一样,也是比较的是引用类型的变量所指向的对象的地址
- Java提供的类中,有些类都重写了equals()方法。比如String,重写后的equals()方法一般都是比较两个对象的值。】
3、构造函数(梦回大二老师讲C++构造函数的时候·_·)
- 没有构造函数也可以正常运行,因为自带有默认的无参构造,so创建对象时需要加括号()去调用无参的构造函数
- 若自己添加了类的构造函数,这时默认构造函数不会自动添加了
- 若添加的是带参数的构造函数,同时需要写上无参构造函数
4、构造函数特点:
- 构造函数名和类名相同
- 构造函数没有返回值,但不能用void声明构造函数
- 生成类的对象时自动执行,无需手动调用
- 构造方法不能被重写(override:输入相同参数,产生不同效果),但是能重载(overload:根据参数不同多/少调用不同方法),所以一般有多个构造函数。
5、面向对象三大特征:
(1)封装:将一个对象的属性封装在对象内部(空调的零件封装在空调内部),不允许外部对象直接访问对象的内部信息。
但可以通过提供的方法操作属性(遥控器操作空调);
若不允许操作某些属性,不提供操作该属性的方法(遥控器不提供某些功能);
若所有属性都无法操作,该类也就失去了意义(遥控器完全不能操作空调)。
(2)继承:存在一部分不同类型的对象有着相似的共同点,可以将这些相似的点抽象成他们的父类。
学生(年级,姓名,学号...)
小红、小明、小李...他们有着共同的特性“学生”,但同时他们又有属于自己的特性,骑车/步行...上学。
继承就是使用已存在的列作为新的类的基础,新的类可以使用父类的功能,也可以新增属性或方法。通过继承可以快速创建新的类,提高代码的重用,提高开发效率。
tips:- 子类拥有父类所有的方法和属性(无论私有还是公有),但是私有属性和方法只是拥有无法访问
- 子类可以拥有自己的属性和方法,即在子类中进行扩充
- 子类可以用自己的方式实现父类的方法(父类只写了方法名,子类填充方法体)
(3)多态:一个对象具有多种的状态,具体表现为父类的引用指向子类的实例。
6、接口和抽象类的异同:
【抽象类:当一个子类重写了父类的方法后,经过向上转型,父类引用了子类的对象,再去调用这个方法时,调用的是子类的方法,和父类的方法无关,那么父类的这个方法就没有实现的必要了,那么我们就可以把它设计成一个抽象方法,包含抽象方法的类称为抽象类。】
同:都不能被实例化;都可以包含抽象方法;都可以有默认的实现方法。
异:(1)接口主要是对类进行约束,实现了某个接口就有了对应的行为;
抽象类主要用于代码复用,强调所属关系。
(2)一个类只能继承一个类,但可以实现多个接口;
(3)接口中的成员变量只能是public static final 类型的,不能被修改且必须有初始值,接口中的方法,默认都是被public abstract修饰的抽象方法; 而抽象类的成员变量默认 default,可在子类中被重新定义,也可被重新赋值。
7、深拷贝&浅拷贝:
8、Object类
Object 类是一个特殊的类,是所有类的父类。
9、hashCode()
hashCode()
的作用是获取哈希码(int
整数),也称为散列码。这个哈希码的作用是确定该对象在哈希表中的索引位置。
【来自javaGuide
hashCode()
和 equals()
都是用于比较两个对象是否相等
那为什么 JDK 还要同时提供这两个方法呢?
这是因为在一些容器(比如 HashMap
、HashSet
)中,有了 hashCode()
之后,判断元素是否在对应容器中的效率会更高(参考添加元素进HashSet
的过程)!
我们在前面也提到了添加元素进HashSet
的过程,如果 HashSet
在对比的时候,同样的 hashCode
有多个对象,它会继续使用 equals()
来判断是否真的相同。也就是说 hashCode
帮助我们大大缩小了查找成本。
那为什么不只提供 hashCode()
方法呢?
这是因为两个对象的hashCode
值相等并不代表两个对象就相等。
那为什么两个对象有相同的 hashCode
值,它们也不一定是相等的?
因为 hashCode()
所使用的哈希算法也许刚好会让多个对象传回相同的哈希值。越糟糕的哈希算法越容易碰撞,但这也与数据值域分布的特性有关(所谓哈希碰撞也就是指的是不同的对象得到相同的 hashCode
)。
总结下来就是:
- 如果两个对象的
hashCode
值相等,那这两个对象不一定相等(哈希碰撞)。 - 如果两个对象的
hashCode
值相等并且equals()
方法也返回true
,我们才认为这两个对象相等。 - 如果两个对象的
hashCode
值不相等,我们就可以直接认为这两个对象不相等。】
10、String(String 、StringBuffer、StringBuilder)
String真正不可变的原因:
- 保存字符串的数组被
final
修饰且为私有的,并且String
类没有提供/暴露修改这个字符串的方法。 String
类被final
修饰导致其不能被继承,进而避免了子类破坏String
不可变。
五一小长假的最后一天,王哥学了四天下午,我躺了四个下午,惭愧愧疚@_@.