java基础郎波版chapter4习题

文章目录

    • 1.试说明Java语言是如何支持多重继承的。
    • 2.类的构造方法和成员方法之间有什么区别?
      • 构造方法:
      • 成员方法:
    • 3.编写程序片段,定义表示课程的类Course。
    • 4.编写程序创建习题3中的Course类的对象,设置并打印输出该对象的课程名、编号以及先修课号。
    • 5.Java中方法调用的参数传递方式是什么?
      • 基本类型参数:
      • 引用类型参数:
    • 6.this 关键字的作用是什么?
    • 7.一个类中的方法,要使同一个包中的类可以访问而其他类不能访问,应该使用怎样的访问控制?
    • 8.什么是方法重载?方法重载的规则是什么?
    • 9.什么是方法重写?方法重写的规则是什么?
    • 10.试说明Java语言中多态的含义及实现机制
    • 11.给出下列程序的运行结果。

1.试说明Java语言是如何支持多重继承的。

JAVA不直接支持多重继承,以避免多继承带来的复杂性和潜在的“菱形问题”。但是Java通过接口(interface)实现了多重继承的概念。一个类可以实现多个接口,从而实现多个接口中的抽象方法,达到多重继承的效果。

2.类的构造方法和成员方法之间有什么区别?

构造方法:

主要用于初始化对象,具有与类名一样的名称,没有返回类型,即使是void也不需要。在创建对象时自动调用,可以有参数列表

成员方法:

也称为实例方法,是类的一部分,用于定义对象的行为或操作数据。有具体的返回类型,可以在类中的任何地方被调用。

3.编写程序片段,定义表示课程的类Course。

课程的属性包括课程名、编号、先修课号;
方法包括设置课程名、设置编号、设置先修课号以及获取课程名、获取编号、获取先课号。

package com.example.demo.chapter;/*** @author zyk* @date 2024/4/30 上午7:18* @return*/
public class Course {private String courseName;private int courseId;private String firstCourseName;public Course(String courseName, int courseId, String firstCourseName){this.courseName = courseName;this.courseId = courseId;this.firstCourseName = firstCourseName;}public String getCourseName() {return courseName;}public void setCourseName(String courseName) {this.courseName = courseName;}public int getCourseId() {return courseId;}public  void setCourseId(int courseId) {this.courseId = courseId;}public String getFirstCourseName() {return firstCourseName;}public void setFirstCourseName(String firstCourseName) {this.firstCourseName = firstCourseName;}public void printCourse(){System.out.println("课程名称:"+courseName+"课程编号:"+courseId+"课程名称:"+firstCourseName);}public static void main(String[] args) {Course course = new Course("java",1,"java");System.out.println("course = " + course);System.out.println("course.getCourseName() = " + course.getCourseName());course.setCourseName("zhengyangkang");System.out.println("course.getCourseName() = " + course.getCourseName());}@Overridepublic String toString() {return "Course{" +"courseName='" + courseName + '\'' +", courseId=" + courseId +", firstCourseName='" + firstCourseName + '\'' +'}';}
}

注意,如果这里没有添加toString(),既没有重写tostring函数,则打印出来是这样的形式
在这里插入图片描述
Java中,当你尝试打印一个对象(而非基本类型)时,如果没有重写toString()方法,那么默认会调用Object类的toString()方法。这个方法返回的是对象的类名加上@,然后是对象哈希码的十六进制表示
在这里插入图片描述

在这个例子中,course是一个Course对象,所以course.toString()的结果是"com.example.demo.chapter.Course@79fc0f2f"。这里的部分解释如下:
com.example.demo.chapter.Course:这是Course类的全限定类名(包名+类名)。
@:分隔符,表示接下来的部分是对象的哈希码。
79fc0f2f:这是对象在内存中的地址(或者说是哈希码),以十六进制形式表示。这个值是唯一的,除非两个对象在内存中的位置相同,否则不同的对象会有不同的哈希码。
如果你希望在打印对象时显示更有意义的信息,你可以为Course类重写toString()方法,返回自定义的字符串表示。例如:

加上重写的tostring()后,则再次打印就会出现

@Override
public String toString() {return "Course{" +"courseName='" + courseName + '\'' +", courseId=" + courseId +", firstCourseName='" + firstCourseName + '\'' +'}';
}

