Java基础-面向对象总结(2)

news2024/11/27 19:47:35

这篇文章主要讲解 Java中的

  • 变量
  • 方法
  • 代码块
  • 访问修饰限定符
  • Java 是值传递,还是引用传递?
  • 类和对象的生命周期.
  • ....

希望给您带来帮助

目录

变量

成员变量与局部变量的区别

静态变量和实例变量的区别?静态方法、实例方法呢?

可以在static环境中访问非static变量吗? 为什么 ? 

方法

构造方法

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

构造方法有哪些特点?是否可被 override?

为什么 构造方法不可以被重写,但是可以被重载 ? 

讲一讲私有的构造方法

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

父类的静态方法能否被子类重写(能用Java覆盖静态方法吗?如果我在子类中创建相同的方法是编译时错误?)

重写和重载的区别

什么是方法的返回值?返回值在类的方法里的作用是什么?

代码块

实例代码块

静态代码块

代码块和构造方法的(执行/初始化)顺序

访问修饰限定符

Java 是值传递,还是引用传递?

类和对象的生命周期


变量

成员变量与局部变量的区别

  • 语法区别

成员变量是属于对象的,定义在类的内部的,而局部变量是定义在方法内部,或者是作为方法的参数.成员变量可以被public,private,protected,static所修饰,而局部变量不可以.但是成员变量和局部变量都是可以被final所修饰的.

  • 存储方式区别

成员变量如果是被static修饰,那么该成员变量属于类 .如果没有被static修饰,那么该成员变量属于对象. 都是存放在堆内存中的,局部变量如果类型是基本数据类型,那么存储在栈内存中,如果是引用数据类型,存放在栈内存的是指向对象的引用地址/指向常量池对象的地址.

  • 生命周期区别

对于成员变量,随着对象的创建而创建,销毁而销毁.局部变量随着方法的调用而结束

  • 初始值

成员变量会有初始值,而局部变量没有初始值.

静态变量和实例变量的区别?静态方法、实例方法呢?

静态变量与实例变量

  • 实例变量/成员变量属于对象,必须创建对象才能调用实例变量(对象.实例变量), 而静态变量被static修饰属于类,调用静态变量使用类.静态变量
  • 实例变量/成员变量存放在堆内存中,静态变量存放在方法区中
  • 静态变量在类加载时就会被分配存储空间,而实例变量是在创建时才被分配存储空间

静态方法与实例方法

  • 静态方法属于类,实例方法属于对象
  • 静态方法类加载的时候初始化,实例方法在创建对象的时候初始化
  • 实例方法需要通过对象.实例方法来调用, 静态方法既可以使用对象.静态方法(),也可以使用类.静态方法.
  • 实例方法既可以调用静态成员,也可以调用实例成员,而静态方法只可以调用静态成员
  • 实例方法可以被重写,静态方法不可以被重写.

可以在static环境中访问非static变量吗? 为什么 ? 

静态方法中只能调用静态成员,不能调用实例成员,因为被static修饰的是在类加载的时候就初始化了,但是实例成员必须在创建对象的时候才会被初始化,实例成员要比静态成员出现的时机更晚一些.

  • 静态方法是属于类的,在类加载的时候就会分配内存,可以通过类名直接访问。而非静态成员属于实例对象,只有在对象实例化之后才存在,需要通过类的实例对象去访问。
  • 在类的非静态成员不存在的时候静态方法就已经存在了,此时调用在内存中还不存在的非静态成员,属于非法操作。

字符型常量和字符串常量的区别?

  • 形式 : 字符常量是单引号引起的一个字符,字符串常量是双引号引起的 0 个或若干个字符。
  • 含义 : 字符常量相当于一个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表一个地址值(该字符串在内存中存放位置)。
  • 占内存大小:字符常量只占 2 个字节; 字符串常量占若干个字节。

char 在 Java 中占两个字节。


方法

构造方法

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

构造方法主要是为对象进行初始化的(为对象的属性赋值);

另外创建对象的时候包含3步

  • 为对象分配内存空间
  • 调用对象构造方法为对象初始化
  • 给对象的属性(实例变量)赋值

所以构造方法的调用是创建对象的一部分,在Java中初始化和创建两者不能分离.创建对象的时候就会自动调用构造方法(由编译器自动调用).

如果一个类没有声明构造方法,编译器会自动为该类生成一个无参的构造方法,确保每一个对象进行初始化. 当然如果一个类本身就有构造方法,那么编译器就不会为其自动生成了.

