Java笔试面试题AI答之面向对象(7)

news2024/9/25 23:21:58

文章目录

  • 37. Java成员变量与局部变量的区别有哪些?
  • 38. Java 创建一个对象用什么运算符? 对象实体与对象引用有何不同?
      • 对象实体与对象引用的不同
      • 示例
  • 39. 类的构造方法的作用是什么? 若一个类没有声明构造方法,该程序能正确执行吗? 为什么?
  • 40. Java构造方法有哪些特性?
  • 41. Java调用子类构造方法之前会先调用父类没有参数的构造方法, 其目的是什么?
  • 42. Java中,子类可以从父类中继承哪些?

37. Java成员变量与局部变量的区别有哪些?

Java中的成员变量(也称为字段或属性)和局部变量是两种不同类型的变量,它们在多个方面存在显著差异。这些差异主要体现在以下几个方面:

  1. 定义位置

    • 成员变量:定义在类的内部,但在方法、构造函数或代码块之外。它们属于类本身,而不是类的某个特定方法或代码块。
    • 局部变量:定义在方法、构造函数或代码块内部。它们的作用域仅限于定义它们的那个方法、构造函数或代码块。
  2. 生命周期

    • 成员变量:随着类的实例(对象)的创建而创建,随着对象的销毁而销毁。即使某个方法执行完毕,对象的成员变量仍然存在,直到对象被垃圾回收。
    • 局部变量:仅在定义它们的方法、构造函数或代码块执行时存在。一旦方法、构造函数或代码块执行完毕,局部变量就会被销毁。
  3. 作用域

    • 成员变量:在整个类中都是可见的(除非被声明为私有private,那么只能被类内部访问)。它们可以被类的任何方法或构造函数访问和修改。
    • 局部变量:只能在定义它们的方法、构造函数或代码块内部访问。一旦离开这个作用域,变量就不可见了。
  4. 默认值

    • 成员变量:如果成员变量没有被显式初始化,Java会给它一个默认值(例如,数值型为0,布尔型为false,对象引用为null)。
    • 局部变量:在使用前必须显式初始化,否则编译器会报错。
  5. 访问修饰符

    • 成员变量:可以使用访问修饰符(public、protected、private和默认(无修饰符))来控制它们的访问级别。
    • 局部变量:不能使用访问修饰符,因为它们的作用域仅限于定义它们的方法、构造函数或代码块内部。
  6. 存储位置

    • 成员变量:存储在堆内存中,因为它们属于类的实例(对象)。
    • 局部变量:存储在栈内存中,因为它们是方法执行过程中的临时数据。

了解这些差异有助于更好地编写和组织Java代码,以及理解程序的行为和内存管理。

38. Java 创建一个对象用什么运算符? 对象实体与对象引用有何不同?

在Java中,创建对象通常使用new关键字作为运算符。new关键字用于分配内存给对象,并返回指向该内存的引用。这个引用可以被存储在变量中,之后可以通过这个变量来访问对象。

对象实体与对象引用的不同

对象实体(Object Instance)

  • 对象实体是实际存储在内存中的对象。它包含了对象的所有属性和方法。
  • 对象实体是具体的,但你不能直接通过代码来“看到”或“操作”它,因为它存储在JVM的内存中。
  • 对象实体是通过new关键字创建的。

对象引用(Object Reference)

  • 对象引用是存储在变量中的值,这个值是指向对象实体的内存地址。
  • 通过对象引用,你可以访问和操作对象实体的属性和方法。
  • 对象引用是变量,可以存储在栈内存中,而对象实体存储在堆内存中。
  • 你可以有多个对象引用指向同一个对象实体,也可以让对象引用变为null(即不指向任何对象实体)。

示例

class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    void display() {
        System.out.println(name + " is " + age + " years old.");
    }
}

