zoukankan      html  css  js  c++  java
  • 第二周-Java基本语法与面向对象入门-预习任务

    第二周-预习任务-Java基本语法与面向对象入门

    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的功能为通过循环把字符串中的字符一个个拆分取出来,以字符和字符的位次保存到strs[i]中

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

    没有改变,参数是基本类型,函数不能改变参数的值。

    1、基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的

    2、对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数

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

    参数不指定,agrs接收的是null

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

    • 从命令提示符中传值
    • 直接在java代码中赋值

    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]

    arr和arrx指向同一个数组对象

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

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

    [aa, xx, cc]

    strArr中的bb更改为了xx,在声明strArr字符串的时候只是声明了一个地址,当改变它的值的时候,不是重新给他赋值,而是重新申请了一个地址。

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

    foreach的语句格式: 
    for(元素类型t 元素变量x : 遍历对象obj){ 
       引用了x的java语句;
    } 
    
    public class Main {
    
        public static void main(String[] args) {
    
            int [][]arr=new int[][]{
                    {1,2,3},
                    {4,5,6},
                    {7,8,9}
            };
            for(int x[] :arr) {
    for(int y:x){
                    System.out.print(y+" ");
                }
                .out.println(" ");
            }
        }
    
    }
    
    输出
    1 2 3  
    4 5 6  
    7 8 9  
    

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

    • 类是面向对象程序设计实现信息封装的基础,是一种用户定义的引用数据类型。是表示现实世界中某个具体的事物

    • 对象是一个存储器地址,对象是某一个类的实例。是对对象的抽象描述

    • 没有,math类有了构造方法,构造函数被设置为私有的,math类中的方法是静态公开的。

    • String类的private属性:value public方法:

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

    • setter/getter 统一了这个类的变量修改获取值的口子,更加方便你对这个类的控制
    • 比如这个类的某个变量我不想让你去修改它,那我就把set方法删了就行,比如我想要限制set方法设置的值的范围,get方法获取值的时候,返回一个比较特殊的值,这些需求可以很方便的通过setter/getter去设置,减小对源代码的修改,而且扩展性更好。
    • 封装之后会更安全,有类型检查

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

    • 使用new关键字创建类的实例对象时、读取一个类的静态属性、设置一个类的静态属性、调用类的静态方法时;

    • 使用java.lang.reflect包中的方法对类进行发射操作的时候,如果类没有被初始化,则进行初始化;

    • 初始化一个类的时候,其父类没有被初始化,先初始化其父类;

    • 当应用启动的时候,如果指定了引导类,引导类没有初始化,先初始化这个引导类;

    • 在JDK7中,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄对应的类没有被初始化,先触发其初始化操作。

    1.指定初始化,即直接赋值

    2.构造器初始化,在调用一个类之前,都需要调用initialize()方法。通过调用initialize()方法,我们可以搭建一个构造器,保证所有的对象都会得到初始化。

    3.静态数据的初始化

    轻轻松松了解Java的初始化方法(含对象数组的小问题) - jirath - 博客园 (cnblogs.com)

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

  • 相关阅读:
    意向锁
    锁升级
    使用SQL SERVER PROFILER 捕获和分析死锁
    用Go写一个聊天软件
    Js中的一个日期处理格式化函数
    javascript format 字符串 函数
    php 读取excel 时间列
    PHP发送post请求
    javascript getElementsByClassName扩展函数
    [ASP.NET] Session 详解
  • 原文地址:https://www.cnblogs.com/GGGa-Yi/p/15258258.html
Copyright © 2011-2022 走看看