Java全栈经典面试题剖析3】JavaSE面向对象2
目录
面试题2.12 Overload和Override的区别
面试题2.13 Overload方法是否可以改变返回值的类型?
面试题2.14 为什么方法不能根据返回类型来区分重载?
面试题2.15 构造器可不可以被重载或重写?
面试题2.16 在 Java 中定义⼀个不做事且没有参数的构造方法的作用
面试题2.17 创建一个子类对象,请写出:父类静态代码块,父类构造方法,父类代码块,子类代码块,子类构造,子类静态代码块。这六个对象的执行顺序
面试题2.18 Java中访问修饰符有哪些? 作用域public,private,protected,以及不写时的区别
面试题2.19 final关键字的用法?
面试题2.20 抽象类和接口的区别?什么时间考虑用抽象类,什么时间考虑用接口?
面试题2.21 接口是什么?为什么要使用接口而不是直接使用具体类?
面试题2.22 什么是类?什么是对象?什么是接口?接口和类的继承有什么本质区别
面试题2.23 Java中有没有多继承?
面试题2.24 什么是内部类?分为哪几种?
面试题2.25 为什么需要内部类?
面试题2.26 局部内部类特性
面试题2.27 内部类与静态内部类的区别
面试题2.28 异常的理解? 什么是检查性异常和非检查性异常? Error和Exception的区别?
面试题2.29 说出十种常见的异常,请举例有哪些异常
面试题2.30 throw和throws的区别
面试题2.31 final,finally,finalize的区别
面试题2.12 Overload和Override的区别
【技术难度: 2 出现频率:2 】
小技巧:按方法声明(返回值类型 方法名 (参数列表) throws 异常)来说两者的区别
方法重载 (Overload),发生在同一个类中:
1. 方法名相同;
2. 参数列表不同 (参数类型,参数顺序,参数个数);
3. 与权限修饰符,返回值类型无关。
方法重写 (Override),发生在子类中:
1.方法名与父类方法名相同;
2.参数列表与父类方法相同(参数类型,参数顺序,参数个数);
3.返回值类型与父类方法相同或是其子类;
4.访问权限不能严于父类方法;
5.抛出的异常与父类相同或是其子类。(抛出的异常不能多于父类)
面试题2.13 Overload方法是否可以改变返回值的类型?
【技术难度: 2 出现频率:2 】
Overload重载方法可以改变返回值类型。不根据返回类型来区分重载。
面试题2.14 为什么方法不能根据返回类型来区分重载?
【技术难度:2 出现频率:2 】
方法重载只和方法名、参数列表有关,与返回值无关。
在Java中,方法的名称和参数列表共同构成了方法的签名,不包括返回值,而编译器用这个签名来确定要调用哪个方法。所以……
面试题2.15 构造器可不可以被重载或重写?
【技术难度:2 出现频率:2 】
构造方法可以重载;但不可以被子类重写,因为Java规定子类不可继承父类构造方法,只能通过super关键字来调用父类构造器。(不可继承父类构造方法?)
面试题2.16 在 Java 中定义⼀个不做事且没有参数的构造方法的作用
【技术难度: 2 出现频率:1 】
如果不在子类构造器中显示调用父类的构造方法,编译器就会自动调用父类的无参构造方法。所以定义类时最好还是带上一个无参构造方法。
第一层:
如果子类调用到了父类无参构造方法时,父类得有无参构造方法,否则报错。后面要学习的框架就会经常用到无参构造方法。
第二层:
比如这种情况,若父类中只定义了有参构造方法,而在⼦类的构造方法中又没有用super来指定调用父类中特定的有参构造⽅法,就会默认调⽤⽗类的无参构造方法。如果父类没有无参构造方法,此时编译时将发⽣错误,因为 Java 程序在⽗类中找不到无参构造方法。
面试题2.17 创建一个子类对象,请写出:父类静态代码块,父类构造方法,父类代码块,子类代码块,子类构造,子类静态代码块。这六个对象的执行顺序
【技术难度: 2 出现频率: 1 】
1.父类静态代码块;
2.子类静态代码块;
3.父类实例代码块;
4.父类构造方法;
5.子类实例代码块;
6.子类构造方法。
静态代码块随着类的加载而被调用,且整个工程只调用一次。
实例代码块在构造方法之前被调用。
面试题2.18 Java中访问修饰符有哪些? 作用域public,private,protected,以及不写时的区别
【技术难度: 1 出现频率: 1 】
1. public公开的,修饰成员变量、方法和类,可以被任何位置访问;
2. protected受保护的,修饰成员变量和方法,可以被本类、同包中的类、非同包的子类访问;
3. 不写就是default默认的(或称friendly友好的),修饰成员变量、方法和类,只能被本类、同包中的类访问,不能被子类访问;
4. private私有的,修饰成员变量和方法,只可在本类中被访问。
面试题2.19 final关键字的用法?
【技术难度:1 出现频率:1 】
1 final可以修饰类,代表最终类,不可被继承;
2 final可以修饰方法,代表最终方法,不可被重写覆盖;(可以被重载吗? --可以,final只是限制其不能被重写)
3 final可以修饰属性,代表常量,一旦赋值不可更改(给null也是赋值)。
扩展(无需背诵):
注意final修饰的引用类型变量,其引用值不可变,而引用值指向的对象的属性不受此限制。
final修饰的方法可以重载。
面试题2.20 抽象类和接口的区别?什么时间考虑用抽象类,什么时间考虑用接口?
【技术难度:2 出现频率:2 】
1.抽象类继承自Object,接口不是;
2.抽象类有构造方法,接口没有;
3.抽象类可以声明成员变量、静态变量、常量;接口只能声明静态常量;
4.抽象类可以声明成员方法、抽象方法、final方法、静态方法;接口可以声明抽象、静态方法、default方法;
5.抽象类是单继承、多实现;接口只能继承多个其他接口。
6.一个类只能继承一个类,但能实现多个接口。
面试题2.21 接口是什么?为什么要使用接口而不是直接使用具体类?
【技术难度: 2 出现频率:2 】
表示编写方法的一种规范,只声明了一组方法但没有实现具体逻辑,要求实现类来实现这些方法的执行逻辑。
接口(Interface)是一种定义了一组方法的抽象类型,但并不提供这些方法的具体实现。接口可以用来控制其实现类必须要实现它的抽象方法,并且一个类可以实现多个接口,相对于类之间的单继承更有可扩展性,并且使用接口开发能够降低程序的耦合性,从而提高程序的可维护性。同时接口还通过不同实现类实现同一个接口来实现多态性。
面试题2.22 什么是类?什么是对象?什么是接口?接口和类的继承有什么本质区别
【技术难度: 2 出现频率:2 】
一:
1.对象是用来描述客观事物的一个实体,由一组属性和方法构成;
2.类是一组具有相同属性和方法的对象的集合,定义了对象将会拥有的特征和行为;
3.接口包含一系列方法的声明,一个接口只有方法的特征没有方法的实现。
总结:类是对象的类型,对象是类的实例,接口声明了对象将会实现的行为。
(类是一系列拥有相同属性和方法的对象的集合,对象是类的实例,接口是对类的行为规范,是类编写方法的规范。)
二:
一个类只能继承一个父类,可以实现多个接口。
面试题2.23 Java中有没有多继承?
【技术难度: 2 出现频率: 2 】
java中没有多继承,不过可以多实现,一个类实现多个接口。通过接口可以近似的实现多继承,而且接口可以继承多个其他接口。
为什么舍弃多继承?
防止菱形继承问题导致的二义性和代码冗余。
面试题2.24 什么是内部类?分为哪几种?
【技术难度:2 出现频率:1 】
一:
内部类是指在一个外部类的内部再定义一个类,它作为外部类的一个成员,并且依附于外部类而存在。内部类可为静态、可用各种访问权限修饰符,而外部类只能用public和缺省的包访问权限。
二:
内部类主要有成员内部类、局部内部类(在方法里面)、静态内部类、匿名内部类(没有类名)。
面试题2.25 为什么需要内部类?
【技术难度:2 出现频率:1 】
使用内部类最吸引人的原因是模拟实现多继承。
Java是不支持多继承的,但我们可以通过内部类来模拟实现多继承:在一个外部类内部创建多个内部类,每个内部类都实现不同的方法。这样,你可以通过外部类的实例来访问这些内部类,并间接地实现类似多重继承的效果。但需要注意的是,这实际上是利用了内部类的封装性和接口的多实现性,而不是直接的多重继承。
面试题2.26 局部内部类特性
【技术难度: 2 出现频率:1 】
局部内部类可以直接访问所在方法的final常量,jdk1.7之前 final必须加,jdk1.8开始,给变量赋值后,final可以省略。
面试题2.27 内部类与静态内部类的区别
【技术难度: 2 出现频率:1 】
内部类:
1.非静态内部类中的变量和方法不能声明成静态的;
2.内部类实例化时,若B是A的内部类,需要先创建A的对象,再通过A对象的引用创建B对象(A.B b = new A().new B(););
3.内部类可以直接调用外部类的一切资源,包括私有的。
静态内部类:
1.静态内部类的属性和方法,都可以声明为静态或非静态的;
2.实例化静态内部类时,若B是A的内部类,可直接通过A.B创建B对象(A.B b = new A.B(););
3.静态内部类只能直接调用外部类的静态属性及静态方法。
扩展(无需背诵):
- 静态内部类其实叫静态嵌套类(static nested classes)。
- 静态嵌套类就是原本可以完全独立存在的类,不过还是借外部类的壳用一下,来隐藏它自己。
- 内部类是外部类的一部分,它知道外部类的全部,没有外部类就没有内部类,内部类对象以外部类对象存在为前提。
面试题2.28 异常的理解? 什么是检查性异常和非检查性异常? Error和Exception的区别?
【技术难度:2 出现频率: 1 】
第一层:
Java异常的基类是Throwable,其下有两个子类,分为Exception异常和Error错误。Error一般指JVM出现的错误,也叫做严重异常,程序无法做处理。Exception是程序本身可以处理的异常,分为检查异常和运行时异常。
第二层:
检查异常都直接继承自Exception类。运行时异常都继承自RuntimeException类(Exception的子类)。
第三层:
检查异常Java程序必须显示处理,try/catch捕捉或throws声明抛出。非检查异常Java程序可选择处理或不处理。(检查性异常编译器会提示,区分编写错误和检查性异常)(必须处理的含义就是:只要有可能出现,就一定要处理。)
扩展(无需背诵):
Runtime - 运行时
checked - 检查
unchecked - 非检查
面试题2.29 说出十种常见的异常,请举例有哪些异常
【技术难度: 2 出现频率: 1 】
5个运行时异常:
NullPointerException 空指针异常
NumberFormatException 数字格式化异常
IndexOutOfBoundsException 下标越界
ArrayIndexOutOfBoundsException 数组下标越界
StringIndexOutOfBoundsException 字符串下标越界
ClassCastException 类型转换异常
5个检查异常:
FileNotFoundException 文件未找到异常
ClassNotFoundException 类未找到异常
IOException IO流异常
SQLException SQL异常
EOFException 文件末尾异常
面试题2.30 throw和throws的区别
【技术难度: 2 出现频率:1 】
1.throws用在方法声明的位置,throw用在方法体内;
2.throws是可能抛出异常,throw是一定抛出异常;
3.throws后面跟异常类名,throw后面跟异常对象。
面试题2.31 final,finally,finalize的区别
【技术难度: 2 出现频率: 1 】
1.final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可继承;
2.finally是异常处理语句结构的一部分,表示总是执行;
3.finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等,JVM不保证此方法总被调用。
------------------------END-------------------------
才疏学浅,谬误难免,欢迎各位批评指正。