牛客疑难题(5
1、!!!!!
2、Java类与对象方法中虚方法
关于Java里的虚方法、抽象方法描述不正确的是?
A 虚方法可以被子类继承并重写方法
B 抽象方法不可以带实现
C 抽象方法非抽象子类必须实现
D 抽象方法可以被子类实现成虚方法
正确答案:D
关于Java中的虚方法与抽象方法,描述不正确的是:
D. 抽象方法可以被子类实现成虚方法
解析:
Java中虚方法的特性:
- Java默认所有非final、非static的非静态方法均为虚方法(即支持动态绑定),子类可通过@Override重写。
- 虚方法在父类中可以有实现,子类可覆盖或扩展。
Java中抽象方法的特性:
- 抽象方法无方法体,必须由子类实现(若子类非抽象类)。
- 抽象方法只能存在于抽象类中,且子类必须实现所有抽象方法。
选项D的错误性:
- 抽象方法本身无实现,子类在实现时需提供完整方法体,而非将其声明为“虚方法”。
- Java中不存在“将抽象方法实现为虚方法”的概念,因为虚方法是默认行为(非final方法均可被重写),而抽象方法强制要求子类实现。
其他选项的正确性:
- A正确:虚方法可被子类继承并重写(Java默认支持动态绑定)。
- B正确:抽象方法无方法体,仅定义签名。
- C正确:非抽象子类必须实现父类的抽象方法,否则自身需声明为抽象类。
结论:D为错误描述。
3 在Java中,所有文件在底层都是以字节形式存储的,因此无论是文本文件还是二进制文件,都可以当作二进制文件来处理。
这也是为什么Java提供了统一的字节流类(如FileInputStream和FileOutputStream)来处理所有类型的文件。
4 在Java中,静态方法不能直接访问非静态成员,这会导致编译错误。
5 super关键字
在Java中是一个非常重要的关键字,它具有多个重要作用,选项D是完全正确的。让我们逐个分析super的三个主要功能:
1. 访问父类被隐藏的非私有成员变量(选项A)
当子类中定义了与父类同名的成员变量时,子类的变量会隐藏父类的变量。这时如果要访问父类中被隐藏的变量,就需要使用super关键字。例如:
super.variableName 可以访问父类中的变量。
2. 调用父类中被重写的方法(选项B)
当子类重写了父类的方法时,如果需要在子类中调用父类被重写的方法,就需要使用super关键字。例如:
super.methodName() 可以调用父类中被重写的方法。
3. 调用父类的构造函数(选项C)
在子类的构造函数中,可以使用super()来调用父类的构造函数。这常用于初始化从父类继承的属性。如果不显式调用,编译器会自动插入super()调用父类的无参构造函数。
6 重写规则
本题的核心考点是Java中方法重写(Override)的规则:
1. 重写方法必须保持相同的方法名和参数列表
2. 返回类型必须相同或是父类返回类型的子类型
3. 访问修饰符的限制不能比父类更严格
4. 不能抛出比父类方法更多的异常
7 对象IO与序列化
8 JVM 内存配置参数:
对于JVM内存配置参数:
-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3
,其最小内存值和Survivor区总大小分别是()
A
5120m,1024m
B
5120m,2048m
C
10240m,1024m
D
10240m,2048m
正确答案:D
你的答案:B
官方解析:
这道题目考察了JVM内存配置参数的理解。让我们逐个分析这些参数:
-Xmx10240m:最大堆内存
-Xms10240m:初始堆内存(最小堆内存)
-Xmn5120m:新生代大小
-XXSurvivorRatio=3:Eden区与Survivor区的比例为3:1:1
首先,最小内存值就是-Xms参数指定的值,即10240m。
关于Survivor区总大小的计算:
1. 新生代总大小为5120m(-Xmn参数指定)
2. 新生代分为Eden区和两个Survivor区
3. 根据SurvivorRatio=3,意味着Eden:S0:S1=3:1:1
4. 所以新生代5120m要分成5份(3+1+1=5)
5. 每份大小为5120/5=1024m
6. 两个Survivor区总大小=1024m×2=2048m
因此,最小内存值为10240m,Survivor区总大小为2048m,对应D选项。
分析其他选项:
A错误:把新生代大小5120m错误地当作最小内存值,且Survivor计算错误
B错误:最小内存值使用了错误的数值
C错误:虽然最小内存值正确,但Survivor区总大小计算错误知识点:2015、Java、Java工程师、JavaSE
9 static方法不能直接访问非static的属性。
静态方法属于类级别,而非静态属性属于实例级别,在没有实例化对象的情况下,静态方法无法访问实例属性。
abstract和final是互斥的修饰符,不能同时修饰一个类。因为abstract类是用来被继承的,而final类禁止被继承,两者矛盾。
abstract类中不建议有private的成员。因为abstract类的主要目的是被继承和扩展,而private成员无法被子类访问,这与abstract类的设计初衷不符。
abstract方法必须在abstract类或接口中声明。因为abstract方法没有方法体,需要子类来实现,所以只能出现在abstract类或接口中。
10 Java API 与mian方法()
11 maven基于项目 ant是基于java的构建工具 maven强
12 关于final关键字的信息:
13、检查型异常和运行时异常:
4.
下面关于 Java 中异常处理的说法错误的是()
A
可以使用 try-catch-finally 块来捕获和处理异常
B
可以使用 throws 关键字来声明方法可能抛出的异常
C
运行期异常不需要进行捕获或者声明
D
编译期异常需要在代码中显式地进行异常处理
正确答案:C
你的答案:B
官方解析:
在Java异常处理机制中,运行时异常(RuntimeException)同样需要进行适当的处理,C选项的说法是错误的。虽然运行时异常在语法上不强制要求必须处理,但为了程序的健壮性和可靠性,也应当对其进行合理的捕获和处理。
分析其他选项:
A正确:try-catch-finally是Java中最基本的异常处理结构,try块中包含可能抛出异常的代码,catch块用于捕获和处理特定类型的异常,finally块中的代码无论是否发生异常都会执行。
B正确:throws关键字用于在方法声明中指明该方法可能抛出的异常类型,这是Java异常处理机制的一个重要组成部分。
D正确:编译期异常(checked exception)必须在代码中通过try-catch显式捕获或者通过throws声明,否则代码将无法通过编译。这是Java编译器的强制要求。
总的来说,不论是运行时异常还是编译期异常,都建议在代码中进行适当的异常处理,这样可以提高程序的稳定性和用户体验。
13 final在定义编译前需要被初始化:
5.
1
2
3
4
5
6
7
class
Foo {
final
int
i;
int
j;
public
void
doSomething() {
System.out.println(++j + i);
}
}
的输出是?
A
0
B
1
C
2
D
不能执行,因为编译有错
正确答案:D
你的答案:B
官方解析:
这道题目考察了Java中final变量的初始化规则和类成员变量的默认值规则。代码中的编译错误在于final变量i没有被初始化。
在Java中,final变量(成员变量)必须在以下位置之一进行初始化:
1. 声明时直接初始化
2. 在构造方法中初始化
3. 在初始化块中初始化
示例代码中的final变量i既没有在声明时初始化,也没有在构造方法中初始化,这违反了final变量的初始化规则,因此编译器会报错。
分析其他选项:
A、B、C都是不正确的,因为代码根本无法通过编译。这些选项假设了代码可以执行,但实际上由于final变量i未初始化的编译错误,程序根本无法运行到执行阶段。
另外需要注意的是:
- 非final的成员变量j会被自动初始化为0
- ++j操作是可以的,因为j不是final变量
- 但由于i的编译错误,整个方法都无法正常编译
所以D选项"不能执行,因为编译有错"是正确答案。知识点:Java