Java每日一练06

一级目录

二级目录

三级目录

题目

选自牛客网

1.一般情况下,以下哪个选项不是关系数据模型与对象模型之间匹配关系?

A.表对应类
B.记录对应对象
C.表的字段对应类的属性
D.表之间的参考关系对应类之间的依赖关系

正确答案:D

  • 一个表(Table)可以对应到一个类(Class),这是对象关系映射(ORM)中最常见的映射之一。(选项A正确)
  • 表中的记录(Record 或 Row)对应于类的实例或对象(Object),每个记录映射为一个对象。(选项B正确)
  • 表的字段(Field 或 Column)对应于类的属性(Property 或 Attribute),即对象的状态。(选项C正确)

关于选项D,虽然表之间的参考关系(例如外键约束)确实表示了一种关联,但在面向对象的术语中,这种关系更常被描述为关联(Association)、聚合(Aggregation)或者组合(Composition),而不是简单的依赖(Dependency)。依赖关系在UML中有着特定的含义,它指的是一个对象使用另一个对象的功能或服务,但并不拥有它们。因此,将外键关系直接等同于依赖关系并不是一个恰当的映射方式。


2.transient 变量和下面哪一项有关?

A.Cloneable
B.Serializable
C.Runnable
D.Comparable

正确答案:B
transient 关键字与 Serializable 接口相关联。这是因为 transient 关键字用于标记 Java 对象中的那些不应该被序列化(即不应该被写入到持久化存储中)的变量。

当一个类实现了 Serializable接口时,意味着这个类的对象可以被序列化成字节流,并可以从该字节流中恢复。如果某个成员变量不需要持久化,或者其值应该在反序列化后重新计算,则可以使用transient 关键字来标记这个变量。这样,在序列化过程中,这些变量就不会被保存,而在反序列化之后,这些变量的值将会被设置为默认值(如 0falsenull)。

因此,正确答案是 B. Serializable。其他选项与 transient 关键字无关:

  • A. Cloneable:这是一个接口,用于指示一个类支持浅复制,transient 关键字与之没有直接关系。
  • C. Runnable:这是一个接口,用于定义线程可以执行的任务,与 transient 无关。
  • D. Comparable:这是一个接口,用于定义对象的自然排序,同样与 transient 无关。

3.线程安全的map在JDK 1.5及其更高版本环境 有哪几种方法可以实现?

A.Map map = new HashMap()
B.Map map = new TreeMap()
C.Map map = new ConcurrentHashMap();
D.Map map = Collections.synchronizedMap(new HashMap());

正确答案:CD

线程安全的 Map 在 JDK 1.5 及其更高版本中可以通过多种方式实现。以下是您提供的选项中的正确答案:

C. Map map = new ConcurrentHashMap();

ConcurrentHashMap 是从 JDK 1.5 开始引入的一个线程安全的 Map实现。它通过分段锁技术实现了高效的并发访问,允许多个读取操作和写入操作同时进行而不会相互阻塞。

D. Map map = Collections.synchronizedMap(new HashMap());

Collections.synchronizedMap() 方法可以将任何 Map 装饰为线程安全的 Map。这通常涉及到对底层Map 的所有修改操作加锁以确保同步。这种方法比ConcurrentHashMap
更加简单粗暴,可能会导致更多的锁竞争,尤其是在高并发场景下。

选项 A 和 B 中的 HashMapTreeMap
都不是线程安全的,因此不适合在多线程环境中直接使用而不采取额外的同步措施。

4.使用mvc模式设计的web应用程序具有以下优点,除了?

A.可维护行强
B.可扩展性强
C.代码重复少
D.大大减少代码量

正确答案:D

MVC(Model-View-Controller)模式是一种常用的设计模式,尤其适用于Web应用程序开发。它将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller),这样的分离有助于提高应用程序的可维护性和可扩展性,并减少代码重复。

选项A、B和C都是MVC模式的优点:

  • A. 可维护性强:由于MVC模式将业务逻辑、数据展示和用户交互分离,使得代码更加清晰且易于维护。
  • B. 可扩展性强:当需要添加新功能或更改现有功能时,MVC模式下的模块化结构使得扩展变得更容易。
  • C. 代码重复少:通过将不同的职责分配给不同的组件,可以减少代码重复,并提高代码重用率。

然而,选项D “大大减少代码量”
并不一定是MVC模式的直接优势。虽然MVC模式可以帮助组织代码并提高代码的复用性,但它不一定能显著减少总体代码量。实际上,在某些情况下,为了保持MVC模式的清晰度和分离性,可能会增加一些辅助代码(比如控制器逻辑),从而导致代码总量有所增加。

因此,正确答案是 D. 大大减少代码量。


5.运行代码,输出的结果是()

