重点

1.使用预定义类

2.方法参数

3.对象构造

4.包

5.类设计技巧


1.使用预定义类


  • 一个源文件只能有一个公共类,可以有任意数目的非公共类
  • 可以使用通配符调用Java编译器:javac Test*.java
  • 使用var声明局部变量就不用担心00L0.0之间的区别,因为可以从变量的初始值推导出它们的类型,但是该关键字只能用于方法的局部变量,参数和字段的类型必须声明具体类型
class Test{var a;  // 报错public void test(var a){  // 报错var a = 1;  // 不报错}
}
  • 为了避免出现空指针异常,有以下两个方式处理:

    • null参数转换为非null值:
    if(n == null){name = "psj";
    }else{name = n;
    }
    
    • 使用API拒绝null参数:
    String name;
    public Test(String n){name = Objects.requireNonNull(n, "not null")
    }
    
  • 不要编写返回可变对象引用的getter方法,如果要返回可变对象的引用,可以进行clone

// 错误示范
public class Employee{private Date hireDay;public Date getHireDay(){return hireDay;}
}
Employee e = ...;
Date d = e.getHireDay();
// 本来只想修改d对象的值,但是因为引用d和引用e的属性hireDay指向同一个Date对象,所以也把e中的hireDay修改了
d.setTime(...);  // 正确示范
public class Employee{private Date hireDay;public Date getHireDay(){return (Date)hireDay.clone();}
}
  • final实例字段用于确保每个构造器执行后,该字段的值已设置并且不能修改;但是final修饰的是一个类,该类的引用不会改变,但是类中的内容可以改变:
class Test {private final String ss = "psj";private final A aa = new A();public void test() {ss = "psj2";  // 报错aa.setA(3);  // 可以修改}
}class A {private int a = 1;public void setA(int a) {this.a = a;}
}

2.方法参数


  • 将参数传递给方法存在两个概念:

    • 按值引用:方法接受的是调用者提供的值,即方法得到所有参数的副本,并且不能修改传递给它的参数变量的内容

    • 按引用调用:方法接受的是调用者提供的变量位置,方法可以修改按引用传递的变量值

  • Java中采用按值引用,对于对象的引用也属于按值引用

public static void changeValue1(int x){  // 基本类型参数x = 3 * x;
}
public static void changeValue2(Person x){  // 对象类型参数x.add(100);  // add方法是Person类中修改salary字段的方法
}
// 调用上述方法:
int a = 10;
Person p = new Person(200);
changeValue1(a);  // a不会变
changeValue2(p);  // p对象中的salary=200+100=300

  • Java中对方法参数能做什么和不能做什么:

    • 方法不能修改基本数据类型的参数
    • 方法可以改变对象参数的状态
    • 方法不能让一个对象参数引用一个新的对象
    public static void swap(Person x, Person y){Person temp = x;x = y;y = temp;
    }
    Person a = new Person(200);
    Person b = new Person(300);
    swap(a, b);  // 此时对象a不会改为指向对象b,因为在swap方法中x和y只是a和b的副本,x和y会交换引用,但是a和b不会
    

3.对象构造


  • 重载指多个方法有相同的方法名但是有不同的参数,Java允许重载任何方法(包括构造器方法)
  • 在构造器中没有显式为一个字段设置值,则会自动设置默认值(局部变量未设置值的话是不存在默认值)
  • 不同的构造器可以认为是采用多种形式设置实例字段的初始状态:
    • 无参构造器会将所有实例字段设置默认值
    • 如果类中提供了有参构造器没提供无参的,就只能使用有参的,否则报错(即类中没有任何构造器时才会获得一个默认无参构造器)
  • 存在三种初始化实例字段的方法,执行顺序为实例字段初始化为默认值->初始化块->构造器
    • 在构造器中设置值
    • 在声明中赋值
    • 使用初始化块

4.包


