查漏补缺(三)

本文详细解析了Java中的抽象类和final关键字,讨论了它们在类和方法上的使用规则,以及对象的创建方式、异常处理、序列化和线程池的创建。特别强调了抽象方法的必要性和final修饰的约束条件。
摘要由CSDN通过智能技术生成

做了一点题,对其中涉及到的一些知识点重新做了整理。

1.

下面叙述正确的是()

A.abstract类中只可以有abstract方法

B.不可以同时用final和abstract修饰

C.final 类可以有子类

D.abstract 类中可以有非 abstract 方法, 但该方法不可以用 final 修饰

很明显B  

注:

abstract类中可以包含非 abstract 的方法、字段、构造器和其他成员。abstract 类的目的是作为其他类的基类,并提供一个或多个抽象方法,这些方法在子类中被实现。

abstract主要用来声明抽象类和方法。被声明为abstract的类不能被实例化,而abstract方法则只有方法的声明,没有实现,需要在子类中被重写。

final被用来修饰类、方法、变量、参数。被final修饰的类不能被继承,被final修饰的方法不能被重写,被final修饰的变量不能被改变(!!final修饰的是变量的引用,而不是引用指向的内容,引用指向的内容是可以被改变的)。final的实例字段必须在构造对象时初始化,并且在对象的生命周期内不能被修改。

要注意abstract和final在修饰方法和类时具有互斥性。由于abstract修饰的方法需要在子类中被重写,而final修饰的方法不能被重写,因此,这两个关键字不能同时用于修饰同一个方法。同样,一个类也不能同时被声明为abstract和final,因为abstract类需要被子类继承并实现其抽象方法,而final类不能被继承。

对于D ,一个抽象类中的非抽象方法应该是可以被final修饰的。当一个方法被声明为final时,意味着这个方法不能被子类重写,所以,即使这个方法存在于一个抽象类中,它的final属性也会阻止任何继承这个抽象类的子类去改变或重写这个方法的行为。这就可能类似于一个常量,不能被改变。

抽象类中的抽象方法必须重写,非抽象方法可以不用重写。