在这里插入图片描述
这是具体的类信息的,不再是内存地址。

4.编写程序创建习题3中的Course类的对象,设置并打印输出该对象的课程名、编号以及先修课号。

java里面的main函数就和C里面的main函数一样的。想要执行必须到main函数里面来。只不过这里的

不是的,不是每一个Java类都必须包含一个main函数。main函数是Java程序的入口点,只有包含main函数的类才能被Java虚拟机(JVM)直接执行。当你运行一个Java程序时,你需要指定包含main方法的类,JVM会从这个main方法开始执行代码。

如果你编写的是一个库或者一个类,这些类通常不会包含main方法,因为它们的作用是为了被其他类调用,而不是直接运行。例如,你可能会定义一些工具类、数据结构类或业务逻辑类,这些类内部的方法是为了提供服务或实现特定功能,而不是作为程序的起点。
所以,是否包含main方法取决于类的设计和用途。如果一个类是用来启动一个独立的应用程序,那么它需要main方法;如果是用来作为组件或服务给其他类使用,那么就不需要main方法。

5.Java中方法调用的参数传递方式是什么?

在Java中,参数传递总是遵循“按值传递”的原则,无论参数是基本类型还是引用类型。这意味着:

基本类型参数:

当传递基本类型的参数(如int、double、char等)时,方法接收到的是这些变量值的一个副本。这意味着在方法内部对这些参数的任何修改都不会影响到方法外部的基本类型变量。例如,如果一个方法接收一个int类型的参数,它在方法内部增加该参数的值,这种方法调用结束后,原始变量的值保持不变。

引用类型参数:

对于对象参数,情况稍微复杂一些。虽然也是按值传递,但传递的是对象引用的一个副本,而不是对象本身。这意味着方法得到的是原始对象引用的一个拷贝,这个拷贝和原始引用指向相同的对象实例。
因此,如果在方法内部通过引用修改对象的属性(比如对象的字段),这些修改会反映到原始对象上,因为它们都是指向同一个对象实例。例如,如果一个方法接收一个String类型的对象参数,它在方法内部更改该字符串的内容,这种方法调用结束后,外部访问该对象也会看到内容的变化。

但是,如果在方法内部重新赋值给这个引用(例如,让这个引用指向一个新的对象),这个改变只发生在方法内部,不会影响到外部的引用,也就是说,外部的引用仍然指向原来的对象。
总结来说,Java中的参数传递保证了方法内部的操作不会影响到外部变量的直接引用,但对于对象,由于引用的传递,可以影响到共享的同一对象实例的状态。

下面这段代码解释了传递参数为对象的情况