public class Main {
    public static void main(String[] args) {
        // 使用new关键字创建Person对象实体,并将返回的引用存储在变量p中
        Person p = new Person("John", 30);

        // 通过对象引用p访问对象实体的display方法
        p.display();

        // 另一个对象引用指向同一个对象实体
        Person p2 = p;
        p2.display(); // 同样会输出John的信息

        // 让p不再指向任何对象实体
        p = null;

        // 注意:此时p2仍然指向原来的对象实体,可以正常使用
        p2.display();
    }
}

在这个例子中,Person p = new Person("John", 30); 创建了一个Person对象实体,并将返回的引用存储在变量p中。之后,pp2都指向了同一个对象实体,即使p被设置为nullp2仍然可以访问该对象实体。

39. 类的构造方法的作用是什么? 若一个类没有声明构造方法,该程序能正确执行吗? 为什么?

类的构造方法(Constructor)在面向对象编程中扮演着非常关键的角色。其主要作用包括:

  1. 初始化新创建的对象:当使用new关键字创建类的实例时,构造方法会被自动调用,用于初始化该对象的状态。这意味着你可以在构造方法内部为新创建的对象分配初始值或者执行必要的设置操作。

  2. 确保对象的合理创建:通过在构造方法中添加必要的逻辑,可以确保在对象被创建时满足一定的条件,从而避免创建无效或状态不一致的对象。

  3. 提供灵活的实例化方式:一个类可以有多个构造方法(构造方法的重载),每个构造方法可以有不同的参数列表,允许通过不同的方式创建对象。

如果一个类没有显式声明构造方法,程序仍然可以正确执行。这是因为Java编译器会为这个类提供一个默认的无参构造方法(default constructor)。这个默认构造方法不包含任何参数,并且不执行任何除了调用父类(如果有的话)的无参构造方法之外的操作。因此,即使没有显式地声明任何构造方法,你仍然可以创建该类的实例,只是这个实例在创建时不会有任何特定的初始化操作被执行。

然而,如果类中显式地定义了至少一个构造方法(无论是否有参数),编译器就不会再自动生成默认的无参构造方法。如果此时尝试使用不带任何参数的方式来创建该类的实例,就会遇到编译错误,因为编译器找不到合适的构造方法来执行这一操作。

综上所述,类的构造方法的主要作用是初始化新创建的对象,并确保对象的合理创建。而如果一个类没有显式声明构造方法,程序仍然可以正确执行,因为Java会提供一个默认的无参构造方法。但如果类中已经定义了其他构造方法,则必须显式地提供一个无参构造方法(如果需要的话),否则就不能使用不带参数的方式来创建该类的实例。

40. Java构造方法有哪些特性?

Java中的构造方法(也称为构造函数)是一种特殊类型的方法,它在创建对象时自动调用,用于初始化对象。构造方法具有以下几个特性:

  1. 名称与类名相同:构造方法的名称必须与定义它的类的名称完全相同(包括大小写)。

  2. 没有返回类型:构造方法没有返回类型,甚至连void都没有。如果方法定义了返回类型,那么它就不是构造方法,而是一个普通方法。

  3. 可以有参数:构造方法可以有参数,这允许你在创建对象时通过参数传递初始值给对象的成员变量。不同的参数列表可以定义多个构造方法,这称为构造方法的重载。

  4. 主要目的是初始化对象:构造方法的主要作用是初始化新创建的对象。在对象被创建时,会自动调用相应的构造方法,并根据方法体内的代码设置对象的初始状态。

  5. 可以被重载:一个类中可以定义多个构造方法,只要它们的参数列表不同即可。这样,创建对象时可以根据需要选择调用哪个构造方法。

  6. 不能被继承:构造方法不能被继承。子类不能继承父类的构造方法,但是子类可以通过调用父类的构造方法来初始化从父类继承的属性。这通常是通过在子类的构造方法中使用super()关键字实现的。

  7. 隐式调用:当你使用new关键字创建对象时,Java会隐式地调用该类的构造方法。如果你没有显式地定义任何构造方法,Java编译器会为你提供一个无参的默认构造方法。但是,如果你已经定义了至少一个构造方法,那么编译器就不会为你提供默认的无参构造方法了。

  8. 可以在构造方法中调用其他构造方法:在同一个类中,一个构造方法可以通过this()语法调用同一个类的另一个构造方法。但是,这种调用必须是构造方法体内的第一条语句。