2.
如下程序的输出结果是()
public class Foo {
public static void main(String[] args) {
try {
return;
} finally {
System.out.printIn( "Finally” );
A.正常运行但没有输出
8.运行时抛出异常
C. Finally
D.编译失败

C

注:在Java中,finally块总是会在try块和catch块(如果有的话)之后执行,无论是否发生了异常,或者try块中是否有return语句。在这个程序中,try块中的return语句会导致方法返回,但在返回之前,finally块中的代码会先被执行。因此,程序会先打印出"Finally",然后返回。

这里需要注意的是,尽管finally块中的代码会执行,但如果在finally块中也包含return语句,那么它将覆盖try块中的return语句,并返回finally块中的值。

3.

java创建对象的方式


使用new关键字:这是最常见的创建对象的方式。使用new关键字调用类的构造器来创建对象。


使用克隆(Clone)方法:如果你已经有了一个对象,并且想要创建这个对象的一个副本,可以使用对象的clone()方法。需要注意的是,要调用clone()方法,类必须实现Cloneable接口,并且重写Object类的clone()方法。


使用反序列化:如果你有一个对象,并且已经将其序列化到文件中或通过网络发送,那么你可以使用反序列化来恢复这个对象。这通常用于持久化对象或在网络间传输对象。

除此之外,还有可以利用利用反射创建对象,代码示例:http://t.csdnimg.cn/Ul30U

4.

以下代码将打印出()

public class Person{

private String name ="Person";

int age=0;

}

public class Child extends Person{

public String grade;

public static void main(String[] args){

Person p = new Child();

System.out.printin(p.name);

}

}

A. 运行出错

B. Person

C.没有输出

D.编译出错

D。由于name字段在Person类中被声明为private,它不能从Child类或者任何Person类的外部被直接访问。即使Child类继承了Person类,由于name的私有性,它仍然是不可见的。

注:如果想要从Child类外部访问name字段,您需要在Person类中提供一个公共的getter方法。

public class Person {

       private String name = "Person";

       int age = 0;

       public String getName() {

       return name;

       }

}

5.

以下关于异常的说法正确的是()
A.如果一个方法申明将抛出某个异常,它就必须真的抛出那个异常
B.在catch子句中匹配异常是一种精确匹配
C.可能抛出系统异常的方法是不需要申明异常的
D.一旦出现异常,程序运行就终止了

C

注:

系统异常,也称为Error,通常是Java虚拟机底层功能出现问题时抛出的,例如内存溢出。这类异常通常无法通过try-catch块来捕获,因为它们表示故障或资源不足等情况,而不是程序逻辑错误。因此,如果方法可能会抛出系统异常,如Error的实例,那么在方法签名中声明该异常是不必要的。

相反,如果方法可能会抛出运行时异常(RuntimeException),那么在方法签名中声明这些异常是必要的,因为运行时异常通常表示程序逻辑错误,比如数组下标越界ArrayIndexOutOfBoundsException。

6.

如下代码,第2 行的 Float 对象被创建后, 何时可以被 GC 回收?

1. public Object m(){

2.Object o = new Float(3.14F);

3.Object [] oa = new Object[1];

4.oa[0]= o;

5.o = null;

6. oa[0] = null;

7. print 'return o';

8.}

A.第7行以后

B.第5行以后

C.第4行以后

D.第6行以后

选项D

注:第二行  Object o = new Float(3.14F);:创建了一个新的Float对象,并将其引用赋值给变量o

第三行 Object [] oa = new Object[1];:创建了一个新的Object数组,并将其引用赋值给变量oa

第四行  oa[0]= o;:将o所引用的Float对象的引用赋值给数组oa的第一个元素。此时,Float对象有两个引用:ooa[0]

第五行  o = null;:将o的引用设置为null。此时,Float对象仍然有一个引用:oa[0]

第六行 oa[0] = null;:将oa[0]的引用设置为null。此时,Float对象没有任何引用了。

第七行 print 'return o';  呃 这儿应该是个类似的打印语句,不过和回收没有关系。

第六行 float对象没有任何引用了,此时就可以被GC回收。

7.SQL语句的子类

SQL语句按其功能分为 

数据定义语言(DDL, Data Definition Language)

数据查询语言(DQL, Data Query Language)

数据操纵语言(DML, Data Manipulation Language)

事务控制语言(TCL, Transaction Control Language)

8.缺省访问 friendly

"缺省"(在Java中通常指不使用任何访问修饰符)的成员变量、方法和内部类仅在同一类内可见。这种缺省的访问级别也被称为包级私有(package-private)。

解释:http://t.csdnimg.cn/fHpKF

9.

以下关于对象序列化描述正确的是()
A.使用ObjectOutputStream类完成对象存储,使用ObjectInputStream类完成对象读取
B.使用FileOutputStream可以将对象进行传输
C.对象序列化的所属类需要实现Serializable接口
D.使用PrintWriter可以将对象进行传输

AC

注:ObjectOutputStream类用于将Java对象的基本数据类型和图形写入OutputStream,以便进行持久化存储或网络传输。

而ObjectInputStream类则用于从流中读取(重构)先前序列化的对象。

FileOutputStream类是一个字节流类,用于将数据写入文件,但它本身并不支持对象的序列化或传输。对象序列化需要使用ObjectOutputStream或类似的类来完成。

为了使一个类的实例能够被序列化,该类必须实现Serializable接口。Serializable接口是一个标记接口,没有定义任何方法,但它告诉Java虚拟机这个类的对象可以被序列化。

printWriter是Java中用于向字符输出流写入文本数据的类,它主要用于打印文本到控制台或写入文件,但并不支持对象的序列化或传输。

10.线程池的创建方法

http://t.csdnimg.cn/2qsbG

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值