Java核心技术卷Ⅰ-第四章对象和类

news2024/9/22 5:27:40

重点

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子目录中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/57908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

找出链表中间结点的三种解法

初阶链表刷题注意!!!学习的是解题的思维! 找出链表的中间结点(链接在末尾) 解题思路 数组解法 由于链表不能通过下标访问对应的结点,所以我们将所有的结点存储在数组中,这样就可以通…

测试开发怎么学?

随着互联网行业的高速发展,快速高质量的产品版本迭代成为企业始终立于不败之地的迫切需求,而在短期迭代的快节奏中.传统测试工作面对更大压力,无法持续提供高效率高质量的人力支撑,所以越来越多的企业需要技术更为全面的测试开发工程师。 测试开发本质上属于测试,区…

【数据结构】二叉树链式结构的实现

👑作者主页:进击的安度因 🏠学习社区:进击的安度因(个人社区) 📖专栏链接:数据结构 文章目录一、二叉树的链式存储二、二叉树链式结构的实现结构设计手动构建二叉树前序遍历中序遍历…

游戏思考26:游戏服务器压力测试文档(最近在忙这个,这个会更新频繁,12/03未完待续)

文章目录一、压力测试关注点二、计算最耗时的加载操作1)从数据库读取数据,对加载的类型进一步划分各种类型,计算最耗时操作2)查看CPU随着在线人数的变化所占百分比3)查看内存变化4)备注一、压力测试关注点 …

【C语言字符串】一道题检验你的字符串学习情况

作者:匿名者Unit 目录 一.字符串引言1.字符串基础二.洛谷P5734详解1.字符串相关库函数(1) strcpy函数 (2) strcat函数 (3)strstr函数 2.题目讲解一.字符串引言 1.字符串基础 字符串通常以\0作为…

008. 子集

1.题目链接: 78. 子集 2.解题思路: 2.1.题目要求: 给一个元素各不相同的数组 nums,返回各种可能的子集(子集不能重复) 比如: 输入:nums [1,2,3] 输出:[[],[1],[2],[…

做了8年前端,感谢那些优秀的后端,陪伴我工作,教会我成长

☆ 前段时间由于一时的头脑发热,写了一篇《做了8年前端,细说那些曾经让你浴霸不能的后端》的博客,虽然每个细节也都属实吧,但始终是一些负能量的东西,建议大家不要去看了,今年互联网情况已经这样了&#xf…

安卓APP源码和设计报告——体育馆预约系统

项目名称:体育馆体育场预约系统专业:班级:学号:姓名: 目 录 一、项目功能介绍3 二、项目运行环境3 1、开发环境3 2、运行环境3 3、是否需要联网3 三、项目配置文件及工程结构4 1、工程配置文件4 2、工程结构目…

磨金石教育摄影技能干货分享|上海随手拍——叶落满街,秋意未尽

步入十二月以来,气温也随之骤降,这时候才明显感到初冬已至。冬天的寒风就是最好的脱叶剂,走在街道上,抬眼望去两旁的树木多数已经稀疏。只有残留的绿意还在迎着微微的寒风摇动。 我最喜欢的是秋天,因为秋天的草木最有色…

基于keras与tensorflow手工实现ResNet50网络

前言 在文章 基于tensorflow的ResNet50V2网络识别动物,我们使用了keras已经提供的神经网络,完成了图像分类的。这个时候,小明同学就问了,那么我怎么自己去写一个神经网络来进行训练呢? 本文就基于tensorflow&#xff…

Redis原理篇——五种基本数据类型

一、Redis底层数据结构 1. SDS 获取字符串长度耗时: 由于Redis底层是C语言编写的,C语言中没有字符串这个概念,本质上都是字符数组,获取字符串长度就是遍历数组获取长度(遍历到 \0结束标识结束 )时间复杂度…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校毕业生信息采集系统05hj2

大四计算机专业的同学们即将面临大学4年的最后一次考验--毕业设计。通过完成毕业设计来对过去4年的大学学习生活做一个总结,也是检验我们学习成果的一种方式,毕业设计作品也是我们将来面试找工作的一个敲门砖。 选题前先看看自己掌握哪些技术点、擅长哪…

数据库常用的数据类型和约束条件

文章目录一. 数据库常用的数据类型1. 数字类型1.1 整数类型:INT(m)和BIGINT(m)1.2 浮点类型:DOUBLE(m,n)2. 字符类型2.1 定长字符:CHAR(n)2.2 变长字符:VARCHAR(n)2.3 变长字符:TEXT(n)3. 日期类型3.1 语法格式:3.2 注意事项二. 约束条件1.主键约束(PRIMARY KEY)1.1 注意事项1.…

[附源码]Python计算机毕业设计Django美发店会员管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

Web压测工具http_load原理分析

01、前言 http_load是一款测试web服务器性能的开源工具,从下面的网址可以下载到最新版本的http_load: http://www.acme.com/software/http_load/ 这个软件一直在保持着更新(不像webbench,已经是十年的老古董了。 webbench的源…

【Matplotlib绘制图像大全】(二十九):Matplotlib绘制热力图

前言 大家好,我是阿光。 本专栏整理了《Matplotlib绘制图像大全》,内包含了各种常见的绘图方法,以及Matplotlib各种内置函数的使用方法,帮助我们快速便捷的绘制出数据图像。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmMatp…

【经验分享】突然我的SM.MS的图床没法访问了(内附解决方法)

【经验分享】突然我的SM.MS的图床没法访问了(内附解决方法) 一大早写文章,发现Markdown里的图片全部都不能成功加载了,这个的确挺头疼的! 文章目录1 说一说现象2 简单排查一下3 查找解决方案4 实施解决方案5 总结6 更多…

高楼扔鸡蛋问题

1.对应letecode链接 高楼扔鸡蛋问题 2.题目描述 解题思路 题目是这样&#xff1a;你面前有一栋从 1 到 N 共 N 层的楼&#xff0c;然后给你 K 个鸡蛋&#xff08;K 至少为 1&#xff09;。现在确定这栋楼存在楼层 0 < F < N&#xff0c;在这层楼将鸡蛋扔下去&#xff…

Windows使用ssh协议远程连接ubuntu linux子系统

Windows使用ssh协议远程连接ubuntu linux子系统一、Windows远程连接ubuntu linux子系统二、开启ubuntu ssh服务三、获取ubuntu子系统的ip地址四、从windows上通过ssh连接到ubuntu子系统五、后记一、Windows远程连接ubuntu linux子系统 当我们在windows上安装好ubuntu子系统后&…

Linux命令总结详细

Linux命令总结详细1.前言2.基础知识2.1.执行命令格式2.2.帮助命令2.2.1.man命令2.3.部分快捷键2.3.1.Tab键2.3.2.Ctrlc组合键2.3.3.Ctrll组合键2.4.服务运行命令2.5.服务开机启动命令3.系统工作命令3.1.date时间命令3.1.1.命令解释3.1.2.命令参数3.1.3.案例3.2.reboot重启命令3…