20165223 《JAVA程序设计》第三周学习总结

时间:2024-05-24 11:35:32

教材学习内容总结

第四章是整个JAVA语言的基础和重点,要重点学习和把握。

第四章要点

  • 基础
    • 构造方法与对象的创建
    • 类与程序的基本结构
  • 重点
    • 参数传值
    • 对象组合
  • JAVA独有语法
    • 实例成员与类成员
    • 方法重载
    • this关键字
    • import语句
  • 实用
    • JRE扩展与jar文件

教材学习中的问题和解决过程

一、面向对象

  • 特性:封装性、继承、多态
  • 重点理解:类

二、类

  • 类:重要的数据类型
  • 的含义:封装着数据和对数据的操作
  • 的内容:类声明+类体
    • 类声明:变量被称为对象变量,简称对象,用class 类名表示
    • 类体:变量声明(体现数据,属性)+方法(体现操作,行为),类声明后包括{ }的所有内容
  • 类体的内容
    • 成员变量/域变量:变量声明部分声明的变量
      • 有效范围与整个类和书写位置无关
      • 变量起名习惯第一个单词小写(若有多个单词则从第二个单词开始首字母大写,eg:heightLightFlight,不用下划线,驼峰习惯)
      • 成员变量有默认值
    • 方法:定义方法
      • 方法=方法头+方法体
      • 方法体:局部变量+语句,类似c的函数
      • 方法体中局部变量定义的参数只在方法内有效,且与位置有关,从声明它的位置之后才开始有效
      • 局部变量与成员变量同名,成员变量在方法内暂时失效
      • 局部变量没有默认值

三、构造方法与创建对象

  • 构造方法
    • 创建对象时用,名字与类名一样,无类型
    • 默认构造方法和自定义构造方法
      • 默认:默认一个类只有一个无参数的构造方法
      • 自定义:自定义时系统不提供构造方法,构造几个有几个。一个类中可以有多个构造方法,但必须保证构造方法名字与类名都一样,且参数不同(数量或类型)
  • 创建对象
    • 创建对象=对象的声明+为对象分配变量
    • 对象声明:类名 对象名
    • 为对象分配变量:new运算符+类的构造方法
  • 对象的内存模型
    • new运算符运算结果是一个十六进制数,一个引用
    • 首先给成员对象分配内存空间,再执行构造方法中的语句

四、参数传值(重点)

  • 传值机制:方法中所有参数都是调用了指定值的拷贝
  • 两种方法:基本数据类型参数的传值、引用类型参数的传值
  • 基本数据类型参数:向该参数传递的值的级别不可以高于该参数的级别,不改变传入参数本身的值
  • 引用类型参数:传递的是变量中存放的“引用”,不是变量引用的实体;改变参数变量实体则原变量实体改变,改变参数变量“引用”不改变原变量“引用”,反之亦然
  • 可变参数:eg. public void f(int … x)
    • 参数类型一致
    • 可变参数代表在最后一个
    • 表示若干参数

五、对象的组合(重点)

  • 组合与复用:一个类声明的两个对象如果具有相同的引用,那么二者就具有完全相同的变量

六、实例成员与类成员

  • 实例变量声明与类变量声明
    • 实例变量(无修饰):float x;
      • 不同对象实例变量不同
      • 通过该对象访问该实例变量
    • 类变量(static变量/静态变量):static int y
      • static需要放在变量类型前面
      • 所有对象共享类变量
      • 通过类名直接访问类变量
  • 实例方法与类方法
    • 实例方法:float max(float x,float y) { … }
      • 对象调用实例方法(直接使用)
    • 类方法:static float jerry() { … }
      • static放在方法类型前
      • 类名调用类方法(类似C语言函数调用)

七、方法重载

  • java多态:重载、重写(继承相关)
  • 方法重载:对象行为的多态性
    • 一个类中可以有多个同名方法,但必须参数(个数或类型,二选一)不同

八、this关键字

  • 构造方法中:可省略
  • 实例方法中:
    • 实例成员变量:this.成员变量;
    • 类成员变量:类名.成员变量;
      • 实例成员名字与局部变量名字相同时,this.类名.不可省略
    • 实例方法中调用实例方法:this.方法;
    • 实例方法中调用类方法:类名.方法;
      • 一个实例方法调用另一个方法时可省略this.类名.
      • this不能在类方法中调用,因为类方法可以通过类名直接调用,且可能调用时还没有对象诞生

代码调试中的问题和解决过程

一、程序的若干个类分布在多个源文件时的编译与运行

  • 未放入同个文件夹时出现下图错误:
    20165223 《JAVA程序设计》第三周学习总结

  • 检查得知原因,将这几个源文件单独建文件夹放在其中后再正常编译主类所在源文件Example4_5.java:
    20165223 《JAVA程序设计》第三周学习总结

  • 因此当程序的若干个类分布在多个源文件时,需要将所有源文件都放在同一个文件夹中再在终端里编译才能成功,且只需要编译主类即可
    20165223 《JAVA程序设计》第三周学习总结
    20165223 《JAVA程序设计》第三周学习总结

  • 如上图能看到,直接编译主类时系统会自动编译Rect.java和Lader.java,这是因为主类中需要用到这两个源文件产生的字节码
  • 编译后有三个字节码文件产生,其中Rect和Lader是可复用的代码,相当于c中的可调用函数,主类就相当于主函数,直接调用这些代码即可进行计算

二、返回类型不同(再一次强调!!避免不小心犯错)

  • 编译时出现如图错误:
    20165223 《JAVA程序设计》第三周学习总结

  • 发现是源文件中类名和文件名不符,无法返回值
    20165223 《JAVA程序设计》第三周学习总结

  • 修改后就可以正常编译运行了

三、包语句和import语句的编译和运行

  • Example4_17和Example4_18中引入自定义包中的类,第一次编译时未将Example4_18.java置于包文件hello/nihao中导致出错:
    20165223 《JAVA程序设计》第三周学习总结

  • 放入后再编译运行:
    20165223 《JAVA程序设计》第三周学习总结

  • 这是由于Example4_18.java中的主类没有包名,因此需要将自定义包名形成的目录和无包名的类放在同一个文件夹中
  • 都是无名包且在同个文件夹下的类可以互相使用
  • 无名包类可以使用import语句来使用有名包的类
  • 有名包的类无法使用无名包的类

代码托管

上周代码详见码云ch04
20165223 《JAVA程序设计》第三周学习总结

上周考试错题总结

还未进行第二次测试,稍后补充

感悟与思考

这一章的学习比起前两周而言明显难且深入了许多,且因为生病耽误了时间,一周的时间里学起来较之前吃力,但也还在接受范围之内。看第四章学习视频时也了解到这一章是整个JAVA学习中的基础和重点,的重要性不言而喻。经过蓝墨云上的测试考验后,我也更深入的理解了知识点,虽然对有些点的认知现在还浮于表面,但我相信在接下来的学习中会逐渐明白其中的重要性,比如书本中从第一章开始就一直重复出现的一句话“一个类声明的两个对象如果具有相同的引用,那么二者就具有完全相同的变量”,到了这一章终于有了比较明确的认识。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 3000行 30篇 400小时
第一周 178/200 1/2 20/20 基础
第二周 368/200 2/2 20/20 基础
第三周 865/200 3/2 20/20 逐渐深入

参考资料

  1. 第四章教学视频
  2. 使用JDB调试Java程序