您的位置:首页 > 职场人生

java面试题 -javaSE基础-面向对象、SE语法

2019-07-26 10:02 399 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/fyytycoon/article/details/97370539

java面试题 -javaSE基础-面向对象、SE语法

一、Java面向对象

1.面向对象都有哪些特性以及你对这些特性的理解

1.继承,是从已有类得到继承信息创建新的类的过程,提供继承信息的类被称为父类,得到继承信息的类被称为子类,继承让变化中的软件有了一定的延续性,同时继承也是封装的可变的因素手段。

2.封装,通常认为封装是把数据和方法绑定起来,对数据的访问只能通过已定义的接口,面向对象的本质就是显示世界描述证一系列完全自治、封闭的对象,在类中编写的方法就是对现实细节的一种封装。

3.多态,是指允许不同子类型的对象对同一消息作出不同的响应,就是用同样的对象引用调用的同样的方法但是做了不同的事情,多态性分为编译时多态性和运行时多态性,如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解析为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式, 但一切A系统来说都是透明的。方法重载(overload)实现的是编译时多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(后绑定),运行时的多态是面向对象最精髓的东西,要实现多态需要做俩件事:1.方法重写(子类继承父类并重写父类中已有的或抽象的方法);2.对象造型(用父类引用子类型对象,这样同样的引用调用同样的方法,就会根据子类对象的不同而表现出不同的行为)

4.抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对
象有哪些属性和行为,并不关注这些行为的细节是什么。

注意:默认情况下面向对象有 3 大特性,封装、继承、多态,如果面试官问让说出 4 大特性,那么我们就把抽象加上去。

2.访问权限修饰符 public、private、protected, 以及不写(默认)时的区别

二、JavaSE语法

1.& 和 && 的区别

&运算符有两种用法:(1)按位与;(2)逻辑与。

&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是
true 整个表达式的值才是 true。

&&之所以称为短路运算是因为,如果&&左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行
运算。很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是 null 而且不是空字符串,应
当写为 username != null &&!username.equals(""),二者的顺序不能交换,更不能用&运算符,因为第一个条件如
果不成立,根本不能进行字符串的 equals 比较,否则会产生 NullPointerException 异常。注意:逻辑或运算符(|)
和短路或运算符(||)的差别也是如此。

2.两个对象值相同 (x.equals(y) == true) ,但却可有不同的 hashCode,这句话对不对?

不对,如果两个对象 x 和 y 满足 x.equals(y) == true,它们的哈希码(hashCode)应当相同。
Java 对于 eqauls 方法和 hashCode 方法是这样规定的:

(1)如果两个对象相同(equals 方法返回 true),那 么它们的 hashCode 值一定要相同
(2)如果两个对象的 hashCode 相同,它们并不一定相同
。当然,你未必要按照
要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在 Set 集合中,同时增加新元素
的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。
关于 equals 和 hashCode 方法,很多 Java 程序员都知道,但很多人也就是仅仅知道而已,在 Joshua Bloch
的大作《Effective Java》(很多软件公司,《Effective Java》、《Java 编程思想》以及《重构:改善既有代码质量》
是 Java 程序员必看书籍,如果你还没看过,那就赶紧去买一本吧)中是这样介绍 equals 方法的。
首先 equals 方法必须满足自反性(x.equals(x)必须返回 true)、对称性(x.equals(y)返回 true 时,y.equals(x)
也必须返回 true)、传递性(x.equals(y)和 y.equals(z)都返回 true 时,x.equals(z)也必须返回 true)和一致性(当
x 和 y 引用的对象信息没有被修改时,多次调用 x.equals(y)应该得到同样的返回值),而且对于任何非 null 值的引
用 x,x.equals(null)必须返回 false。实现高质量的 equals 方法的诀窍包括:1. 使用==操作符检查"参数是否为这个
对象的引用";2. 使用 instanceof 操作符检查"参数是否为正确的类型";3. 对于类中的关键属性,检查参数传入对象
的属性是否与之相匹配;4. 编写完 equals 方法后,问自己它是否满足对称性、传递性、一致性;5. 重写 equals 时
总是要重写 hashCode;6. 不要将 equals 方法参数中的 Object 对象替换为其他的类型,在重写时不要忘掉
@Override 注解。