构造方法有哪些特点?是否可被 override?

  • 构造方法的名字必须与类名相同

因为要让编译器找到这个构造方法,并且还不能与其他成员命名冲突,所以与类名相同

  • 构造方法没有返回值

如果具有返回值,那就得让编译器知道如何处理这个返回值

  • 构造方法是在创建对象的时候由编译器执行,无需/不能手动调用
  • 构造方法不可以被重写,但是可以被重载.

为什么 构造方法不可以被重写,但是可以被重载 ? 

首先方法重写是针对子类重写父类的方法. 但是构造方法的名称必须与类名相同,如果允许子类重写父类的构造方法,那么子类的类名必须与父类的类名是一致的, 矛盾,不成立.

而对于方法重载是针对同一个方法名的,我们已经成看到一个类中有多个构造方法(不同参数的);

讲一讲私有的构造方法

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

因为子类也继承了父类的成员,所以是帮助子类进行初始化

父类的静态方法能否被子类重写(能用Java覆盖静态方法吗?如果我在子类中创建相同的方法是编译时错误?)

首先说一下结论,子类不能重写父类的静态方法(不能重写静态方法),因为静态方法是属于类的,无论在父类还是在子类,静态方法的行为是一致的,都是属于这个类本身的,如果子类定义了与父类相同名字,返回值,参数列表的静态方法,这并不是重写,而是在子类新定义了一个静态方法. 

如果子类创建了相同的实例方法 : -->代表是重写

如果子类创建了相同的静态方法 :只是新定义了一个静态方法,不会报错, 因为静态方法属于类本身的.不会发生编译时错误.

重写和重载的区别

  1. 重载就是同样的一个方法根据输入数据的不同,做出不同的结果

  2. 重写就是当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法

重载 :

在同一个类中,多个方法具有相同的名称,但是参数列表不同,这样的不同参数的方法,互相称之为重载方法

重载条件 :

  • 相同的方法名称
  • 不同的参数列表
  • 被重载的方法可以改变返回类型
  • 被重载的方法可以改变访问修饰符
  • 被重载的方法可以声明新的或者更广的异常
  • 方法能够在同一个类或者一个子类中被重载
  • 发生在编译器

怎么实现方法重载的 ?(根据什么来区分不同的方法的?)

编译器必须挑选出具体执行哪个方法,它通过用各个方法给出的参数类型与特定方法调用所使用的值类型进行匹配来挑选出相应的方法。 如果编译器找不到匹配的参数, 就会产生编译时错误, 因为根本不存在匹配, 或者没有一个比其他的更好(这个过程被称为重载解析。

Java 允许重载任何方法, 而不只是构造器方法。

编译器是根据方法签名(根据方法名称,参数顺序,参数类型来确定)来确定具体调用哪个方法.(区分方法)

重写:

重写是指在Java的子类与父类中,有两个名称相同并且参数列表相同的方法,由于他们具有相同的方法签名,所以子类的新方法将会覆盖父类中原有的方法

  1. 方法名,参数列表必须相同. 子类方法返回值类型应该比父类方法返回值类型更小或者相等. 抛出的异常范围小于父类. 访问修饰符范围大于等于父类. (方法的返回类型是void和基本数据类型,返回值重写时不可以修改,如果方法是引用类型,重写时是可以返回该引用的子类或者与父类返回值相同)

  2. 如果父类方法访问修饰符为 private/final/static, 则子类就不能重写该方法,但是被static修饰的方法能够被再次声明.

  3. 构造方法无法被重写

  4. 如果不能继承一个方法,就不能重写这个方法

  5. 发生在运行期

重写就是子类对父类方法的重新改造,外部样子不能改变,内部逻辑可以改变.

什么是方法的返回值?返回值在类的方法里的作用是什么?

方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能产生结果)。返回值的作用:接收出结果,使得它可以用于其他的操作!

代码块

实例代码块

  • 实例代码块优先于构造方法先执行。 从字节码的角度看,编译器是把实例代码块的代码拷贝到构造方法之前编译。
  • 当没有创建对象的时候,实例代码块和构造方法不会被执行。(实例代码块只有在创建对象时才会执行)

