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

文章目录

  • 第四章 对象与类
    • 使用预定义类
      • 对象与对象变量
      • Java库中的LocalDate类
      • 更改器方法和访问器方法
    • ==用户自定义类==
      • 用`var`声明局部变量
      • 使用`null`引用
      • 隐式参数与显示参数
      • 基于类的访问权限
      • 私有方法
      • `final`实例字段
    • 静态字段与静态方法
      • 静态字段
      • 静态常量
      • 静态方法
      • 工厂方法
      • `main`方法
    • 方法参数
    • 对象构造
      • 重载
      • 默认字段初始化
      • 无参数构造器
      • 显式字段初始化
      • 参数名
      • 调用另一个构造器
      • 初始化块
      • 包名
      • 类的导入
      • 静态导入
      • 包访问
    • 文档注释
      • 注释的插入
      • 类注释
      • 方法注释
      • 字段注释
      • 通用注释
      • 包注释
    • 类设计技巧

第四章 对象与类

  • 面向对象程序设计: (OOP)先考虑数据, 再考虑算法
  • : Javab编写的所有代码都位于某个类中,以便于描述应用程序所对应问题领域中的对象
    • 封装(数据隐藏): 将数据和行为组合在一个包中, 对对象使用者隐藏具体实现方法
    • 实例字段: 对象中的数据
    • 方法:操作对象的过程
    • 状态: 一组特定实例字段值的集合
    • 继承:通过扩展一个类来建立另一个类的过程
  • 对象: 对象的行为(方法), 对象的状态, 对象的标识
  • 类与类之间的关系:依赖, 聚合, 继承

使用预定义类

对象与对象变量

  • ==构造器(构造函数):==构造新实例, 一种特殊的方法, 用来构造并且初始化对象

  • Date birthday = new Date(); 
    birthday 引用新构造的对象
    
  • Date deadline;
    对象变量deadline可以引用Date类型的对象, 但是其本身不是一个对象, 不能使用任何Date方法
    
  • 初始化deadline, r让他引用一个新构造的对象

    deadline = new Date();
    或者 deadline = birthday;
    
  • **注意:**对象变量没有实际包含一个对象, 只是包含一个对象的引用

  • deadline = null;
    

Java库中的LocalDate类

  • 不要使用构造器来构造LocalDate类, 用静态工厂方法

  • LocalDate date = LocalDate.of(2001, 12, 26);
    int year = date.getYear();//2001
    int month = date.getMonthValue();//12
    int day = date.getDayOfMonth();//26
    

更改器方法和访问器方法

  • getMonthValue()为访问器方法
  • 更改器方法会改变原始对象的状态

用户自定义类

  • 格式
class ClassName
{field1;field2;constructor1;constructor2;...method1;method2;
}
  • 实例:
    1. private: 表示只有Employee自身可以访问
    2. public: 表示任何方法都可以调用这些方法
    3. name本身就是String对象, hireDay同理
class Employee
{private String name;private double salary;private LocalDate hireDay;// 构造器, 与类名同名, 初始化实例字段// 每个类可以有一个以上的构造器, 每个构造器可以有0+个参数,构造器没有返回值// 构造器总是伴随着`new`操作符一起调用public Employee(String name, double salary, int year, int month, int day) {this.name = name;this.salary = salary;hireDay = LocalDate.of(year, month, day);}//下面三个是字段访问器public String getName() {return name;}public double getSalary() {return salary;}public LocalDate getHireDay() {return hireDay;}//不要编写返回可变对象类型的访问器方法, 这里的LocalDate就是不可变的//返回一个可变对象类型的副本应该用clone//e.g.: return (Date) hireDay.clone();public void raiseSalary(double byPercent) {double raise = salary * byPercent / 100;salary += raise;}
}
  • 一个源文件中只能有一个公共类,非公共类无限制

var声明局部变量

  • 如果从变量的初始值可以推导出它们的类型就用var关键字声明局部变量

使用null引用

  • LocalDate birthday = null;
    String s = birthday.toString();//NUllPointerException
    
  • 拒绝null参数

    public Employee(String name, double salary, int year, int month, int day) {this.name = Objects.requireNoNull(name, "The name can't be null.");this.salary = salary;hireDay = LocalDate.of(year, month, day);}

隐式参数与显示参数

  • this: 每一个方法中指示隐式参数
  • 方法名后面括号里的为显示参数

基于类的访问权限

  • 一个方法可以访问所属类的所有对象的私有数据

私有方法

  • 作为辅助代码,可以方便的删除

