(一)面向对象和面向过程的区别
一、编程思想不同。
1、面向过程:是一种以过程为中心的编程思想。都是以什么正在发生为主要目标进行编程。
2、面向对象语言:是一类以对象作为基本程序结构单位的程序设计语言,指用于描述的设计是以对象为核心,而对象是程序运行时刻的基本成分。
二、特点不同。
1、面向过程:就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
2、面向对象语言:识认性,系统中的基本构件可识认为一组可识别的离散对象,对象具有唯一的静态类型和多个可能的动态类型,在基本层次关系的不同类中共享数据和操作。
三、优势不同。
1、面向过程:不支持丰富的“面向对象”特性(比如继承、多态),并且不允许混合持久化状态和域逻辑。
2、面向对象语言:在内部被表示为一个指向一组属性的指针。任何对这个对象的操作都会经过这个指针操作对象的属性和方法。
(二)Java的四个基本特征(抽象、封装、继承,多态)
1. 抽象:抽象是将类的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面,抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
2. 继承:继承是从已有类抽取继承信息并构建新的类的过程,提供继承信息的被称为父类(超类/基类),获取继承信息的被称为子类(派生类)。继承它让变化中的软件系统有了一定的延续性,同时继承也是封装过程中可变因素的重要手段。
3. 封装:通常认为封装就是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写类就是对数据和数据操作的封装。简单来说就是封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。
4. 多态性:不同子类型的对象对同一消息做出的不同的响应。
(三)重载和重写的区别
1.重写必须继承,重载不用。
2.重写的方法名,参数数目相同,参数类型兼容,重载的方法名相同,参数列表不同
3.重写的方法修饰符大于等于父类的方法,重载和修饰符无关。
4.重写不可以抛出父类没有抛出的一般异常,可以抛出运行时异常。
(四)构造器Constructor是否可以被override?
构造器(override)不能被继承,因此不能重写overriding,但是可以被重载overloading。constructor,说简单点就是“构造方法”。构造方法的作用就是“为对象的初始化赋值”。在java或c#中如果不声明构造方法的话,则系统会自动提供一个不带任何参数的构造方法。举例来说:student stu1= new student();其中的student()就叫做构造方法,是不带参数的构造方法。在比如:student stu2 = new student("张三",18);这个student("张三",18)就是构造方法,是带参数的构造方法。构造方法怎么声明:举个例子:无参数:public student(){ }有参数public student(string name,int age){ this.name=name; this.age=age;}至于构造方法为什么不能override?override是方法“重写”,而构造方法不能重写,只能“重载”。
(五)访问控制符public private protected以及默认的区别
1.public:public修饰的数据成员和成员函数是公开的,所有的用户都可以进行调用。
2.private:private修饰词修饰的成员变量以及成员方法只供本类使用,也就是私有的,其他用户是不可调用的。
3.protected:protected修饰词修饰的成员变量以及成员方法在同一个包中无论是其子类还是普通类都可以调其使用,在不同包中只供其子类调用。
(六)是否可以继承String类,解释原因
不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。
(七)stringbuffer和stringbuilder的区别
1.速度问题,或者说是执行速度,在这方面运行速度快慢为:
StringBuilder > StringBuffer > String
2.安全问题:
1.String中的对象是不可变的,也就可以理解为常量,显然线程安全。
2.StringBuffer是线程安全的。
3.StringBuilder是线程不安全的。
AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的,但是相对应的也会影响其执行速度。
3.应用场景:
1.String:适用于少量的字符串操作的情况
2.StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
3.StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
如果程序不是多线程的,使用StringBuilder效率要高于StringBuffer。
(八)hashCode和equals方法的关系
1、如果eqauls()相同,那么它们的hashCode()一定要相同;
2、如果hashCode()相同,那么它们eqauls()并不一定相同.
所以,Java对于eqauls方法和hashCode方法是这样规定的:
1、如果两个对象相同,那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同。
(九)抽象类和接口的区别
1) 都是上层的抽象层。
2) 都不能被实例化
3) 都能包含抽象的方法,这些抽象的方法用于描述类具备的功能,但是不比提供具体的实现。
他们的区别如下:
1) 在抽象类中可以写非抽象的方法,从而避免在子类中重复书写他们,这样可以提高代码的复用性,这是抽象类的优势;接口中只能有抽象的方法。
2) 一个类只能继承一个直接父类,这个父类可以是具体的类也可是抽象类;但是一个类可以实现多个接口。
(十)自动装箱与拆箱
1、自动装箱:
基本类型的数据处于需要对象的环境中时,会自动转为“对象”。 自动装箱过程是通过调用包装类的valueOf()方法实现的。
Integer i = 100;//自动装箱
//相当于编译器自动作以下的语法编译:
Integer i = Integer.valueOf(100);//调用的是valueOf(100),不是new Integer(100)
2、自动拆箱:
每当需要一个值时,对象会自动转成基本数据类型,没必要再去显式调用intValue()、doubleValue()等转型方法。如 Integer i = 5;int j = i; 这样的过程就是自动拆箱。
Integer i = 100;
int j = i;//自动拆箱
//相当于编译器自动作以下的语法编译:
int j = i.intValue();