题目
选自牛客网
1.区分类中重载方法的依据是( )。
A.不同的形参名称
B.不同的返回值类型
C.不同的形参列表
D.不同的访问权限
正确答案:C
在Java中,方法重写(Overriding)和方法重载(Overloading)是两种不同的概念,它们有各自的规则和要求。
方法重写(Overriding):
- 三同原则:
- 同名: 方法名必须与被重写的父类方法名完全相同。
- 同参: 参数列表必须与被重写的父类方法的参数列表完全相同,包括参数的类型和顺序。
- 同类型: 返回类型必须与被重写的父类方法的返回类型相同,或者至少是其子类型(Java 5 引入协变返回类型后,允许返回类型更具体的子类型)。
- 访问权限: 子类中重写的方法不能具有比父类中被重写方法更低的访问权限。例如,如果父类方法是public的,那么子类中重写该方法也必须是public的。
- 异常声明: 子类中重写的方法可以抛出任何与被重写方法相同的或更少的异常,但不能抛出更多的异常(Java 7 引入增强型异常检查后,子类方法可以抛出被重写方法的受检查异常的子类型)。
- 构造方法: 构造方法不能被重写,它们是特殊的方法,用于创建对象。
- final和static: 如果方法是final或static的,它就不能被重写。
- 同一个类: 方法可以在同一个类中被重载。
- 子类: 方法可以在子类中被重写。
- 访问权限: 子类中重写的方法可以拥有比父类中被重写方法更宽松的访问权限。
- 异常声明: 子类中重写的方法可以抛出被重写方法的任何异常,包括受检查异常和未受检查异常。
- 构造方法: 构造方法不能被重载。
- final and static: 如果方法是final或static的,它就不能被重载。
- 同一个类: 方法可以在同一个类中被重载。
- 子类: 方法可以在子类中被重写。
方法重载(Overloading):
- 同名原则: 方法名必须与被重载方法的其他方法名相同。
- 不同参数列表: 参数列表必须与被重载方法的其他方法的参数列表不同,可以是参数的数量不同或参数的类型不同。
- 返回类型: 返回类型可以不同。
- 访问权限: 访问权限可以不同。
- 异常声明: 异常声明可以不同。
- 构造方法: 构造方法可以被重载,以创建不同类型的对象实例。
- final and static: 如果方法是final或static的,它就不能被重载。
2.JavaWEB中有一个类,当会话种绑定了属性或者删除了属性时,他会得到通知,这个类是:( )
A.HttpSessionAttributeListener
B.HttpSessionBindingListener
C.HttpSessionObjectListener
D.HttpSessionListener;
E.HttpSession
F.HttpSessionActivationListener
正确答案:A 在Java Web中,当会话中绑定了属性或者删除了属性时,
HttpSessionAttributeListener
接口的
attributeAdded
和attributeRemoved
方法会被调用。这个接口允许开发者在会话属性添加或移除时获得通知,并执行相应的逻辑。因此,正确答案是 A.
HttpSessionAttributeListener。
3.下面的对象创建方法中哪些会调用构造方法 ()?
A.new语句创建对象
B.调用Java.io.ObjectInputStream的readObject方法
C.java反射机制使用java.lang.Class或java.lang.reflect.Constructor的newInstance()方法
D.调用对象的clone()方法
正确答案:AC
A. 使用
new
关键字创建对象时,会调用对应类的构造方法。这是最直接的方式来创建对象实例。C. 使用 Java 反射机制中的
java.lang.Class
或java.lang.reflect.Constructor
的newInstance()
方法时,会调用指定的构造方法来创建对象。反射机制允许在运行时动态地创建对象,而无需知道类的具体信息。
在Java中,构造函数的主要作用确实是完成对象的初始化。当我们使用new
操作符创建对象时,JVM(Java虚拟机)会按照以下步骤进行操作:
- 确定对象的类型,并根据类型信息计算出需要分配的内存空间大小。
- 在内存中分配足够的空间来存储新对象的实例数据。
- 调用构造函数对分配的内存空间进行初始化,即设置对象的初始状态。这包括为对象的实例变量赋予初始值,以及执行构造函数体内的任何其他初始化代码。
对于选项B和D,它们描述的情况涉及的是对象的复制或克隆,而非通过构造函数创建新对象:
B.使用
java.io.ObjectInputStream
的readObject
方法从流中恢复对象时,JVM会根据对象的序列化版本信息重新构造对象。这个过程可能涉及到调用构造函数,但也可能仅仅是复制已序列化的对象状态到新的内存空间。D.调用对象的
clone()
方法创建对象的副本时,JVM会创建一个新的对象,并复制原对象的所有实例变量到新对象中。这个过程通常不涉及构造函数的调用,而是通过反射机制来实现。因此,根据上述解释,我们可以得出结论:只有在使用
new
操作符创建对象时,才会直接调用构造函数进行初始化。而在使用readObject
方法从流中恢复对象或使用clone()
方法创建对象副本时,初始化过程可能不通过构造函数完成。
4.关于访问权限,说法正确的是? ( )
A.类A和类B在同一包中,类B有个protected的方法testB,类A不是类B的子类(或子类的子类),类A可以访问类B的方法testB
B.类A和类B在同一包中,类B有个protected的方法testB,类A不是类B的子类(或子类的子类),类A不可以访问类B的方法testB
C.访问权限大小范围:public > 包权限 > protected > private
D.访问权限大小范围:public > 包权限 > private > protected
正确答案:A
这里是每个修饰符的访问范围总结:
private
: 只能在声明该成员的类内部访问。default
(即没有写任何修饰符): 也称为包私有,可以在同一包内的类中访问。protected
: 可以在声明该成员的类内部、同一包内的类、以及不同包中的子类中访问。public
: 可以在任何地方访问,没有限制。
修饰符 | 类内部 | 同一个包 | 子类 | 任何地方 |
---|---|---|---|---|
private | Yes | No | No | No |
default | Yes | Yes | No | No |
protected | Yes | Yes | Yes | No |
public | Yes | Yes | Yes | Yes |
5.下面有关java final的基本规则,描述错误的是?
A.final修饰的类不能被继承
B.final修饰的成员变量只允许赋值一次,且只能在类方法赋值
C.final修饰的局部变量即为常量,只能赋值一次。
D.final修饰的方法不允许被子类覆盖
正确答案:B
final
修饰的类不能被继承,确保了类的不可变性和封装性。final
修饰的方法不能被子类覆盖,保证了方法行为的一致性。final
修饰的变量(包括局部变量、成员变量和数组)只能被赋值一次,之后其值不能被改变,这些变量相当于常量。final
修饰的引用类型变量不能再指向别的对象,但如果引用本身指向的是可变对象,那么对象的内容是可以改变的。
总结
磕磕碰碰的过日子,加油少年