静态代码块

  • 代码块执行顺序是 静态代码块优先于实例代码块优先于构造方法执行。
  • 静态代码块只保留一份。这证明当有多个static代码块时会根据优先顺序执行,初始化结果会发生覆盖,后面的覆盖前面的。
  • 静态代码块不管生成多少个对象,其只会执行一次

代码块和构造方法的(执行/初始化)顺序

初始化顺序:父类静态代码块>子类静态代码块>父类实例代码块>父类构造方法>子类实例代码块>子类构造方法。如果是第二次实例化对象,那就没有静态代码块。

访问修饰限定符

Java 中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。

  • default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。可以修饰在类、接口、变量、方法。
  • private : 在同一类内可见。可以修饰变量、方法。注意:不能修饰类(外部类)
  • public : 对所有类可见。可以修饰类、接口、变量、方法
  • protected : 对同一包内的类和所有子类可见。可以修饰变量、方法。注意:不能修饰类(外部类)

Java 是值传递,还是引用传递?

无论是值传递还是引用传递都是求值策略(定义以何时,何种顺序传值给函数的实际参数,以及什么时候将他们带入到函数,代还以何种形式发生)的一种

除了引用传递,值传递,还有共享对象传递

值传递是指在调用函数的时候把实际参数复制一份传到这个调用的函数中,如果这个函数对参数进行修改,将不会影响到实际参数.(形参是实参的一份临时拷贝)(先通过求值,,再将值赋值,传递给被调函数的形式参数)

引用传递是指调用函数的时候把实际参数的地址传递到这个调用的函数中,如果这个函数对参数进行修改,因为实际参数引用与副本引用指向的是同一个对象,所以会影响到实际参数.

共享对象传递 : 先获取实际参数的地址,然后将其复制,并把地址的副本传递给被调函数的形式参数.也是值传递的一种特例.

区分值传递还是引用传递主要是看传递给方法的是实际参数的副本还是实际参数的地址(传递的是副本还是直接传递).如果传递的是副本就是值传递,否则就是引用传递.

Java中求求值策略是共享对象传递(值传递).(实参和形参指的是同一个共享对象)

对于Java只是把对象的引用当做值  传递给方法, 也可以理解为是一种共享对象传递(是值传递的一种特例.) Java会将对象的地址的副本传递给方法

所以, Java中只有值传递,只不过传递的内容是对象的引用.

Java 值传递详解 | JavaGuide(Java面试 + 学习指南)

类和对象的生命周期

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

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

相关文章

数据分析06——Pandas中的数据抽取

1、前言: 在Pandas中进行数据抽取主要有两种方法,一种是loc方法,一种是iloc方法;在获取数据时可以获取的数据有三种形式,一种是Series类型,一种是DataFrame类型,还有一种是直接获取数据值&…

Nginx make报错处理

文章目录 make报错:fatal error:sys/sysctl.h:No such file or directory问题处理 make 报错:error: this statement may fall through [-Werrorimplicit-fallthrough]问题处理 make报错:error: struct crypt_data has no member named curre…

DCGAN--Keras实现

文章目录 一、Keras与tf.keras?二、keras中Model的使用三、使用Keras来实现DCGan1、导入必要的包2.指定模型输入维度:图像尺寸和噪声向量 的长度3、构建生成器4、构造鉴别器5、构建并编译DCGan6、对模型进行训练7、显示生成图像8、运行模型 总结 一、Ker…

力扣sql中等篇练习(二十)

力扣sql中等篇练习(二十) 1 寻找面试候选人 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 # 分为以下两者情况,分别考虑,然后union进行处理(有可能同时满足,需要去进行去重) # ①该用户在 三场及更多…

软件测试八股文,软件测试常见面试合集【附答案】

PS:加上参考答案有几十万字,答案就没有全部放上来了,高清打印版本超过400多页,评论区留言直接获取 1、你的测试职业发展是什么? 2、你认为测试人员需要具备哪些素质 3、你为什么能够做测试这一行 4、测试的目的是什么? 5、测…

一图看懂 attrs 模块:一个在类定义时可替换 `__init__`, `__eq__`, `__repr__`等方法的样板,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 attrs 模块:一个在类定义时可替换 __init__, __eq__, __repr__等方法的样板,资料整理笔记(大全) 🧊摘要&#x1…

吴恩达|chatgpt 提示词工程师学习笔记。

目录 一、提示指南 写提示词的2大原则: 模型的限制 二、迭代 三、总结 四、推断 五、转换 六、扩展 七、对话机器人 吴恩达和openai团队共同开发了一款免费的课程,课程是教大家如何更有效地使用prompt来调用chatgpt,整个课程时长1个…

