什么是面向对象?谈谈你对面向对象的理解
对比面向过程,是两种不同的处理问题的角度
面向过程更加注重事情的步骤及顺序,面向对象更加注重事情的有哪些参与者,各自需要做什么事
面向对象有三大特性:
封装:封装的意义在于明确标识出允许外部进行访问的方法和属性。内部实现对外部透明,外部无需关心内部实现。
继承:继承基类的方法,并做出自己的改变或扩展。子类共性的方法或者属性直接使用父类的,而不需要自己在定义,只需要扩展自己的个性化。
多态:基于对象所属类的不同,外部对同一个方法的调用,实际执行的逻辑不同。
JDK、JRE、JVM三者的区别与联系。
JDK:java开发工具
JRE:java运行时环境
JVM:java虚拟机
JDK包含了JRE,JRE包含了JVM。
也就是说如果想要进行java开发,必须安装jdk。如果只需要运行java代码,那么可以只安装jre。
而jvm适应多个操作系统,使java程序能够一处编译,多处运行。
==与equals的区别
==:
==比较的是栈中的值,也就是说对于基本数据类型跟引用数据类型==比较的是不一样的
基本数据类型:比较的是值
引用数据类型:比较的是引用
equals:
euqals在Object类中默认是采用==进行比较,但是由于多个类将equals方法进行了重写使其比较的是值。例如:String
注意:str1这样声明的字符串会在堆的常量池中进行内存分配的
final的作用
意思:最终的
- 修饰类:表示类不可以被继承
- 修饰方法:表示方法不可以被重写,但是可以重载
- 修饰变量:表示变量一旦赋值就不可以更改它的值
String、StringBuilder、StringBuffer的区别及使用场景
- String:是final修饰的,不可变的,每次操作都会生成新的String对象
- StringBuffer、StringBuilder:都是可以在原对象上进行操作的
- StringBuffer:是Synchronized修饰的,是线程安全的
- StringBuilder:不是线程安全的
场景:
在经常需要改变字符串内容时使用StringBuffer与StringBuilder
优先使用StringBuilder,多线程使用共享变量时使用StringBuffer
重载和重写的区别
- 重载:在同一个类中,方法名相同,参数列表不同(类型,个数,顺序),方法返回值和访问修饰符可以不同。
- 重写:在父子类中,子类重写父类方法。方法名与参数列表均相同。访问修饰符类型大于等于父类,返回值范围小于等于父类,抛出异常范围小于等于父类。如果父类访问修饰符类型为private则子类不能重写该方法。
接口和抽象类的区别
- 方法:抽象类可以存在普通成员函数,接口中的函数都是抽象的
- 变量:抽象类中的成员变量可以是各种类型的,接口中的成员变量只能是常量
- 继承:抽象类只能继承一个,接口可以实现多个
List和Set的区别
- List是有序可重复的,可以存在多个NULL对象。可以通过迭代器(Iterator)取出所有元素,再进行逐一遍历,还可以使用get(int index)方法获取指定下标的元素
- Set集合是无序不可重复的,只允许有一个NULL对象。获取元素时只能使用迭代器(Iterator)接口获取所有元素在进行遍历。
hashcode相同则equals也一定为true吗?
不对。
- hashcode相同说的是hash表中的两个键值对的哈希值相等。然后哈希值相等不一定键值对相等
- equals的比较方法往往是由程序员来决定。