final实例字段

  • 一般用于基本类型或者不可变类的字段
  • 必须在构造对象时候初始化

静态字段与静态方法

静态字段

  • static: 每个类只有一个这样的字段,属于类,不属于某一个单个对象
  • 对于非静态的实例字段,每个对象都有一个自己的副本
  • 静态字段不是不可变的,也可以++

静态常量

  • System.out:就是静态常量
  • 最好不要有公共字段但是比如公共常量final就可以的

静态方法

  • 静态方法: 不在对象上执行的方法,没有隐式参数, 指示属于类而不属于任何对象的变量和函数

  • e.g.:Math.pow()

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

  • public static int getNextId(){return nextId;// returns static field
    }//使用类名来调用这个方法
    int n = Employee.getNextId();
    

工厂方法

  • e.g.:LocalDate.of(xxx)
  • 使用工厂方法的条件:
    1. 无法命名构造器
    2. 使用构造器时, 无法改变所构造对象的类型

main方法

  • 一个静态方法
  • 主要可以用于对类进行单元测试

方法参数

  • 将参数传递给函数的方法: 按值调用, 按引用调用
  • Java程序设计语言总是按值调用
  • 实际上对象引用是按值传递的
  • 方法参数不能修改基本数据类型的参数(数值型,布尔型)
  • 方法参数可以改变对象参数的状态
  • 方法不能让一个对象参数引用一个新的对象

对象构造

重载

  • 定义: 多个方法有相同的名字和不同的参数
  • 签名: 完整描述一个方法需要指定方法名和参数类型

默认字段初始化

  • 构造器没有显式的为字段赋初始值,那么自动默认赋值 数值0, 布尔false, 对象引用null
  • 方法中的局部变量必须显式进行初始化

无参数构造器

  • 类中没有构造器就会提供无参数构造器
  • 如果类中提供了构造器但是没有无参数构造器,那么构造对象无参数就是不合法的

显式字段初始化

  • 可以在类定义中为任何字段赋值
calss Employee
{private String name = "";
}

参数名

  • 单个字母作为参数名
public Emloyee(String n, double s)
{name = n;salary = s;
}
  • 参数前面加上前缀a
public Emloyee(String aName, double aSalary)
{name = aName;salary = aSalary;
}
  • 参数变量会遮蔽同名的实例字段
public Emloyee(String name, double salary)
{this.name = name;this.salary = salary;
}

调用另一个构造器

  • 构造器的第一个语句this(xxx)将调用另一个构造器

初始化块

  • 初始化数据字段的方法: 构造器中设置值, 声明中赋值, 初始化块
  • 只要构造这个类对象初始化块一定会被执行
  • 通常将初始化块放在构造器中
