第02周 预习:Java基础语法2、面向对象入门

第02周 预习:Java基础语法2、面向对象入门

  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的功能各是什么?

    ①changeStr的功能是将形参x的值修改为"xyz"

    ②changeArr的功能是为原字符串添加序号

    1.2 main方法的x有没有被改变?为什么?

    没有。String虽然是引用数据类型传参也是传引用值,但它是不可变类(final)。当执行x="xyz"时,又新创建了一个内存空间存放"xyz"并将新的引用值赋值给x。
    在这里插入图片描述
    以下为该程序运行的可视化过程
    在这里插入图片描述
    在这里插入图片描述

    1.3 main方法的args数组的内容有没有被改变?为什么?

    没有。因为args数组没有初始化,即args数组没有如何元素(意味着strs.length=0)。

    1.4 args数组中的值是从哪里来的?要怎么才能给他赋值。

    args数组中的值通常是由调用Java程序时传递给main方法的命令行参数来填充的。

    ①使用命令行传参

    ②在eclipse中击鼠标选择Run AS,然后选择Run Configurations,弹出的窗口 右侧选 Arguments,在program arguments栏输入参数

  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这段程序输出结果是什么?为什么?

    输出结果为:

    [2, 1, 0]

    [2, 1, 0]

    arrX与arr的引用值相同都指向同一个数组,arr[0]=2,修改了原来arr[0]的值。此时输出结果为[2, 1, 0]。
    在这里插入图片描述

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

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

    字符串是不可变类指的是原字面值不会改变,但是会重新申请一个新的内存空间存放字符串"xx",并且将新的引用值赋值给strArr[1]。
    在这里插入图片描述

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

    长度不确定,由自己定义。

    for(int i=0;i<5;i++){
       for(int temp : a[i]){
          System.out.println(temp);
         }
     }
    
  4. 类与对象的区别是什么? Math类有对象吗?String类有什么属性是private的,有什么方法是public的,为什么这样设计(尝试举两例说明)?

    一、类与对象的区别:

    1. 定义和实例化:
      • 类是对一类具有相同属性和行为的对象进行描述的模板或蓝图。它定义了对象的属性(成员变量)和行为(方法),但本身并不占用内存空间。
      • 对象是类的一个实例。当我们使用类创建对象时,才会在内存中分配空间以存储对象的具体实例数据。
    2. 内存占用:
      • 类本身只是一个模板,不占用实际的内存空间。它只有在实例化为对象时,才会分配内存空间来存储对象的数据。
      • 每个对象在内存中都有自己的存储空间,包含了对象的属性和方法。
    3. 关系:
      • 类与对象之间是一种抽象与实例化的关系。类是对象的抽象描述,而对象是类的具体实体。
      • 一个类可以有多个对象的实例,它们共享同一个类的属性和方法,但各自的数据可能不同。
    4. 使用:
      • 类是用来定义对象的结构和行为的,它提供了创建对象的模板。我们通过实例化类来创建对象,并调用对象的方法来完成具体的操作。

    二、Math类没有对象

    三、

    1. 私有属性(private fields):

      • private final char value[];:String类内部使用字符数组来存储字符串的值。这个字符数组被声明为私有的(private),这意味着该属性只能在String类内部进行访问和修改,外部无法直接访问它。这种设计可以保证字符串内容的不可变性(Immutable),防止外部代码直接修改字符数组,从而确保字符串对象的安全性和不可变性。
    2. 公共方法(public methods):

      • public int length():返回字符串的长度。这个方法被声明为公共的(public),意味着它可以被任何其他类使用。通过公开length()方法,其他类可以方便地获取某个字符串的长度信息。

      • public String substring(int beginIndex, int endIndex):返回指定范围内的子字符串。这个方法也是公共的(public),允许其他类根据需求提取出字符串中的一个子串。公开substring()方法可以方便地支持字符串的截取操作。

        私有属性可以保护数据的安全性和完整性,防止外部直接访问和修改;而公共方法提供了对对象的操作接口,使其他类能够使用和调用类的功能

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

    通过setter方法,类可以对传入的数据进行验证和处理,确保数据的有效性和一致性。例如,可以在setter方法中添加逻辑来检查输入的数据是否符合要求,防止错误或不合理的值被赋予属性。这增加了程序的健壮性和安全性。

    将属性私有化而方法声明为公共的就体现了封装性。

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

    创建对象时,调用setter方法时。

    ①默认初始化

    ②显示初始化

    ③使用初始化块或静态初始化块

    ④使用构造器

    ⑤使用setter方法

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

    java中属性与方法的作用域依赖权限修饰符如private、public、protected、缺省。被private修饰的属性或方法只能在本类中使用,而被public修饰的属性或方法可以在其它包非子类中使用,因此使用权限修饰符可以使某些属性或方法只能在本类中使用,这就体现了封装性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

omomomomomom

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

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

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

打赏作者

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

抵扣说明:

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

余额充值