了解这些特性有助于更好地理解和使用Java中的构造方法,以及如何通过它们来创建和初始化对象。

41. Java调用子类构造方法之前会先调用父类没有参数的构造方法, 其目的是什么?

在Java中,当一个子类被实例化时,它确实会首先调用其父类的构造方法(如果子类没有明确指定调用父类的哪个构造方法的话,会默认调用父类的无参构造方法),这背后的主要目的和好处有以下几点:

  1. 初始化继承的成员变量:子类继承自父类的所有非私有成员(变量和方法)。在子类能够正常使用这些继承过来的成员之前,父类有责任先确保这些成员被正确地初始化。因此,调用父类的构造方法是初始化这些继承来的成员的一个重要步骤。

  2. 执行父类的初始化代码:父类的构造方法中可能包含了一些初始化代码,这些代码可能是为了设置默认的值、初始化数据结构、分配资源等。如果不先执行这些代码,子类对象可能会因为访问到未初始化的数据而出错。

  3. 保持类的继承关系的正确性:在面向对象编程中,继承关系代表了“是一个”的关系。比如,Dog是一个Animal。如果Dog对象能够存在,那么它首先必须是一个正确的Animal对象。因此,在创建Dog对象时,必须首先确保它是一个符合规范的Animal对象,这就需要先调用Animal的构造方法。

  4. 遵循Liskov替换原则:在面向对象的设计中,Liskov替换原则指出,子类型必须能够替换掉它们的基类型。这意呀着子类型必须拥有所有基类所声明的方法,且这些方法的行为与基类保持一致。因此,确保子类对象在实例化时先执行父类的构造方法,也是符合这一原则的。

  5. 代码复用:父类中的构造方法可能已经包含了用于初始化对象所需的一些通用代码。子类通过调用父类的构造方法,可以复用这些代码,从而避免重复编写相同的初始化逻辑。

总的来说,Java中子类在实例化时先调用父类的构造方法,主要是为了确保对象能够被正确地初始化,符合面向对象编程的原则,并且能够实现代码的复用。

42. Java中,子类可以从父类中继承哪些?

在Java中,子类可以从父类中继承多个方面的内容,但主要可以分为以下几类:

  1. 成员变量(字段):子类可以继承父类中非私有的(public, protected, 默认(无修饰符,也称为包级私有))成员变量。如果父类中的成员变量是私有的(private),则子类不能直接访问它们,但可以通过父类提供的公共(public)或受保护(protected)的方法(getter和setter)来访问或修改它们。

  2. 方法:子类可以继承父类中非私有的方法。和成员变量一样,如果父类中的方法是私有的,子类不能直接访问这些方法。但是,子类可以访问那些被声明为public、protected或默认(包级私有)的方法。

  3. 构造器(Constructor):需要注意的是,子类不能直接继承父类的构造器。子类可以调用父类的构造器(使用super关键字),但这个过程被称为构造器调用,而不是继承。子类必须定义自己的构造器,并在其构造器内部显式或隐式地调用父类的构造器(如果父类没有定义无参构造器且子类构造器中没有显式调用父类的其他构造器,则编译器会报错)。

  4. 初始化块(Instance Initialization Blocks):子类不能直接继承父类的初始化块,但是当子类创建对象时,父类的初始化块会在父类构造器调用之前执行。这意味着,虽然子类不直接继承初始化块,但初始化块中的代码会以某种方式影响子类对象的初始化过程。

  5. 静态成员(静态字段和静态方法):子类也继承了父类的静态成员,但这些静态成员是通过类名来访问的,而不是通过类的实例。因此,即使子类继承了父类的静态成员,这些成员也被视为属于父类,而不是子类。子类可以隐藏(覆盖)从父类继承来的静态方法,但这并不改变继承的事实,只是改变了静态方法的解析方式(基于静态解析类型)。

  6. final方法:如果父类中的方法是final的,那么这个方法在子类中是不能被覆盖的,但子类仍然继承了这个方法。

  7. 访问权限:子类继承的成员(字段和方法)的访问权限可能会受到子类所在包和访问修饰符的限制。例如,如果父类中的某个成员是受保护的(protected),那么它只能被同一个包内的类以及任何子类访问。

