每日一练,java

目录

题目

选自牛客网
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 接口的
attributeAddedattributeRemoved方法会被调用。这个接口允许开发者在会话属性添加或移除时获得通知,并执行相应的逻辑。因此,正确答案是 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.Classjava.lang.reflect.ConstructornewInstance() 方法时,会调用指定的构造方法来创建对象。反射机制允许在运行时动态地创建对象,而无需知道类的具体信息。
在Java中,构造函数的主要作用确实是完成对象的初始化。当我们使用new操作符创建对象时,JVM(Java虚拟机)会按照以下步骤进行操作:

  1. 确定对象的类型,并根据类型信息计算出需要分配的内存空间大小。
  2. 在内存中分配足够的空间来存储新对象的实例数据。
  3. 调用构造函数对分配的内存空间进行初始化,即设置对象的初始状态。这包括为对象的实例变量赋予初始值,以及执行构造函数体内的任何其他初始化代码。

对于选项B和D,它们描述的情况涉及的是对象的复制或克隆,而非通过构造函数创建新对象:

B.使用java.io.ObjectInputStreamreadObject方法从流中恢复对象时,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: 可以在任何地方访问,没有限制。
修饰符类内部同一个包子类任何地方
privateYesNoNoNo
defaultYesYesNoNo
protectedYesYesYesNo
publicYesYesYesYes

5.下面有关java final的基本规则,描述错误的是?
A.final修饰的类不能被继承
B.final修饰的成员变量只允许赋值一次,且只能在类方法赋值
C.final修饰的局部变量即为常量,只能赋值一次。
D.final修饰的方法不允许被子类覆盖

正确答案:B

  • final修饰的类不能被继承,确保了类的不可变性和封装性。
  • final修饰的方法不能被子类覆盖,保证了方法行为的一致性。
  • final修饰的变量(包括局部变量、成员变量和数组)只能被赋值一次,之后其值不能被改变,这些变量相当于常量。
  • final修饰的引用类型变量不能再指向别的对象,但如果引用本身指向的是可变对象,那么对象的内容是可以改变的。

总结

磕磕碰碰的过日子,加油少年

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

布说在见

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值