  • 为了保证包名的唯一性,使用因特网域名逆序的形式作为包名,如com.psj.Spring
  • 一个类可使用所属包(即该类所在包)中所有类和其他包中的公共类(因为类只能用public修饰或者不加修饰符)
  • 如果要直接使用其他包中的静态方法和静态字段:
import static java.lang.System.*;
out.println("xxx");  // System.out是静态方法
  • 如果在源文件中的第一行加上package语句,则该文件中的类属于无名包下;如果运行无名包下的类就会将基目录下所有类进行编译(因为无名包和其他包的公共父目录为基目录);如果运行com.psj.A下的类,此时还有com.psj2.B这样的包,也同样会把com目录下所有类编译(因为com.psj.Acom.psj2.B的公共父目录com)

  • 假设在com.psj包下创建Test.java,但是该文件开头为com.psj2,这个文件也是可以编译的(要分辨一个文件在哪个包下就看第一行在哪个package中,当然也可能属于无名包)

  • 修饰符的访问权限:

    • public修饰的部分(类、方法和变量)可以由任意类使用
    • private修饰的部分(类、方法和变量)只能由定义它们的类访问
    • 没有修饰符则这些部分(类、方法和变量)由同一个包中所有方法访问
  • 类路径列出的目录和归档文件(如xxx.jar,包含了多个压缩格式的类文件和子目录)是搜索类的起始点,假设要搜索com.psj.A的类文件:

    • 先查看Java API
    • 找不到再去查看类路径
  • 编译器的两个主要任务:

    • 如果从当前包中导入一个类,编译器要搜索当前包中所有的源文件,查看哪个文件定义了该类
    • 查看源文件是否比类文件新,如果是则自动重新编译

5.类设计技巧


  • 一定保证数据私有:最好保持实例字段的私有性

  • 一定要初始化数据:最好不要依赖于系统默认值,而是显式初始化所有变量(提供默认值或构造器中设置)

  • 不要在类中使用过多基本类型

  • 不是所有字段都需要单独的gettersetter方法

  • 分解过多指责的类

  • 类名和方法名要体现它们的职责

  • 优先使用不可变的类(使用final修饰的类):

    • 不可变类有LocalDate等,比如它的plusDays方法不会更改对象,而是返回状态修改的新对象
    • 如果类不可变,则可安全在多个线程间共享该对象

其他知识点


  • 对象变量不实际包含一个对象,只是引用一个对象,它类似于C++的对象指针(不能类比于C++的引用,因为C++中没有null引用,而且引用不能赋值)

  • 在C++中如果使用一个没有初始化的指针会创建一个错误指针,在Java中会报错,所以无需担心指针问题

  • 静态方法不能访问实例字段,但是可以访问静态字段

  • 不存在两个同名同参但是返回值不同的方法

  • 对于布尔类型字段使用的是isXXX方法而不是getXXX方法

  • 每个JAR文件包含一个清单文件,名为MAINIFEST.MF,用于描述归档文件的特殊特性,它存在于META-INF子目录中

Java核心技术卷Ⅰ-第四章对象和类相关推荐

  1. Java核心技术卷一 -第四章:方法参数

    系列文章目录 Java核心技术卷一 -第一章:java"白皮书"的关键术语 Java核心技术卷一 -第三章:数据类型 Java核心技术卷一 -第三章:变量与常量 Java核心技术卷 ...

  2. Java核心技术卷一 -第五章:枚举类再认识

    系列文章目录 Java核心技术卷一 -第一章:java"白皮书"的关键术语 Java核心技术卷一 -第三章:数据类型 Java核心技术卷一 -第三章:变量与常量 Java核心技术卷 ...

  3. CoreJava 笔记总结-第四章 对象与类

    文章目录 第四章 对象与类 使用预定义类 对象与对象变量 Java库中的LocalDate类 更改器方法和访问器方法 ==用户自定义类== 用`var`声明局部变量 使用`null`引用 隐式参数与显 ...

  4. java技术难点_Java核心技术第四章----对象与类重难点总结

