java学习&复习,本文主要参照《Java核心技术卷》作为学习对象。
面向对象程序设计OOP
类:封装实例字段+方法
类>继承(is a)/依赖(uses a)/聚合(has a)>类
// 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(); } } }
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:私有
必须初始化,且无法修改指针指向,不过指向的对象可以改变。
private final StringBuilder eva; eva = new StringBuilder(); //必须初始化 eva.append("ok!\n"); //合法
static int number = 1; //静态字段,被类共享 static final double PI = 3.141592653589; //静态常量
static int getNum(){...}
没有隐式函数,直接使用类来调用。eg.Test.getNum()
- 不用对象状态
- 只需访问类的静态字段
类似于LocalDate
,NumberFormat
的构造。
main方法也是静态方法。
按值调用,参数为副本(基本数据类型)。
对象引用,让参数为对象引用,但仍为按值传递。eg.不能swap交换两个类。
- 相同名字
- 不同参数(不包括返回类型)
初始化为默认值。
P.S. 当存在自定义时,需自己写一个无参。
private String name = "";
直接在class中初始化。
public Test(double s){ this("Test "+Double.toString(s)); }
class Test{ private static int Aid = 1; private int id; // 初始化块 // static 如果有,在类第一次加载时运行。 { id = Aid; Aid ++; } //... }
只要构造对象,初始化块就会执行。先运行初始化块。
Java可以自动垃圾回收
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
语句的话,该文件中的类属于无名包。
未指定public
或private
,可以被同一个包访问。
类可以存储于JAR文件中,可以包含多个类文件和子目录。
JAR使用ZIP格式组织文件和子目录。
# 设置类路径 java -classpath ${PATH(JAR)} ${className}; export CLASSPATH=${PATH}; set CLASSPATH=${PATH}
jar cvf jarFileName file1 file2 ...
META-INF/MANIFEST.MF
jar cfm jarName manifestName ...
java -jar jarName
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.java
- package.html 抽取
<body>...</body>
之间的文本
javadoc -encoding UTF-8 -d ../doc Chapter04 #抽取包 javadoc -encoding UTF-8 -d docTest test.java #抽取类
get()
和set()