当前位置: 首页 > news >正文

第02周 预习、实验与作业:Java基础语法2、面向对象入门

集美大学课程实验报告-第02周 预习、实验与作业:Java基础语法2、面向对象入门

项目名称 内容
课程名称 数据结构
班级 网安2413
指导教师 郑如滨
学生姓名 林沁茹
学号 202421336067
实验项目名称 第02周 预习、实验与作业:Java基础语法2、面向对象入门
上机实践日期
上机实践时间 2学时

一、目的(本次实验所涉及并要求掌握的知识点)

以下内容请根据实际情况编写

  • 了解java中方法、数组、引用数据类型
  • 掌握面向对象基础 ”基本概念、封装与模块化、对象的初始化

二、课前问题解答

题目1—方法相关问题

public class Main {static void changeStr(String x) {x = "xyz";}static void changeArr(String[] strs) {for (int i = 0; i < strs.length; i++) {strs[i] = strs[i]+""+i;}}public static void main(String[] args) {    String x = "abc";changeStr(x);System.out.println(x);changeArr(args);System.out.println(Arrays.toString(args));}
}

对于如上代码:
1.1 changeStr与changeArr的功能各是什么?
1.2 main方法的x有没有被改变?为什么?
1.3 main方法的args数组的内容有没有被改变?为什么?
1.4 args数组中的值是从哪里来的?要怎么才能给他赋值。

1.1changeStr:该方法接收一个String类型的参数x,并在方法内部将x的值修改为"xyz"。(由于String在Java中是不可变的,且Java是按值传递的,因此该方法实际上不会修改调用者传入的原始String对象的值,实际上是新建一个对象来存储,且使x指向该地址)changeArr:该方法接收一个String数组strs,然后遍历数组中的每一个元素,并在每个元素后面拼接上当前元素的索引i。(由于数组是引用类型,方法内部操作的是原始数组对象的引用副本,因此对数组元素的修改会直接影响调用者传入的原始数组)
1.2 
main方法的x没有被改变,因为Java 是按值传递,changeStr(x) 传递的是x的引用地址(即x指向的字符串 "abc" 的地址)在changeStr 方法内部,x="xyz"; 只是让局部变量 x 指向了一个新的字符串对象 "xyz"的地址,而不会影响 main方法中的原始变量x。因此,main 方法中的 x 仍然指向原来的字符串 "abc",输出结果为 abc。
1.3 
main方法的args数组的内容有被改变,因为args是一个String数组,属于引用类型。changeArr(args)传递的是 args 数组的引用地址,这个地址指向的仍然是原始数组对象。在changeArr方法内部,通过strs[i]=strs[i]+""+i; 修改了数组元素的值,由于strs和args实际指向的是同一个数组对象地址,因此修改会直接反映到main方法的args数组上。
1.4
来源:args是main方法的参数,表示命令行参数。
赋值:当我们在命令行(或终端)中运行程序时,可以在类名后面传入参数,这些参数会被自动解析为String数组并传递给main方法的args。

题目2—题目数组相关问题

对于如下程序

int[] arr = new int[3];
arr[0] = 1; arr[1] = 1;
int[] arrX = arr;
arr[0] = 2;
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(arrX));

2.1 这段程序输出结果是什么?为什么?

String[] strArr = {"aa","bb","cc"};
strArr[1] = "xx";
System.out.println(Arrays.toString(strArr));

2.2 字符串是不可变类,为什么可以对strArr[1]赋值"xx"。

2.1
[2,1,0]
[2,1,0]
数组arr和arrX存储的是数组对象的引用(地址),而不是数组本身,int[] arrX = arr这行代码并没有创建新的数组,而是让arrX指向arr所引用的同一个数组对象,修改arr的同时也是在修改arrX。
2.2
String的不可变性,指的是String对象本身的内容不能被修改。数组本身是可变的,我们可以修改数组中元素的引用。strArr[1] = "xx"; 并不是修改原字符串"bb",而是让数组的第二个元素指向一个新的字符串对象 "xx"的地址。

题目3—使用int[5][]定义一个二维数组,其第二维到底有多长?尝试补全代码,然后使用foreach获其他循环方法遍历这个二维数组?