    一.类之间的关系 类和类之间的关系,耦合度从高到低: is -a.继承.实现 has-a.组合.聚合.关联 user-a.依赖. 要求是:高内聚.低耦合. 继承("is-a") 继 ...

  5. java实现图形界面输入半径求圆面积_【读】Java核心技术卷1

    阅读原文:[读]Java核心技术卷1 看到这本书时,我的内心是崩溃的,卷1就700多页,但是这本书是很多前辈所推荐的,想必其中必有精华所在,硬着头皮上吧. 如何阅读本书 拿到书的第一眼肯定去看目录,大 ...

  6. 《Java核心技术 卷Ⅰ》读书笔记一

    Java核心技术·卷 I(原书第10版) 作者: [美] 凯.S.霍斯特曼(Cay S. Horstmann) 出版社: 机械工业出版社 原作名: Core Java Volume I - Funda ...

  7. JAVA核心技术_【读】Java核心技术卷1

    看到这本书时,我的内心是崩溃的,卷1就700多页,但是这本书是很多前辈所推荐的,想必其中必有精华所在,硬着头皮上吧. 如何阅读本书 拿到书的第一眼肯定去看目录,大概了解一下,各个章节所讲内容. 为表对 ...

  8. Java核心技术卷一 -第五章:装箱和拆箱

    系列文章目录 Java核心技术卷一 -第一章:java"白皮书"的关键术语 Java核心技术卷一 -第三章:数据类型 Java核心技术卷一 -第三章:变量与常量 Java核心技术卷 ...

  9. java 卷一阅读_【读】Java核心技术卷1

    看到这本书时,我的内心是崩溃的,卷1就700多页,但是这本书是很多前辈所推荐的,想必其中必有精华所在,硬着头皮上吧. 如何阅读本书 拿到书的第一眼肯定去看目录,大概了解一下,各个章节所讲内容. 为表对 ...

最新文章

  1. 大数据 清华 覃征_调剂到清华读研?不想去!清华大学大数据调剂生放弃录取!...
  2. webpack打包缓存_【第835期】Webpack 的静态资源持久缓存
  3. matlab svd分解
  4. 神策数据全新改版数据概览,致力打造多角色、多场景的“工作台”
  5. 最小二乘与最大似然估计之间的关系
  6. 用户、组以及相关文件说明
  7. [MEGA DEAL] Ultimate Java开发和认证指南(59%折扣)
  8. 前端学习(3276):js中this的使用
  9. 二分匹配最大匹配的理解(附图解)
  10. MSM8926处理器
  11. 雄迈视频板使用调试串口作为普通串口通信
  12. 2019UI设计趋势,抢先了解一下
  13. 【小墨mysql】mysql系列之三---事务
  14. 免费下载高清可商用的图片网站(整理集合)
  15. c语言致命错误无法打开网页,电脑中IE浏览器显示异常或无法打开网页崩溃的解决方法...
  16. mfc上位机网络接收图片并显示_基于UDS on CAN的BootLoader上位机
  17. 商法——企业法律风险防范
  18. QTextEdit设计的几个知识点
  19. 知识蒸馏——pytorch实现
  20. 原创有关年华,无关风月

热门文章

  1. 设计模式-抽象工厂总结
  2. 工厂IT人员如何自学ERP系统
  3. 联想服务器控制口登录地址_服务器常见远程管理网口及登录方式
  4. 黑客入侵微软邮件服务器部署勒索软件、惠普更新打印机漏洞|12月2日全球网络安全热点
  5. 操作系统春招面试复习之:进程管理
  6. 信息化管理系统(制造业ERP系统)
  7. SQL查询学生表中每课大于85分的同学名称
  8. 模数实例(SEAL/smallmodulus.h 2.3.0)
  9. y空间兑换代码_【游戏流体力学基础及Unity代码(三)】用波动方程模拟三维落雨池塘,连续性方程...
  10. python中的命令,python学习——python中命令行