3.是否可以继承 String

String 类是 final 类,不可以被继承。

4.final、finally、finalize 的区别?

1)final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承。

2)finally:异常处理语句结构的一部分,表示总是执行。

3)finalize:Object 类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,可以覆盖此方法
提供垃圾收集时的其他资源回收,例如关闭文件等。该方法更像是一个对象生命周期的临终方法,当该方法
被系统调用则代表该对象即将“死亡”,但是需要注意的是,我们主动行为上去调用该方法并不会导致该对
象“死亡”,这是一个被动的方法(其实就是回调方法),不需要我们调用。

5.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

是值传递。Java 语言的方法调用只支持参数的值传递。值传递与引用传递的本质区别为,对象参数是否被复制一份。
如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的。如果在函数中改变了副本的值不会改变原始的值.如果参数类型是引用类型,那么传过来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果在函数中没有改变这个副本的地址,而是改变了地址中的 值,那么在函数内的改变会影响到传入的参数。如果在函数中改变了副本的地址,如new一个,那么副本就指向了一个新的地址,此时传入的参数还是指向原来的 地址,所以不会改变参数的值。
详细说明

6.重载(overload)和重写(override)的区别?

重载,多态在编译期的表现形式。出现在一个类中,判定重载的条件只有方法名一致,方法形参列表不同。其他的(如返回值,访问修饰符)都不可以判定。

重写,多态在运行期的表现形式。出现在子父类,实现类与接口中。判定重载有一个规律:“两同两小一大”

两同:方法名和形参列表一致;

两小:抛出的异常和返回值小于被重写的方法。(一旦返回值是基本数据类型,那重写的方法返回值必须一致或者是Object)

一大:访问修饰符大于等于被重写方法。
注意:对于重写而言,只有可见的实例方法才可以被重写。静态方法和私有方法都是隐藏,不是重写!!!

《深入理解JVM虚拟机》,重载就是在编译期根据方法形参的静态类型确定方法版本,重写就是在运行期根据实际调用者的实际类型确定方法把版本。

7.为什么函数不能根据返回类型来区分重载?

函数的返回值只是作为函数运行之后的一个“状态”,他是保持方法的调用者与被调用者进行通信的关键。并不能
作为某个方法的“标识”。

8.抽象类(abstract class)和接口(interface)有什么异同?

抽象类可以有public、protected和默认类型的成员变量和成员方法 | 接口中不能有普通成员变量,方法全都被默认的修饰为: public abstract

抽象类接口 中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型。

抽象类中可以包含静态方法,接口 内不能包含静态方法。

抽象类里可以有构造方法,而接口内不能有构造方法。

实现抽象类的方法时, 如果方法是抽象的,子类必须重写抽象的方法。如果方法不是抽象的,子类可以选择继承,但接口中的方法必须全部被重写 ,并且全部是公有的public 方法.

一个类可以实现多个接口,但只能继承一个抽象类

9.抽象的(abstract)方法是否可同时是静态的(static), 是否可同时是本地方法(native),是否可同时被 synchronized

都不能。抽象方法需要子类重写,而

静态的方法是无法被重写的
,因此二者是矛盾的。本地方法是由
本地代码(如 C 代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized 和方法的实现细节有关,
抽象方法不涉及实现细节,因此也是相互矛盾的。

10.阐述静态变量和实例变量的区别?

静态变量: 是被 static 修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝

实例变量:必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。

11.==和 equals 的区别?

equals 和== 最大的区别是一个是方法一个是运算符。

==:如果比较的对象是

基本数据类型
,则比较的是数值是否相等;如果比较的是
引用数据类型
,则比较的是对象的地址值是否相等。

equals():用来比较方法两个对象的内容是否相等。

注意:equals 方法不能用于基本数据类型的变量,如果没有对 equals 方法进行

重写
,则比较的是引用类型的变量所指向的对象的地址。

12.break 和 continue 的区别?

breakcontinue 都是用来控制循环的语句。

break 用于完全结束一个循环,跳出循环体执行循环后面的语句。

continue 用于跳过本次循环,执行下次循环。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: