mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
856 字
2 分钟
Java核心技术卷 学习Day02
2022-07-14

java学习&复习,本文主要参照《Java核心技术卷》作为学习对象。

第四章 对象与类#

1. 类#

面向对象程序设计OOP

类:封装实例字段+方法

类>==继承(is a)/依赖(uses a)/聚合(has a)==>类

DVjasvCERhIqiUH.png

2. 预定义类#

// Math
// Date
Date date = null; //类似于cpp的对象指针
date = new Date();
System.out.println(date.toString());

localDate#

// LocalDate
System.out.println(LocalDate.now());
LocalDate date = LocalDate.now(); //构造当前日期
date = LocalDate.of("year","month","day"); //构造指定日期
int today = date.getDayOfMonth();
int getYear();
int getMonthValue();
int getDayofMonth();
int getDayofWeek(); //1~7
// 先前n天,向后n天
date = date.minusDays(n);
date = date.plusDays(n);
// is闰年
date.isLeapYear();
// 当前年的天数和当前月的天数
date.lengthOfYear();
date.lengthOfMonth();
  • 使用localDate输出当月日历
public class chapter04main {
public static void main(String[] args) {
LocalDate date = LocalDate.now();
int month = date.getMonthValue();
int today = date.getDayOfMonth();
date = date.minusDays(today-1); //当月第一天
DayOfWeek week = date.getDayOfWeek();
System.out.println("Mon Tue Wed Thu Fri Sat Sun");
for(int i=0;i<week.getValue();i++) System.out.printf(" ");
while (date.getMonthValue() == month){
int now = date.getDayOfMonth();
System.out.printf("%3d",now); //输出日期
if(now == today) System.out.printf("*");
else System.out.printf(" ");
date = date.plusDays(1); //下一天
if(date.getDayOfWeek().getValue() == 1) System.out.println();
}
}
}

KiyBMQgl85CdVjU.png

3. 自定义类#

class Test{
//field
private int t;
//constructor
public Test(/*...*/){
//...
}
// method
public void test(int n){
System.out.println("just test");
}
}
  • 运行多个源程序
javac Test*.java
  • 实例化
// 使用构造函数
Test test1 = new Test();
var test2 = new Test();
// 发现null
t = Objects.requireNonNullElse(n,"unknown"); //报警但接收
Objects.requireNonNull(n,"not to be null"); //直接拒绝
  • 显式参数、隐式参数

test1.test(3)中test1即为隐式参数,方法中的3即为显式参数。

  • 封装性

不要返回类的私有对象

  • 访问权限

public:共有

private:私有

  • final

必须初始化,且无法修改指针指向,不过指向的对象可以改变。

private final StringBuilder eva;
eva = new StringBuilder(); //必须初始化
eva.append("ok!\\n"); //合法

4. 静态方法和静态字段#

static int number = 1; //静态字段,被类共享
static final double PI = 3.141592653589; //静态常量
  • 静态方法

static int getNum(){...}

没有隐式函数,直接使用类来调用。eg.Test.getNum()

不用对象状态只需访问类的静态字段

  • 工厂方法

类似于LocalDateNumberFormat的构造。

  • main

main方法也是静态方法。

5. 方法参数#

  • 按值调用(java使用)
  • 按引用调用
  • 按名调用(Algol使用)

按值调用,参数为副本(基本数据类型)。

对象引用,让参数为对象引用,但仍为按值传递。eg.不能swap交换两个类。

6. 对象构造#

  • 重载

相同名字不同参数(不包括返回类型)

  • 无参构造

初始化为默认值。

P.S. 当存在自定义时,需自己写一个无参。

  • 显式字段初始化

private String name = "";直接在class中初始化。

  • 调用this来构造
public Test(double s){
this("Test "+Double.toString(s));
}
  • 初始化块
class Test{
private static int Aid = 1;
private int id;
// 初始化块
// static 如果有,在类第一次加载时运行。
{
id = Aid;
Aid ++;
}
//...
}

只要构造对象,初始化块就会执行。先运行初始化块。

  • 析构

Java可以自动垃圾回收

7. 包#

package

  • 包名
  • 类的导入

直接使用包内的所有类。

使用其他包公共类。

完全限定名

java.time.LocalDate today = java.time.LocalDate.now();

  • import导入

import java.time.*; | import java.time.LocalDate;

只能使用*来导入包,

  • 静态导入

import static java.lang.System.*;

可以直接使用out.println();

package cc.dreaife.chapter04;

没有package语句的话,该文件中的类属于无名包

  • 包访问

未指定publicprivate,可以被同一个包访问。

  • 类路径

类可以存储于JAR文件中,可以包含多个类文件和子目录。

JAR使用ZIP格式组织文件和子目录。

# 设置类路径
java -classpath ${PATH(JAR)} ${className};
export CLASSPATH=${PATH};
set CLASSPATH=${PATH}

8. JAR文件#

  • 创建jar文件

jar cvf jarFileName file1 file2 ...

  • 清单文件

META-INF/MANIFEST.MF

jar cfm jarName manifestName ...

  • 可执行jar文件

java -jar jarName

  • 多版本jar文件

9. 文档注释#

javadoc=>HTML文件

  • 注释位置

模块包公共类和接口公共的、受保护的字段公共的、受保护的构造器和方法

/**...*/ 注释

@ param 标记 + 自由格式文本(第一句概要,可以使用HTML修饰符)

  • 类注释

import后,类定义前

  • 方法注释

@param

参数,可以占多行,可以使用HTML修饰符

  • @return

返回值,可以占多行,可以使用HTML修饰符

  • @throws

抛出异常

/**
* testA
* @param s
* @param num
* @return string
*/
public String testA(String s,int num){
return s + Integer.toString(num);
}
  • 字段注释
  • 通用解释

@author name@since text@version text@see | @link (使用超链接 #包隔类和方法)

  • 包注释

在包目录中添加单独文件。

package-info.javapackage.html 抽取…之间的文本

  • 注释抽取
javadoc -encoding UTF-8 -d ../doc Chapter04 #抽取包
javadoc -encoding UTF-8 -d docTest test.java #抽取类

10. 类设计技巧#

  • 保证数据私有
  • 数据初始化
  • 不要使用过多基本类型
  • 不是所有都需要get()set()
  • 分解过多责任的类
  • 类名和方法名可以体现职责
  • 优先使用不可变类
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Java核心技术卷 学习Day02
https://dreaife.tokyo/posts/java-core-tech-day02/
作者
dreaife
发布于
2022-07-14
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时