package chapter4_object_and_class;import java.util.Random;public class constructor_test {public static void main(String[] args){// fill the staff array with three Employee objectsvar staff = new Employee_2[3];staff[0] = new Employee_2("Harry", 40000);staff[1] = new Employee_2(60000);staff[2] = new Employee_2();// print out information about all Employee objectsfor (Employee_2 e : staff)System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary="+ e.getSalary());}
}class Employee_2
{private static int nextId;private int id;private String name = ""; // instance field initialization 实例字段初始化private double salary;// static initialization block 静态代码块初始化static{var generator = new Random();// set nextId to a random number between 0 and 9999nextId = generator.nextInt(10000);}// object initialization block 对象初始化块{id = nextId;nextId++;}// three overloaded constructors 三个重载的构造器(构造函数)public Employee_2(String n, double s){name = n;salary = s;}public Employee_2(double s){// calls the Employee(String, double) constructor 调用第一个构造器/* 调用 */this("Employee #" + nextId, s);}// the default constructor 无参数构造器public Employee_2(){// name initialized to ""--see above// salary not explicitly set--initialized to 0// id initialized in initialization block}public String getName(){return name;}public double getSalary(){return salary;}public int getId(){return id;}
}

  • 将类组织到一个集合中

包名

  • 使用包原因: 确保类名唯一性
  • 用url逆序书写作为包名
  • 嵌套的包之间没有任何关系

类的导入

  • 一个类可以使用包中的所有类以及其他包中的公共类
  • import java.util.*;

静态导入

  • 允许导入静态方法和静态字段

  • import java.lang.System.*;
    out.println("cdsj");
    exit(0)
    

包访问

  • 如果没有指定public, private, 那么这个部分(类, 方法,变量)可以被一个包中所有方法访问

文档注释

注释的插入

  • 每个/* **/文档注释包含标记以及之后紧跟者的自由格式文本
  • 标记以@开始
  • 自由格式文本第一句应该是一个概要性的句子javadoc工具将这些句子抽取出来生成概要页

类注释

  • 类注释放在import后, 类定义之前
/**
*A cbsbudjcka
*cdnskvdls
*/

方法注释

  • 必须放在所描述方法之前
  • 标记
@param variable description
@return description
@throws class descirption

字段注释

  • 对公共字段(静态常量)建立文档
/**
* A "words" has 5 letters
*/
public static final int WORDS = 5;

通用注释

@since text 引入这个版本的描述
@auther name
@version text 当前版本的描述
@see, @link 超链接, 连接到javadoc文档或者外部文档-->P51

包注释

  • 包目录中添加单独文件

    1. 提供package-info.java
    2. 提供package.html文件, 抽取
    <body>xxx
    </body>
    

类设计技巧

  • 保证数据私有(封装性)
  • 一定对数据进行初始化
  • 不要在类中过多使用基本类型
  • 不是所有的字段都需要单独的字段访问器和字段更改器
  • 分解有过多职责的类
  • 类名和方法名都要能够体现他的职责
    • 访问器用get开头, 更改器用set开头
  • 优先使用不可变类

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

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

相关文章

windows路由表 重启后就还原了_绕过Apple id并可以随意重启的终极方案来了 (Windows下操作)...

▲请务必点击上方的蓝字关注我们哦&#xff01;「做有用的文章」我们知道自从Cheak M8漏洞出现后&#xff0c;使得A11-A7设备可以绕过AppleID使用&#xff0c;但是有着许多限制&#xff0c;例如不能重启&#xff0c;不能打电话使用蜂窝数据。如今针对无法修复蜂窝数据的Apple I…

UVA - 725 Division-sprintf的妙用

题目&#xff1a; 输入整数n&#xff0c;按从小到大顺序输出所有形如abcde/fghijn的表达式&#xff0c;其中a~j 恰好为0~9的一个排列&#xff08;可以有前导0&#xff09;&#xff0c;2<n<79 解题思路&#xff1a; 暴力枚举。 下面这代码暴力dfs&#xff0c;结果超时了…

基于.NET下的人工智能系列专题|.NET下的人工智能系列专题|用Keras.NET 做一个图像识别的训练...

.NET Core 的应用场景越来越广&#xff0c;开源社区也不断壮大&#xff0c; .NET Core在机器学习领域不断发展ML.NET外&#xff0c;也通过结合Tensorflow.NET去完善ML.NET在深度学习领域的功能&#xff0c;在ML.NET 1.3开始迈出了非常重要的一步。这不仅是微软拥抱开源的策略&a…

CoreJava 笔记总结-第五章 继承

文章目录第五章 继承类、超类和子类定义子类覆盖方法子类构造器多态阻止继承: final类和方法强制类型转换抽象类受保护访问访问控制修饰符小结Object: 所有类的超类Object类型的变量equals方法相等测试与继承hashCode方法toString方法泛型数组列表声明数组列表访问数组列表元素…

WTM系列视频教程:WebApi

文字摘要&#xff1a;“今天跟大家聊聊WTM中的WebApi&#xff0c;WebApi直接继承Controller Base&#xff0c; 他实际上比普通的Controller要更简单&#xff0c;流程更短&#xff0c;因为它不需要处理关于界面的问题。”“实际上如果我们使用普通Controller返回Json&#xff0c…

《C++ Primer》2.1.3节练习

#include <iostream> using namespace std;int main() {cout << "2\x4d\012";cout << "2\tM\n";return 0; }//\x4d输出M //\012输出换行 //\t输出制表符

CoreJava 笔记总结-第六章 接口、lambda表达式与内部类

文章目录第六章 接口、lambda表达式与内部类接口接口的概念接口的属性接口与抽象类静态和私有方法默认方法解决默认方法冲突接口与回调Comparator接口对象克隆lambda表达式函数式接口方法引用构造器引用变量作用域处理lambda表达式再谈Comparator类内部类使用内部类访问对象的状…

【复杂系统迁移 .NET Core平台系列】之静态文件

源宝导读&#xff1a;微软跨平台技术框架—.NET Core已经日趋成熟&#xff0c;已经具备了支撑大型系统稳定运行的条件。本文将介绍明源云ERP平台从.NET Framework向.NET Core迁移过程中的实践经验。一、背景随着ERP的产品线越来越多&#xff0c;业务关联也日益复杂&#xff0c;…

[Abp vNext 源码分析] - 19. 多租户

一、简介ABP vNext 原生支持多租户体系&#xff0c;可以让开发人员快速地基于框架开发 SaaS 系统。ABP vNext 实现多租户的思路也非常简单&#xff0c;通过一个 TenantId 来分割各个租户的数据&#xff0c;并且在查询的时候使用统一的全局过滤器(类似于软删除)来筛选数据。关于…

HTMLCSS 超简单的前端设计入门-2!

文章目录图片元素img元素和a元素连用和map元素和figure元素多媒体元素videoaudio列表元素有序列表无序列表定义列表容器元素div元素语义化容器元素元素包含关系为网页添加样式CSS术语解释选择器声明块CSS代码书写位置常见样式声明选择器简单选择器选择器的组合选择器的并列层叠…

八数码问题I-bfs和map标记

解题思路&#xff1a; bfs&#xff0c;将棋盘转化成一个整数表示其状态&#xff0c;比如我们到到达的状态是815736402&#xff0c;而样例给的输入状态是264137058&#xff0c;因为这些整数过大&#xff0c;标记数组开不下&#xff0c;所以可以用map来代替数组&#xff0c;写得时…

一个迷你ASP.NET Core框架的实现(下)

【框架内幕】| 作者 / Edison Zhou这是恰童鞋骚年的第196篇原创文章上一篇我们了解了AspNetCore.Mini这个项目的背景及项目结构和流程&#xff0c;这一篇我们继续解析几个核心对象。本文整理自A大&#xff08;蒋金楠&#xff09;的主题分享&#xff0c;点击本文底部“阅读原文”…

CoreJava 笔记总结-第七章 异常,断言和日志

文章目录第七章 异常,断言和日志处理错误异常的分类声明检查型异常如何抛出异常创建异常类捕获异常捕获单个异常捕获多个异常再次抛出异常和异常链finally子句try-with-Resource语句分析堆栈轨迹元素使用异常的技巧使用断言使用断言完成参数检查日志基本日志高级日志调试技巧第…

根据后序和中序求二叉树的先序

代码如下&#xff1a; #include <iostream> using namespace std; const int N 1010; int in_order[N], post_order[N], lch[N], rch[N];int build(int inL, int inR, int postL, int postR) {if (inL > inR)return 0;int root post_order[postR];int k inL;while…

CoreJava 笔记总结-第九章 集合

第九章 集合 文章目录第九章 集合Java集合框架集合接口与实现分离Collection接口迭代器泛型实用方法集合框架中的接口具体集合链表数组列表散列集树集优先队列映射映射的基本操作更新映射条目映射视图弱散列试图链接散列集与映射枚举集与映射标识散列映射视图与包装器小集合子范…

30多岁程序员老W,无奈选择转行!问题出在哪?

作者&#xff1a;邹溪源&#xff0c;长沙资深互联网从业者&#xff0c;架构师社区特邀嘉宾&#xff01;一有一天&#xff0c;一位同事跟我说&#xff1a;老w已经改行做美缝去了&#xff0c;你怎么看&#xff1f;我想了想&#xff0c;说&#xff1a;他大概终于做出了眼下最符合他…

一维前缀和

代码如下&#xff1a; #include <iostream> using namespace std; const int N 1010; int a[N], s[N];int main() {int n;cin >> n;for (int i 1; i < n; i) {cin >> a[i];//原数组s[i] s[i - 1] a[i];}for (int i 1; i < n; i)cout << s[…

HttpClientFactory的套路,你知多少?

背景ASP.NET Core 在 2.1 之后推出了具有弹性 HTTP 请求能力的 HttpClient 工厂类 HttpClientFactory。替换的初衷还是简单摆一下&#xff1a;① using(var client new HttpClient()) 调用的 Dispose() 方法并不会立即释放底层 Socket 连接&#xff0c;新建 Socket 需要时间&a…

CoreJava 笔记总结-第十二章 并发-1

第十二章 并发 线程 package chapter12_concurrent.threads;public class ThreadsTest {public static final int DELAY 10;public static final int STEPS 100;public static final double MAX_AMOUNT 1000;public static void main(String[] args) {var bank new Bank(…

走迷宫-双向bfs解法

双向bfs适用于知道起点和终点的状态下使用&#xff0c;从起点和终点两个方向开始进行搜索&#xff0c;可以非常大的提高单个bfs的搜索效率同样&#xff0c;实现也是通过队列的方式&#xff0c;可以设置两个队列&#xff0c;一个队列保存从起点开始搜索的状态&#xff0c;另一个…