public class P {
    public static int abc = 123;
    static{
        System.out.println("P is init");
    }
}
public class S extends P {
    static{
        System.out.println("S is init");
    }
}
public class Test {
    public static void main(String[] args) {
        System.out.println(S.abc);
    }
}

A.P is init
123

B.S is init
P is init
123

C.P is init
S is init
123

D.S is init
123
正确答案:A

在Java中,子类并不会因为某些特定情况而被初始化。这里列出了一些不会触发子类初始化的情况:

  1. 调用父类的静态方法或静态字段:

    • 当你调用一个类的静态方法或访问其静态字段时,只有该类会被加载和初始化,而其子类不会被初始化。这是因为静态方法和静态字段属于类级别,与对象实例无关。
  2. 调用父类的final方法或字段:

    • 如果父类的方法或字段被声明为final,那么子类不能覆盖或改变这些方法或字段。因此,即使你在子类中调用了这些final方法或字段,也不会触发子类的初始化,因为这些方法或字段是在父类中定义的。
  3. 通过数组来引用:

    • 创建一个类的数组不会导致该类的初始化,除非你明确地创建了数组中的一个元素。这意味着仅仅声明一个子类的数组不会导致子类的初始化,而只会导致数组类型的父类被初始化。

示例代码可以帮助理解这些情况:

class Parent {
    static {
        System.out.println("Parent is initialized.");
    }

    static int staticField = 10;

    final int finalField = 20;

    public static void staticMethod() {
        System.out.println("Parent's static method called.");
    }

    public final int finalMethod() {
        return 30;
    }
}

class Child extends Parent {
    static {
        System.out.println("Child is initialized.");
    }
}

public class Test {
    public static void main(String[] args) {
        // 调用父类的静态方法
        Parent.staticMethod();

        // 访问父类的静态字段
        System.out.println(Parent.staticField);

        // 访问父类的final字段
        Parent parent = new Parent();
        System.out.println(parent.finalField);

        // 访问父类的final方法
        System.out.println(parent.finalMethod());

        // 通过数组来引用
        Parent[] parents = new Parent[10]; // 这里只初始化Parent类
    }
}

在这个例子中,只有 Parent 类会被初始化,而 Child 类不会被初始化,因为所有的操作都直接涉及 Parent 类。如果你想要初始化 Child 类,你需要显式地创建一个 Child 类的实例,例如 new Child();

6.下面有关值类型和引用类型描述正确的是()?

A.值类型的变量赋值只是进行数据复制,创建一个同值的新对象,而引用类型变量赋值,仅仅是把对象的引用的指针赋值给变量,使它们共用一个内存地址。

B.值类型数据是在栈上分配内存空间,它的变量直接包含变量的实例,使用效率相对较高。而引用类型数据是分配在堆上,引用类型的变量通常包含一个指向实例的指针,变量通过指针来引用实例。

C.引用类型一般都具有继承性,但是值类型一般都是封装的,因此值类型不能作为其他任何类型的基类。

D.值类型变量的作用域主要是在栈上分配内存空间内,而引用类型变量作用域主要在分配的堆上。

正确答案:ABC

值类型(Value Types)和引用类型(Reference Types)是Java中两种基本的数据类型分类。下面是针对每个选项的分析:

A.
值类型的变量赋值只是进行数据复制,创建一个同值的新对象,而引用类型变量赋值,仅仅是把对象的引用的指针赋值给变量,使它们共用一个内存地址。

  • 正确。对于值类型(如基本数据类型、枚举、结构体等),当你将一个值类型变量赋值给另一个变量时,实际上是复制了一份该值类型的副本。而对于引用类型(如类、接口等),赋值操作只是将指向同一对象的引用复制给了另一个变量。

B.
值类型数据是在栈上分配内存空间,它的变量直接包含变量的实例,使用效率相对较高。而引用类型数据是分配在堆上,引用类型的变量通常包含一个指向实例的指针,变量通过指针来引用实例。

  • 正确。值类型确实是在栈上分配内存空间的,而引用类型的实例是在堆上分配内存空间的,引用类型的变量则是在栈上存放的,其中包含指向堆上实际对象的引用。

C. 引用类型一般都具有继承性,但是值类型一般都是封装的,因此值类型不能作为其他任何类型的基类。

  • 正确。引用类型(如类)可以被继承,而值类型(如基本数据类型)是不可继承的。在Java中,值类型通常是封装的,并且不能作为其他类型的基类。

D. 值类型变量的作用域主要是在栈上分配内存空间内,而引用类型变量作用域主要在分配的堆上。

  • 部分正确。这个描述有些模糊。值类型变量的作用域确实主要是在栈上,但这里的“作用域”可能是指存储位置,而非变量的作用域范围。引用类型变量本身存储在栈上,但它们指向的对象存在于堆上。
  • 16
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

布说在见

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

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

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

打赏作者

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

抵扣说明:

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

余额充值