J A V A 二

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 还要同时提供这两个方法呢?

这是因为在一些容器(比如 HashMapHashSet)中,有了 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 不可变。

五一小长假的最后一天,王哥学了四天下午,我躺了四个下午,惭愧愧疚@_@.

  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值