Java面向对象基础
面试题总结(2)
1、Overload和Override(OverWrite)有什么区别?Overload 的方法是否可以改变返回值的类型?
1)重载Overload是方法的重载,表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同,这些不同包括位置不同,个数不同,类型不同。
2)重写 Override 是方法的重写,表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。
3)Override子类覆盖父类的方法时,只能比父类抛出更少的异常和更小的异常,或者抛出父类抛出的异常的子异常。子类方法的访问权限只能和父类相同或者比父类的更大,不能更小。如果父类的方法是 private 类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。 覆盖的方法的返回值必须和被覆盖的方法的返回一致;
4)Overload 与返回值类型和修饰符以及异常无关只要方法名相同形式参数不同即为重载。
2、成员变量(全局变量)和局部变量的区别?
1)定义的位置
局部变量定义在函数中,语句内。
成员变量定义在类中。
2)内存中的位置。
局部变量存储在栈内存中。
成员变量存储在堆内存中。
3)初始化值
局部变量没有默认初始化值,必须赋值才可以使用。
成员变量有默认初始化值。
4)生命周期
局部变量一旦作用区域结束,就立刻释放。
成员变量也称为实例(对象)变量,随着对象的出现而出现。随着对象的被回收而释放。
3、静态变量 和实例变量的区别?
在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
1)生命周期
成员变量又叫实例变量,是随着对象的出现而出现,随着对象的消失而消失。
静态变量又叫类变量,是随着类的加载而出现,随着类的消失而消失。
2)内存中的存储位置
成员变量存在在堆内存的对象中。
静态变量存储在方法区的静态区中。
3)存储的数据特点
成员变量存储的数据是对象的特有数据。
静态变量存储的数据是对象的共享数据。
4)调用方式
成员变量,只能被对象所调用。
静态变量,能被对象调用,也可以被类名调用
4、请说出作用域 public, private, protected,以及不写时的区别
说明:如果在修饰的元素上面没有写任何访问修饰符,则表示 friendly。
5、构造器 Constructor 能否被继承?是否可被 override?能否被overload?
构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。
6、final, finally, finalize的区别
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
final 修饰属性,有三种初始化的方法:
1)直接等于某一个值
2)在构造函数中指定
3)在代码块中指定
一个类不能即被final和abstract修饰;因为abstract抽象类必须依赖于子类,而final不能被继承;
final修饰的变量是一个常量,只能赋值一次。
final不能修饰构造函数 ,因为构造函数不能被继承,没必要加final
内部类要访问局部变量,局部变量必须定义成final类型。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。(垃圾回收之前,用来激活对象,如果对象不能被激活,则被回收)JVM不保证此方法总被调用。
7、”==”和equals方法究竟有什么区别?
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。
8、是否可以从一个static方法内部发出对非static方法的调用?
不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部不能对非static方法的调用。
9、接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?抽象类中是否可以有静态的 main 方法?
接口可以继承接口。抽象类可以实现(implements)接口,抽象类可以继承具体类。抽象类中可以有静态的main方法。
10、abstract class(抽象类)和interface(接口)有什么区别?
抽象类:
(1)含有abstract修饰符的类即为抽象类,abstract类不能创建的实例对象换句话说就是不能被new。
(2)包含有abstract方法的类必须定义为抽象类,抽象类中的可以有普通方法。
(3)抽象类的子类必须全部覆盖该抽象类的所有的抽象方法,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
(4)Abstract能修饰类,修饰方法,不能修饰属性
接口:
(1)接口(interface)可以说成是抽象类的一种特例,接口为更为纯粹的抽象类,不能有任何方法的实现,只能有方法的声明。
(2)接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
(3)实现类必须实现所有接口中的全部方法声明;
(4)接口中没有构造函数,即接口没有对象;
(5)接口是多实现,即一个类可以实现多个接口,中间用逗号隔开;
两者比较语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中可以包含静态方法,接口中不能包含静态方法
5. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
6. 一个类可以实现多个接口,但只能继承一个抽象类。
两者在应用上的区别:
接口更多的是在系统架构设计方法发挥作用,接口是用来定义规范的。主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,实现了一种价值叫模版策略。
共性: 都不能有自己的实例化都系
11、java中实现多态的机制是什么?
多态可分为:
1.编译多态:主要是体现在重载,系统在编译时就能确定调用重载函数的哪个版本。
2.运行多态:主要体现在OO设计的继承性上,子类的对象也是父类的对象,即上溯造型,所以子类对象可以作为父类对象使用,父类的对象变量可以指向子类对象。因此通过一个父类发出的方法调用可能执行的是方法在父类中的实现,也可能是某个子类中的实现,它是由运行时刻具体的对象类型决定的。靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
12、什么是内部类?Static Nested Class和Inner Class的不同是什么?
(1)内部类就是在一个类的内部定义的类,内部类分为静态内部类,非静态内部类,局部内部类和匿名内部类。
(2)非静态内部类可以无条件访问外部类的成员,不可以和自己的外部类重名但是可以与外部类平级同包的类重名,非静态内部类不能有static修饰的变量,
(3)静态内部类不能访问外部类的非静态属性,外部类也不能访问静态内部类的成员,但是可以使用静态内部类的类名作为调用者使用。
(4)内部类可以通过new外部类().new 内部类()进行实例化 Inner in=new Outer().new Inner();
内部类可以被其他类继承继续它的类需要写一个构造方法并且手工调用 外部类.super();
public class SubClass extends Out.In{
public SubClass(Out out){
out.super();
}
}
13、 Integer 与 int 的区别
(1)int 是 java 提供的8种原始数据类型之一。Java 为每个原始类型提供了封装类,Integer 是 java为 int 提供的封装类。 int 的默认值为0,而 Integer 的默认值为 null,即 Integer 可以区分出未赋值和值为0的区别, int 则无法表达出未赋值的情况。
(2)在 JSP 开发中, Integer 的默认为 null,所以用el 表达式在文本框中显示时,值为空白字符串,而 int 默认的默认值为0,所以用 el 表达式在文本框中显示时,结果为0,所以, int 不适合作为 web 层的表单数据的类型。
(3)在 Hibernate 中,如果将 OID 定义为 Integer 类型,那么 Hibernate 就可以根据其值是否为null 而判断一个对象是否是临时的,如果将 OID 定义为了 int 类型,还需要在 hbm 映射文件中设置其 unsaved-value 属性为0。
(4)另外,Integer 提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数, Integer中还定义了表示整数的最大值和最小值的常量。
14、写clone()方法时,通常都有一行代码,是什么?
必须实现Cloneable接口 重写clone方法
protected Object clone() throws CloneNotSupportedException {
returnsuper.clone();
}
15、是否可以继承String类?
String类是final修饰的。因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类
16、String s = new String(“xyz”);创建了几个String Object?二者之间有什么区别?
两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。New String每写一遍,就创建一个新的对象,它依据那个常量”xyz”对象的内容来创建出一个新String对象。如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。