一、什么是面向对象?什么是面向过程?
面向过程:分析问题所需要的步骤,将实现的程序步骤化,使用的时候依次调用,看中的是中间的过程,每一个步骤都需要自己去完成(手洗衣服)
优点:性能比面向对象高,因为面向对象调用时需要进行实例化,开销比较大。 Eg:Linux操作系统、嵌入式开发、单片机
缺点:没有面向对象容易维护、易复用、易拓展
面向对象:将构成问题的事物分解成各个对象,将实现的程序模块化,不看中中间的过程和步骤,看中的是谁能帮我完成这件事情,找人帮我去做(机洗衣服)
优点:易维护、易复用、易扩展(OOP特征:封装、继承、多态),可以设计出低耦合的系统
缺点:开销比较大,性能比面向过程低
二、类和对象
类和对象是面向对象方法的核心概念。
类是对一类事物的描述,是抽象的、概念上的定义,不能直接使用,类不占空间
对象是实际存在的该类事物的每个个体,是类的实例,是真正存在的,对象占空间
三、成员变量和局部变量的区别
①.定义的位置不同
成员变量定义在类的内部,方法的外部
局部变量定义在方法的内部
②.作用域不同
成员变量作用在类的内部
局部变量作用在方法的内部
③.默认值不同
成员变量有默认值
局部变量没有默认值
④.内存中的位置不同
成员变量保存在堆里面
局部变量保存在栈里面
⑤.访问修饰符不同
成员变量的访问修饰符有四个
局部变量没有访问修饰符修饰,默认跟方法的类型一样
四、什么是封装?能解决什么问题?怎么实现封装?
把属性通过方法封装起来,因为我们直接操作属性的时候可能会出现一些不符合实际情况的问题,封装起来以后,可以在方法里面加入逻辑对属性进行限制
实现封装:
1.将属性私有化,private
2.提供get和set方法获取属性值,为属性赋值
五、什么是构造方法
在Java中有时候会使用一个特殊的方法叫构造方法,也叫构造器,构造方法最大的作用就是创建对象,new的时候就是调用了构造方法
作用:无参构造方法就是创建对象,有参构造方法就是在创建对象的同时给属性赋值
注意:
1.构造方法不能有返回值
2.构造方法名必须和类的名字一致,大小写也得一致
3.构造方法也是一个方法,可以进行方法重载
4.如果在定义一个类的时候,没有去定义构造方法,系统默认会提供一个无参的构造方法
5.如果定义了构造方法,系统不会再提供无参构造方法
6.如果定义了有参构造方法,一定要加上无参构造方法
7.一个类可以创建多个重载的构造方法
六、方法重载(overload)和方法重写(override)的区别
1.方法重载要求方法名相同、形参列表必须不同(参数个数、类型、类型的顺序),和返回值无关
2.方法重写要求方法名、形参列表、返回值类型必须和父类一致访问修饰符不能小于父类的
3.方法重载必须在同一个类里面进行重载
4.方法重写必须存在继承关系,发生在子类和父类之间
七、super关键字和this关键字的区别
1.super关键字可以修饰属性、方法、构造方法,用在有继承关系的类中
- 当子类和父类的属性名同名时,默认会使用子类的属性,可以通过super.属性名调用父类的属性
- 子类重写父类方法后,如果子类想再次调用父类重写前的方法,可以用super.方法名,调用父类重写前的方法
- super修饰构造方法,通过在子类构造方法中使用super(形参)来显示的调用父类的构造方法
(1) super()必须放在构造方法的首行
(2) 在构造方法内部this(形参)或super(形参)只能出现一个
(3) 在构造方法中,如果显示的不使用super(形参)的方法调用父类对应的构造方法,默认会调用父类的构造方法,只是隐藏了
2.this关键字:当局部变量和成员变量重名是,方法会根据就近原则使用局部变量的值,如果想要区分局部变量和成员变量,可以使用this关键字,用在同一个类中,方法重载中
- 格式:this.成员变量
- this可以修饰成员变量,成员方法,构造方法,修饰成员变量和成员方法的格式就是this.成员变量或成员方法
- this可以理解为当前使用的对象,或者正在创建的对象,谁调用了方法,谁就是当前使用的对象
- 可以在构造方法中通过"this(形参)"的方法来调用本类中其他重载的构造方法
八、接口和抽象类的相同点和不同点
相同点:
- 接口和抽象类都不能被实例化,只能被其他类实现和继承
- 接口和抽象类都可以包含抽象方法,实现接口和抽象类的类都必须实现这些抽象方法,否则实现的类就是抽象类
- 都可以定义静态方法
不同点:
- 抽象类与接口的定义不同:抽象类 abstract ,接口 interface
- 接口里只能包含抽象方法,不包含已经实现的方法;抽象类则完全可以包含普通方法
- 接口里只能定义静态常量属性,不能定义普通属性;抽象类里既可以定义普通属性,也可以定义静态常量
- 接口不包含构造函数;抽象类可以包含构造方法,抽象类里的构造函数并不是用于创建对象,而是让其子类调用这些构造函数来完成属于抽象类的初始化操作
- 接口不包含初始化块,但抽象类可以包含初始化块
- 一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补java的单继承不足
九、==和equals的区别
==:比较运算符
- 可以使用在基本数据类型和引用数据类型
- 如果比较基本数据类型,比较的是两个变量的值是否相等
- 如果比较引用数据类型,比较的是两个对象在堆里面的地址值是否相等,两个对象是否指向同一个对象实例
equals()
- equals是一个方法
- 它只能对引用数据类型进行比较
- equals重写前和==没区别,重写后有区别
- object类里面是这么定义的
public boolean equals(Object obj){
return (this == obj);
}
- 发现它还是通过 == 进行两个对象的比较,object定义的equals方法和 == 的作用一样,实际比较的是两个对象的地址值是否相等
- 像String、Date、File、包装类等等都重写了equals方法,重写以后,比较的不再是地址值了,而是比较两个对象的“实体内容”是否相等
- 通常情况下,我们自己定义的类是没有重写equals方法的,如果要比较两个实体内容是否相等,需要重写equals方法
- 一般情况下都会进行重写,比较两个对象的实体内容是否相等
十、 StringBuffer、String 、StringBuilder三者区别
- String:不可变序字符列,如果要修改字符串的值,不是在原有字符串值的基础上修改,而是重新分配一块内存区域
- StringBuffer:可变字符序列,在原有字符串的基础上进行修改,线程安全,效率低
- StringBuilder:可变字符序列,在原有字符串的基础上进行修改,线程不安全,效率高
- StringBuffer、String 、StringBuilder三者效率:StringBuilder > StringBuffer > String
十一、装箱和拆箱(可手动或自动)
- 装箱:基本数据类型转成对应的包装类(常用类)
- 拆箱:包装类转成对应的基本数据类型