总的来说,子类主要继承父类中的非私有成员(包括字段、方法、静态成员等),但不包括构造器和初始化块(尽管它们对子类对象的初始化有重要影响)。

答案来自文心一言,仅供参考

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2089625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服了!DELETE 同一行记录也会造成死锁---图文解析

服了!DELETE 同一行记录也会造成死锁!! 作者:转转技术团队 链接:https://juejin.cn/post/7387227689319563290 来源:稀土掘金 MySQL 锁回顾 共享锁 使用共享锁(Shared Lock)时&am…

模糊视频一键变清晰,从此告别模糊不清的画质

话不多说,咱们直入主题。你是不是有比较模糊的视频,比如老视频,老电影和监控视频,对了,还有日本土特产(懂的都懂),模糊的视频看起是不是很不舒服,长期久了还会影响视力影…

这些可视化Python库非常强!

介绍的大体流程是:库名、类型、github star、功能、使用方法、案例、学习资料。 第一部分:数据可视化 pyecharts 类型:可视化图表设计 GitHub Star :5985 功能: 简洁的 API 设计,使用如丝滑般流畅&am…

LLM(二):Prompt

一,什么是Prompt 在人工智能领域,Prompt指的是用户给大型语言模型发出的指令。作用是引导模型生成符合预期主题或内容的文本,从而控制生成结果的方向和内容。 大模型是根据用户提出的问题来输出下文,所以用户提出的问题的质量也…

三种智能指针

智能指针 new和delete 1:new初始化 new未初始化值 int *p new int;//p值未定义string *str new string;//为空串&#xff0c;调用string默认构造函数new 初始化值 int *p new int(100);string *str new string(6,a);//aaaaaavector类型指针 vector<int> *p new v…

pikepdf:一个实用的PDF文件处理Python库

我是东哥&#xff0c;今天给大家介绍一个实用的Python库——pikepdf&#xff0c;它能让你像操作文本文件一样轻松地处理PDF&#xff0c;无论是读取、修改还是保存&#xff0c;都能迎刃而解。 基本介绍 pikepdf是一个基于Python的库&#xff0c;它允许开发者轻松地读取、写入和…

第四课,接收键盘输入

一&#xff0c;关于基本框架中头文件的作用 头文件就是一个工具箱&#xff0c;C中有很多工具&#xff0c;我们最熟悉的cout就是其中之一 引入头文件&#xff1a;如果你想在你的代码中使用工具箱里的工具&#xff0c;C会很大方的让你用&#xff0c;但前提是你必须在本页代码的最…

为什么 CNC 加工会产生毛刺?

在现代机械加工领域&#xff0c;CNC(计算机数控)加工以其高精度、高效率的特点被广泛应用。然而&#xff0c;在 CNC 加工过程中&#xff0c;毛刺的产生常常是一个令人困扰的问题。时利和将解析为什么 CNC 加工会产生毛刺呢? 一、刀具磨损 刀具在长时间的使用过程中会逐渐磨损。…

如何一步快速去除黑神话悟空图片上的文字?一招教会你

设计师朋友们&#xff0c;如果老板让你用去除海报上的文字&#xff0c;你会怎么做&#xff1f; 用PS的内容识别填充&#xff0c;图片就会变模糊再精修简直太麻烦啦&#xff01; 还好我最近找到一个图片处理神器&#xff0c;一键就能P去图片的文字&#xff01;简单又高效&…

day04-面向对象-常用API时间Arrays

