java面试题 -javaSE基础-面向对象、SE语法
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 的区别?
break 和 continue 都是用来控制循环的语句。
break 用于完全结束一个循环,跳出循环体执行循环后面的语句。
continue 用于跳过本次循环,执行下次循环。
- JavaSE入门学习7:Java基础语法之方法
- java基础和面向对象面试题_01
- 学习笔记之JavaSE(4)--Java基础语法3
- JAVA基础及语法部分面试题(2)
- JavaSE(java编程基础,面向对象)
- Java语言基础{Java_se(01)}-搭建Java开发环境-环境变量(环境配置)-Java的基本语法-Java的三大注释-关键字和保留字-Java中的语言分隔符
- JAVA 基础部分常见面试题(集合、线程、面向对象、IO 等)
- java面试题 -javaSE基础-异常处理
- JAVA基础及语法部分面试题(4)
- JavaSe总结-03--Java基础语法(2)
- 学习笔记_JavaSE_03_Java基础语法02
- JavaSE入门学习8:Java基础语法之数组
- 黑马程序员——java面试题之基础语法
- 2015携程JAVA工程师笔试题(基础却又没多少人做对的面向对象面试题)
- 【Java笔记】Week02 -- JavaSE基础语法、OOP基础知识
- JavaSE基础第二部分:Java基础语法之标识符
- JAVASE基础_02.基础语法--标识符、Java常量、Java变量、基本数据类型
- JAVA基础及语法部分面试题(5)-----异常部分
- 学习笔记_JavaSE_04_Java基础语法03
- Java面试题精选(一)基础概念和面向对象