第二维(列)的长度没有定义,即每一行的列数可以不同,是可变的(也叫“锯齿数组”).
public class Main {public static void main(String[] args) {int[][] arr = new int[5][5];for (int i = 0;i<arr.length;i++) {for (int j= 0;j<arr[i].length;j++) {arr[i][j]=i * 10+j; }}foreach(arr);
}public static void foreach(int[][] arr) {for (int[] row : arr) { for (int i: row) { System.out.print(i+" ");}System.out.println();}}
}

题目4—类与对象的区别是什么? Math类有对象吗?String类有什么属性是private的,有什么方法是public的,为什么这样设计(尝试举两例说明)?

1.类是对象的模板或蓝图,定义了对象的属性(字段)和行为(方法);对象是类的实例,是具体的实体
2.Math类没有对象
3.
(1)
1.private final char value[],防止外部直接修改字符数组,保证String的不可变性
2.private int hash,哈希码是内部优化细节,外部无需访问,这样可以防止外部篡改哈希码
(2)
1.public charAt(int index),提供安全访问字符的方式,而不暴露内部 value 数组,还可以保证不可变性(返回的是 char,不是引用)
2.public String substring(int beginIndex),提供字符串截取功能,而不暴露内部实现,还可以返回新 String 对象,不修改原字符串(符合不可变性)

题目5—将类的属性设置为public可以方便其他类访问,但为什么Java中普遍使用setter/getter模式对对象的属性进行访问呢?这与封装性又有什么关系?

如果将类的属性直接设为public,外部类可以直接访问和修改,会无法添加额外逻辑,还会无法控制赋值,破坏封装性;
使用setter/getter模式,可以在 setter 中添加验证逻辑,还可以getter中返回副本或计算值(如返回格式化的字符串),封装的核心思想是隐藏内部实现,只暴露必要的接口,而setter/getter 是对属性的受控访问,而不是直接暴露,符合封装性。

题目6—对象的属性可在什么时候进行初始化?都有哪些进行初始化的办法?

对象的属性可以在声明时、构造方法中、初始化块中、静态初始化块中、setter 方法中或通过反射进行初始化。
方法:1.在定义成员变量时直接赋值;2.在构造方法中对属性赋值;3.使用 {} 初始化块;4.使用 static {} 初始化静态属性,类加载时执行一次;5.对象创建后,通过 setter 方法赋值;6.使用反射机制动态设置属性值

题目7—进阶(可选):尝试使用作用域来说明封装性。

封装性通过作用域(访问修饰符)实现,控制类成员的可见性。
1.使用 private 限制直接访问
2.使用 default 实现包级私有(同一个包内的类可以访问,但对外部包隐藏)
3.使用 protected 允许子类访问
4.使用 public 提供公共接口

三、实验使用环境(本次实验所使用的平台和相关软件)

以下请根据实际情况编写

  • 操作系统:Windows 11专业版
  • 编程语言:Java
  • 开发工具:[eclipse)

四、附件-参考文件

  1. Java实验教学大纲

  2. PTA中提交Java程序的一些套路

  3. Java9相关资料(JShell简易教程等)

  4. IntelliJ IDEA的基本使用

http://www.wxhsa.cn/company.asp?id=1402

相关文章:

  • part 4
  • systemctl的service脚本写法
  • 9月份美联储的降息利好
  • 口胡记录
  • Day16内存分析及初始化
  • leveldb源码分析 #1 Slice WriteBatch WriteBatchInternal 【work记录】
  • 欧拉安装
  • 2025实测:6款主流公众号编辑器大比拼,解决你的排版难题!
  • 设计模式-适配器模式 - MaC
  • devc学C语言
  • HarmonyOS 5.1手势事件详解
  • Vue3项目中集成AI对话功能的实战经验分享
  • gulimall出现服务间调用org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.choose 问题
  • Java02课前问题列表
  • 达梦数据库安装和使用
  • CSP 赛前周记
  • Ubuntu 界面变为 Mac
  • Day16对数组的基本认识
  • PVE9环境下飞牛OS安装vGPU驱动
  • 02020304 .NET Core核心基础组件04-配置系统、Json文件配置、选项方式读取、扁平化环境变量其它配置源
  • md格式
  • CSP-S模拟20
  • 第7篇、Kafka Streams 与 Connect:企业级实时数据处理架构实践指南
  • Day16编写一个计算机程序
  • 迷宫最短路径
  • 千靶日记-0003
  • COMSOL 6.3 下载+安装教程+激活教程:一站式下载安装激活操作说明
  • 20231427-田泽航-Linux命令实践
  • 202207_BUGKU_二维码GIF
  • 20250910NOIP模拟赛