一、常用API 1.1 StringBuilder类 StringBuilder类代表可变的字符串对象&#xff0c;理解为一个操作字符串的容器相对于String来说,比本来的操作效率更高 ​ StringBuilder常用方法public StringBuilder(): 构建一个空的可变字符串对象public StringBuilder(String str): 构建…

vue3中vite基于vite-plugin-html的多入口打包

先看打包效果 1、安装vite-plugin-html 2、配置多个入口 每个入口都要有模板(index.html、App.vue、main.js复制一份&#xff0c;根据实际需求调整三个文件) 3、配置vite.config.js 4、代码片段 import { createHtmlPlugin } from vite-plugin-htmlconst htmlParams {minif…

关于springboot的Rest请求映射处理的源码分析(一)

我们在开发中很常见的一种方式是通过请求的类型&#xff0c;也就是restful风格来区别我们的请求接口。 通过请求类型的不同(GET POST PUT DELETE) 来区分即便是请求路径相同的请求。 但是他的底层是如何支持的呢&#xff0c;明明我请求路径都是/user。就因为类型不同就能区分到…

网络层 III(划分子网和构造超网)【★★★★★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 一、网络层转发分组的过程 分组转发都是基于目的主机所在网络的&#xff0c;这是因为互联网上的网络数远小于主机数&#xff0c;这样可以极大地压缩转发表的大小。…

【Python报错】AttributeError`:`‘NoneType‘ object has no attribute ‘XXXX‘`

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 在Python编程中&#xff0c;AttributeError是一个常见的错误类型&#xff0c;它表示尝试访问的对象没有该属性。本文将探讨…

深度强化学习算法(六)(附带MATLAB程序)

深度强化学习&#xff08;Deep Reinforcement Learning, DRL&#xff09;结合了深度学习和强化学习的优点&#xff0c;能够处理具有高维状态和动作空间的复杂任务。它的核心思想是利用深度神经网络来逼近强化学习中的策略函数和价值函数&#xff0c;从而提高学习能力和决策效率…

CNN网络的一些基本知识

CNN 网络的layer介绍 在卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;中&#xff0c;往往包含许多种不同的网络层交替组成&#xff0c;主要有卷积层&#xff08;Convolutional Layer&#xff09;、池化层&#xff08;Pooling Layer&#…

《黑神话:悟空》爆火,对程序员的 5 点启示(2)

前言 继续上篇未完章节…… 4. 需求捕捉 需求有真需求和伪需求的区别&#xff0c;捕捉和理解用户的真需求对于产品非常重要。 在《黑神话&#xff1a;悟空》面世以后&#xff0c;很多玩家都不吝称赞&#xff0c;有玩家这么评论&#xff1a; 不吹牛逼&#xff0c;这一段我眼…

C#中通过TabControl控制MDI子窗体显示切换的实现过程

类似excel表格中各个表单sheet的切换效果&#xff0c;使用tabcontrol控件实现类似的功能。效果如下&#xff1a; 过程涉及父窗体MDIParent1、子窗体main、自定义基础功能类MdiChildBase。 基础功能类MdiChildBase继承自Form创建&#xff0c;定义了一个委托SetTabControlDelega…

apisix 本地开发环境部署

apisix 本地开发环境部署 本地开发环境部署可以采用 docker-compose 部署&#xff0c;配置文件如下 apisix 配置文件 apisix:node_listen: 9080 # APISIX 节点监听地址enable_ipv6: falsehttp:port: 9080 # APISIX HTTP 端口#https:# port: 9443 # APISIX HTTPS 端口# ssl…

《机器学习》K-means 聚类 原理、参数解析、案例实现

1. 引言 随着数据的快速增长和复杂性的不断提高,如何从大量数据中提取有用信息已成为数据科学和人工智能领域的核心挑战。聚类作为一种无监督学习方法,通过将数据分为若干组,使得同一组内的样本具有较高的相似性,而不同组之间的样本差异显著。这种方法被广泛应用于数据分析…