ctfshow周末大挑战2023/5/12

本周周末大挑战用到的函数讲解 parse_url() 作用:解析URL,返回其组成部分 语法: parse_url ( string $url [, int $component -1 ] ) 参数: url:要解析的 URL。无效字符将使用 _ 来替换。 component: …

Sentinel———隔离和降级

FeignClient整合Sentinel SpringCloud中,微服务调用都是通过Feign来实现的,因此做客户端保护必须整合Feign和Sentinel。 第一步 修改OrderService的application.yml文件,开启Feign的Sentinel功能(消费者服务) feig…

算法基础第二章

算法基础第二章 第二章:数据结构1、链表1.1、单链表(写邻接表:存储图和树)1.2、双链表(优化某些问题) 2、栈与队列2.1、栈2.1.1、数组模拟栈2.1.2、单调栈 2.2、队列2.2.1、数组模拟队列2.2.2、滑动窗口(单调队列的使用…

操作系统实验二 进程(线程)同步

前言 实验二相比实验一难度有所提升,首先得先掌握好相应的理论知识(读者-写者问题和消费者-生产者问题),才能在实验中得心应手。任务二的代码编写可以借鉴源码,所以我们要先读懂源码。 1.实验目的 掌握Linux环境下&a…

linux系统状态检测命令

1、ifconfig命令 用于获取网卡配置于状态状态的等信息: ens33:网卡名称 inet:ip地址 ether:网卡物理地址(mac地址) RX、TX:接收数据包与发送数据包的个数及累计流量 我们也可以直接通过网卡名称查对应信息: 2、查看系统版本的…

设计模式 - 工厂 Factory Method Pattern

文章参考来源 一、概念 创建简单的对象直接 new 一个就完事,但对于创建时需要各种配置的复杂对象例如手机,没有工厂的情况下,用户需要自己处理屏幕、摄像头、处理器等配置,这样用户和手机就耦合在一起了。 可以使代码结构清晰&a…

【人工智能】— 贝叶斯网络

【人工智能】— 贝叶斯网络 频率学派 vs. 贝叶斯学派贝叶斯学派Probability(概率):独立性/条件独立性:Probability Theory(概率论):Graphical models (概率图模型)什么是图模型(Grap…

【每日一题/哈希表运用题】1054. 距离相等的条形码

⭐️前面的话⭐️ 本篇文章介绍【距离相等的条形码】题解,题目标签【哈希表】, 【贪心】,【优先级队列】,展示语言c/java。 📒博客主页:未见花闻的博客主页 🎉欢迎关注🔎点赞&#…

【计算机网络复习】第四章 网络层 2

源主机网络层的主要工作 路由器网络层的主要工作 目的主机网络层的主要工作 网络层提供的服务 o 屏蔽底层网络的差异,向传输层提供一致的服务 虚电路网络 o 虚电路网络提供面向连接的服务 n 借鉴了电路交换的优点 n 发送数据之前,源主机和目的主机…

MTK耳机识别

MTK耳机检测分为Eint only和EintAccdet 其中主流的是Eint Accdet(multi-key)。 图为MTK 耳机相关电路图的主要部分。 其中,左右声道的33pF主要滤除TDD干扰。串的10R100nf下地电容为低通滤波器。磁珠主要影响的是Fm以及音频THD性能。 Eint:检测耳机是否…

网络基础知识(3)——初识TCP/IP

首先给大家说明的是,TCP/IP 协议它其实是一个协议族,包含了众多的协议,譬如应用层协议 HTTP、 FTP、MQTT…以及传输层协议 TCP、UDP 等这些都属于 TCP/IP 协议。 所以,我们一般说 TCP/IP 协议,它不是指某一个具体的网络…

Casdoor 开始

Casdoor 是一个基于 OAuth 2.0 / OIDC 的中心化的单点登录(SSO)身份验证平台,简单来说,就是 Casdoor 可以帮你解决用户管理的难题,你无需开发用户登录、注册等与用户鉴权相关的一系列功能,只需几个步骤进行…

C++多线程中共享变量同步问题

目录 1、互斥量 (1)std::mutex (2)std::recursive_mutex (3)std::timed_mutex 2、锁管理器 (1)std::lock_guardlk (2)std::unique_locklk &#xff0…