class Student {String name;public Student(String name) {this.name = name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +'}';}
}public class ParameterPassingExample {public static void main(String[] args) {Student originalStudent = new Student("Alice");System.out.println("Before method call: originalStudent = " + originalStudent);modifyStudent(originalStudent);System.out.println("After method call: originalStudent = " + originalStudent);}public static void modifyStudent(Student student) {// 改变对象的属性,这会影响外部的originalStudent,因为它们指向同一个对象student.setName("Bob");System.out.println("Inside method: student after setName = " + student);// 重新赋值引用,让student指向一个新的对象student = new Student("Charlie");System.out.println("Inside method: student after reassignment = " + student);}
}

在这里插入图片描述

可以看到,尽管在方法内部student引用被指向了一个新对象,但外部的originalStudent对象保持未变,仍然是名字为"Bob"的学生对象。这证明了虽然对象引用是按值传递的,但通过引用修改对象状态会影响到外部,而直接改变引用本身的指向则不会。(student只是一个存在于栈中的变量而已)

6.this 关键字的作用是什么?

this关键字在Java中代表当前对象的引用,它可以用来访问当前对象的成员变量、调用当前对象的方法,或者在构造函数中引用当前类的其他构造函数。

7.一个类中的方法,要使同一个包中的类可以访问而其他类不能访问,应该使用怎样的访问控制?

如果一个类中的方法要让同一包内的其他类可以访问,但不允许包外的类访问,应该使用protected访问修饰符。protected比private更开放,但比public更限制,只允许同包内和子类访问

8.什么是方法重载?方法重载的规则是什么?

方法重载是指在同一个类中可以有多个同名方法,但这些方法的参数列表必须不同(即参数的数量、类型或顺序不同)。
返回类型不是区分重载方法的关键因素,因为调用方法是基于传入的参数,而不是返回类型

9.什么是方法重写?方法重写的规则是什么?

方法重写发生在子类中,子类提供与父类同名且参数列表完全相同的方法
重写的方法必须有相同的返回类型,名字和参数列表。
访问权限不能更低,可以更高,但不能是private
方法的访问修饰符、返回类型、参数列表和抛出的异常必须与被重写的方法匹配。
子类方法必须声明为@Override(可选,但推荐),以确保是故意重写父类方法

10.试说明Java语言中多态的含义及实现机制

多态是指一个接口可以有多种不同的行为,或者一个对象可以表现出多种形态。
在Java中,多态分为编译时多态(通过方法重载实现)和运行时多态(通过方法重写和接口实现实现)。
运行时多态是通过引用父类类型的对象来调用子类的方法,这依赖于对象的实际类型(动态绑定)。
实现多态的关键是面向对象的特性:继承、抽象类和接口,以及方法的重写和重载。

11.给出下列程序的运行结果。

package com.example.demo.chapter;/*** @author zyk* @date 2024/4/30 上午8:48* @return*/
class Meal {Meal(){System.out.println("Meal( )"); }
}class Bread {Bread(){ System.out.println("Bread()");}};class Cheese {Cheese(){System.out.println("Cheese()");}}class Lettuce {Lettuce() {System.out.println("Lettuce()");}}class launch extends Meal {launch() {System.out.println("Lunch()");}
}class PortableLunch extends launch {PortableLunch() {System.out.println("PortableLunch()");}}public class Sandwich extends PortableLunch {private Bread b = new Bread();private Cheese c = new Cheese();private Lettuce l = new Lettuce();public Sandwich() {System.out.println("Sandwich()");}public static void main(String[] args){new Sandwich();}}

在这里插入图片描述
先将父类的该打印的打印出来,自身的再议

比如这里的Sandwich类,集成的portableLaunch类,而portableLaunch类又继承自Launch类,而Launch又继承自meal类,所以就是最先打印的是Meal,再是lunch,再是portableLunch,最后再是从自身向下打印,包括字段的对象,自身的构造函数等等……

这里还需注意一点就是,多个类可以在同一个.java文件夹之下,但是文件夹名称必须是public的类的名称
比如这里就是Sandwich.java。不然会报错。

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

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

相关文章

Python数组类+AI插件

目录 规划实现初始化插入删除查找 AI插件单测注释调优建议 小结 规划 先想清楚都写哪些,然后再动手操作 用Python写了一个简单数组类,首先思考下都写哪些功能: 插入删除查找用插件做单元测试和写注释 目的只是实现一个简单的数组类&#x…

ffplay支持mac/iOS硬解码实践

1. ffmpeg编译开启videotoolbox的支持。 ./configure --enable-videotoolbox --enable-hwaccels 2. stream_component_open方法中开启硬件解码器。 int FSPlay::stream_component_open(VideoState *is, int stream_index) {//...codec avcodec_find_decoder(avctx->code…

Python自学篇3-PyCharm开发工具下载、安装及应用

一、Python开发工具 自学篇1中讲到了安装Python之后出现的几个应用程序,其中IDLE、Python.exe都可以用来编写python程序,也可以进行调试;但是比较基础,比较原始,调试不方便,界面也不友好,需要更…

Unity List底层源码剖析

文章目录 前言一、List源码二、Add接口三、Remove接口四、Insert接口五、其他接口1、[]接口2、Clear接口3、Contains接口4、ToArray接口5、Find接口6、Enumerator接口7、Sort接口 六、线程安全总结 前言 没有扎实的基础,很多编写的程序会随着软件规模的扩大或扩展而…

(06)vite与ts的结合

文章目录 系列全集package.json在根目录创建 tsconfig.json 文件在根目录创建 vite.config.ts 文件index.html额外的类型声明 系列全集 (01)vite 从启动服务器开始 (02)vite环境变量配置 (03)vite 处理 c…

R语言 数据整理篇之结构重塑

《Cookbook for R》Manipulating Data ~ Restructuring 数据整理篇之数据结构重塑 Converting between data frames and contingency tables 在数据框和列联表之间转换 表示同样的内容但是三种不同的表现形式: 1、呈现个案观测值的数据框 cases :每行代…

【报错】Could not autowire. No beans of ‘SysUserRoleService‘ type found

1.查看对应service层是否添加Service 2.可以修改成Resource注入, Autowired和Resource区别一个是默认按照类型,一个默认按照名字 3.解决办法是:降低Autowired检测的级别,将Severity的级别由之前的error改成warning或其它可以忽略…

【C++干货基地】探索C++模板的魅力:如何构建高性能、灵活且通用的代码库(文末送书)

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 哈喽各位铁汁们好啊,我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发,不知道各位的…

http1.1和http2.0的同源请求数限制

判断协议版本 :scheme: 在请求头中表示使用的是HTTP/2协议。即 出现 :开头的请求头Chrome 只支持查看 HTTP/1.x 的 Raw Headers,对这种请求,会给出 view source 选项。HTTP2.0不给出。可继续学习 https://www.cnblogs.com/kirito-c/p/10360868.html抓包…

App在某个页面静止造成卡死假象

今天遇到一个bug记录下来,供后续积累经验。 预期结果:App在冷启动时会加载一个“广告页”,“广告页”有个定时器,定时器结束后会自动跳转到App首页;然而当用户开启指纹或人脸识别登录之后,App直接进入验证界面,验证通过后直接进入App首页。 bug场景:进入App需要指纹识别…

用什么模型算法可以预测足球胜平负

预测足球胜平负的模型算法有很多种,每种算法都有其特点和适用场景。以下是一些常见的模型算法: Elo预测法: 这是一种通过研究主客场球队在比赛前的积分情况来预测胜负的方法。Elo预测法通过计算两队之间的积分差,根据特定的公式&…

uTorrent Pro一款轻量级的Torrent磁力下载工具去广告绿色版 v3.6.0.47044

01 uTorrent Pro v3.6.0.47044 Torrent是一款俄罗斯号称全球排名第一的免费BT下载工具,海外最受欢迎的BT下载客户端软件。支持UPnP,支持流行的 BT 扩展协议,磁力链接(Magnet Links),IPv6,用户来源交换,DHT和uTP&#…

【python】python基础-常用方法

通用方法: del obj:删除对象,不能删除可变对象的元素 li [1,2,3,4,5] del li :删除列表 del li[0]:删除列表中第一个元素 max(obj):返回对象中的最大值 字符串方法: 语法:字符串.方法名([参数]) str.upper():将字符…

计算机科学与技术就业方向和前景怎么样

计算机科学与技术专业的就业方向极为广泛,方向可以是软件开发与工程、网络与信息安全、数据科学与大数据分析等,几乎渗透到现代社会的每一个角落。以下是上大学网 (www.sdaxue.com)对计算机科学与技术专业一些主要的就业方向及其前景分析&…

ROS2安装问题记录

0. import rclpy出错 安装ros2官网上的教程安装完,发现colcon build后可以通过ros2 run 运行,但是无法通过python直接运行.py文件,原因是在 import rclpy的情况下会报以下错误 The C extension /opt/ros/humble/lib/python3.10/site-packag…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-8.1--C语言LED驱动程序

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

流水线工作流程

java编译命令: java -jar xxx.jar (其它参数已忽略) docker镜像构建命令: docker build -t [镜像名称:latest] -f 指定[Dockerfile] [指定工作目录] 推送镜像 jenkinsfile: 主要流程登录镜像仓库,打包镜像,推送到镜像仓库

情感类ppt素材

小清新手绘插画风毕业季毕业相册同学录画册纪念册PPT下载 - 觅知网这是一张关于清新毕业相册的PPT模板,清新风格设计,加上风为装饰元素,包含毕业相册、毕业季、毕业、同学、纪念等主题内容,也可用作毕业相册PPT、毕业季PPT、毕业P…

Springboot+Vue项目-基于Java+MySQL的校园疫情防控系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

蓝桥杯如何准备国赛?

目录 一、赛前准备 1、如何刷题,刷哪些题? 2、记录(主要看个人习惯) CSDN博客 写注释 3、暴力骗分 4、从出题人的角度出发,应该如何骗分 二、赛中注意事项 一、赛前准备 1、如何刷题,刷哪些题&…