java初学随记

零散随记


  • 一个java源文件最多包含一个public类,并且这个类必须与源文件名相同。

  • java中的“==”

    • 基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。
    • 用数据类型:当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。
    • 以后进行字符串相等判断的时候都使用equals()。

命名规则


  1. 包名:每个字母都小写

    常以公司(单位、机构)域名的倒写+包名

    例如:cn.hutool.db.package1

  2. 类名:每个单词的首字母大写

  3. 方法:首单词小写,后续单词的第一个字母大写

  4. 常量:首单词小写,后续单词的第一个字母大写

  5. 接口:开头大写I 后续单词的第一个字母大写

    例如:IUserDAO

Static


  • 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中static表示“全局”或者“静态”的意思
  • static方法:被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过名去进行访问。类加载时(注意不是对象加载,是类加载,下面同理)在类对象中分配入口地址,只分配一个入口地址。
  • static变量:该类所有的实例都共享静态变量,可以直接通过名来访问它。类加载时在类对象中分配存储空间,只分配一个存储空间,任何地方改变都是一致的。

1.类是对象的抽象,而对象是类的具体实例。 类是抽象的,不占用内存,而对象是具体的,占用存储空间。2.与C/C++中的static不同,Java中的static关键字不会影响到变量或者方法的作用域。在Java中能够影响到访问权限的只有private、public、protected(包括包访问权限)这几个关键字

static修饰的静态方法会随着类的定义而被分配和装载入内存中,编译器只为整个类创建了一个静态变量的副本,也就是只分配一个内存空间,虽然可能有多个实例,但这些实例共享该内存,特别值得注意的是,任何一个对象对静态数据成员的修改,都会影响其它对象

局部变量不能用static变量修饰。它的有效范围只是方法内部,执行结束即释放空间

Java中static方法和普通方法的区别

Java中对象的声明、初始化、实例化


  1. 声明对象

    1
    2
    //类名+对象名
    Student a;

    声明一个对象变量,并不会分配一个完整的对象所需要的内存空间,只是将对象名所代表的变量看成是一个引用变量,并为它分配所需内存空间,它所占用的空间远远小于一个类的对象所需要的空间。

    所以对象变量只是指向一个对象,但使用它可以访问对象中的成员
    如此处理,使得Java中声明一个对象的消耗很小,但也有一个副作用,就是对象不能马上使用,还需要对它进行实例化。

  2. 实例化

    1
    2
    //引用变量=new 构造方法(参数列表)
    a=new Student();

    实例化的过程就是为对象分配内存空间的过程,此时,对象才成为类的实例。new所执行的具体操作是调用相应类中的构造方法(包括祖先类的构造方法),来完成内存分配以及变量的初始化工作,然后将分配的内存地址返回给所定义的变量
    实质:实例化了就有自己内存空间。而没有实例化就和引用的对象内存空间地址相同,指向同一个空间。

摘选自:[Java] 对象的声明与实例化

NEW过程中发生了什么:java中”new”关键字的作用及含义

java类的初始化和实例化区别

加载:通过类名获取类的二进制字节流是通过类加载器来完成的。其加载过程使用“双亲委派模型”

验证:当一个类被加载之后,必须要验证一下这个类是否合法,比如这个类是不是符合字节码的格式、变量与方法是不是有重复、数据类型是不是有效、继承与实现是否合乎标准等等。总之,这个阶段的目的就是保证加载的类是能够被jvm所运行。

准备:为类变量(静态变量)在方法区分配内存,并设置零值。注意:这里是类变量,不是实例变量,实例变量是对象分配到堆内存时根据运行时动态生成的。

解析:把常量池中的符号引用解析为直接引用:根据符号引用所作的描述,在内存中找到符合描述的目标并把目标指针指针返回。

初始化:类的初始化过程是这样的:按照顺序自上而下运行类中的变量赋值语句和静态语句,如果有父类,则首先按照顺序运行父类中的变量赋值语句和静态语句在类的初始化阶段,只会初始化与类相关的静态赋值语句和静态语句,也就是有static关键字修饰的信息,而没有static修饰的赋值语句和执行语句在实例化对象的时候才会运行。执行<clinit>()方法(clinit是class initialize的简写)

实例化:在堆区分配内存空间,执行实例对象初始化,设置引用变量a指向刚分配的内存地址

声明、初始化、实例化的区别

声明是指使用一个对象的时候,先定义属于哪个类型,比如string _str;

_str是声明(定义)了一个string类型的对象。

初始化可以理解为给声明的对象赋值的过程。string _str =”hello”;

_str现在已经被初始化了,实例化后它具有“hello”这个值。

实例化是类用到的,A a = new A();当new的时候为对象分配内存,这个过程是对象的实例化。

总结:

声明,只生成对象不赋值的过程

初始化,是给对象赋值的过程

实例化,是使用new为对象分配内存的过程

static和对象关系


两类对象:1.类对象:一个类被加载后,系统为这个类创建一个类对象,用于储存整个类的信息。

2.对象:使用new调用构造方法后,系统会创建一个该类的对象,用于储存属于该对象本身的信息

静态成员和非静态成员:1.静态成员变量:类加载时在类对象中分配储存空间,只有一个,能够被该类所有的对象所共享。

2.非静态成员变量:创建对象时在对象中分配储存空间,每个对象有属于自己的一个,各自独立

3.静态成员方法:类加载时在类对象中分配入口地址只有一个,能够被该类所有的对象所共享

4.非静态成员方法:首次创建对象时类对象中分配入口地址,只有一个,能够被后续的的对象所共享

静态成员的使用:1.静态成员变量:常用于一个类所有对象需要共享这个变量。如PI、E等。

2.静态成员方法:常用于一个方法的使用和成员变量无关时(这样不用创建对象,可以通过类名直接调用,节省创建对象的空间

函数重载


判断依据:形参的:1.个数2.类型3.顺序

不能把返回值作为函数重载的条件,原因是编译器在编译时不会去判断函数的返回类型,函数只有调用后,编译器才会去验证返回类型,所以返回值不能作为函数重载的依据。

总之,重载函数,参数必须改变,不能有一样的参数列表

可变参数


在定义方法时,在最后一个形参后加上三点 ,就表示该形参可以接受多个参数值,多个参数值被当成数组传入。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Varable {
public static void main(String[] args) {
System.out.println(add(2, 3));
System.out.println(add(2, 3, 5));
}

public static int add(int x, int... args) {
int sum = x;
for (int i = 0; i < args.length; i++) {
sum += args[i];
}
return sum;
}
}

注意事项: 1. 满足多个重载方法时,优先选择固定参数的方法

​ 2.若和多个带可变参数方法能匹配,则重载出错所以尽量避免可变参数重载

​ 3.调用方法时可变参数不能为空或者‘null’

其他注意事项:https://www.runoob.com/w3cnote/java-varargs-parameter.html

输入输出


使用Scanner

输入:

1
2
3
4
5
6
//首先创建Scanner对象
Scanner in = new Scanner(System.in);
//之后转化为自己需要的类型
int a=in.nextInt();
double b=in.nextDouble();
String s=in.nextLine();

输出:

1
2
3
System.out.printf("%d",a);
System.out.printf("%f",b);
System.out.printf("%s",s);

常用类


参考:

Java常用类总结

java中的常用类

1.java.util.Random

  1. nextInt() 生成一个随机的int值,该值介于int的区间,也就是2^31 到2^31-1之间。

  2. nextLong() 生成一个随机的long值,该值介于long的区间,也就是2^63 到2^63-1之间。

  3. nextInt(int bound) 生成一个随机的int值,该值介于[0,n)的区间。

  4. nextBoolean()生成一个随机的boolean值,生成true和false的值几率相等,也就是都是50%的几率。

  5. nextDouble() 生成一个随机的double值,数值介于[0,1.0)之间。

  6. nextFloat() 生成一个随机的float值,数值介于[0,1.0)之间。

  7. Math中也有一个random,其本质就是使用nextDouble()。Math.random()生成一个[0,1.0)区间的随机小数

    其他使用:Javadocs

    JAVA的Random类

2.java.lang.Math

  1. Math.sqrt() //计算平方根
  2. Math.cbrt()//计算立方根
  3. Math.pow(a, b)//计算a的b次方
  4. Math.log()//计算自然对数
  5. Math.abs(); *//计算绝对值 *
  6. Math.random();//产生0-1的随机浮点数,若想随机生成整数,还得乘以100并且强制转换即: (int) (Math.random() * 100)
  7. Math.exp(x)//计算e^x的值
  8. Math.hypot(x,y)//计算 (x的平方+y的平方)的平方根
  9. Math.max(a,b);//计算两个数中的最大值,两个数类型一致
  10. Math.min(a,b);//计算两个数中的最小值,两个数类型一致
  11. Math.floor()//地板(floor),向下取整
  12. Math.ceil() //天花板(ceil),向上取整
  13. Math.round()//四舍五入取整float时返回int值,double时返回long值
  14. Math.rint 四舍五入 //返回double值
  15. Math.nextUp(a) //返回比a大一点点的浮点数
  16. Math.nextDown(a) //返回比a小一点点的浮点数
  17. Math.nextAfter(a,b) //返回(a,b)或(b,a)间与a相邻的浮点数 b可以比a小
  18. Math.cos求余弦 sin求正弦 tan求正切 acos求反余弦 asin求反正弦 atan求反正切 atan2(y,x)求向量(x,y)与x轴夹角
  19. Math.log10(a) //a 的底数为10的对数
  20. Math.log1p(a) //a+1的自然对数
  21. Math.toDegrees(a) //弧度换角度
  22. Math.toRadians(a) //角度换弧度
  23. Math.PI//
  24. Math.E//

访问级别


修饰符类内类外
private可以访问不可访问
默认可以访问只有同一个包内的类可以访问,即便是子类,如果和父类不在同一包中,也不能继承默认变量
protected可以访问允许它允许任何包中的子类访问以及同一个包中的其他类访问
public可以访问可以访问
No.位置privatedefaultprotectedpublic
1本类
2本包中×
3不同包的子类××
4不同包的非子类×××

异常


1、java中自带异常类:

2、try-catch块等用来捕获异常。

  • 常用来捕获:空地址、数组越界等常规异常
  • 其输出可为java异常类各种类型方法的输出
  • 使用捕获异常,可以直接输出设置的或者自带的错误信息,而不是产生编译失败等错误

3、自己有特殊需要的异常判定—自定义异常方法、自定义异常类

  • 自定义异常类:通过继承java自带异常类实现
  • 自定义异常方法:

常用自定义异常方法来构建特殊条件异常判断,例如判断三角形构造“

1
2
3
4
5
6
7
8
9
public Triangle(double a,double b,double c) throws RuntimeException{
if(a+b<=c||a+c<=b||b+c<=a) {
RuntimeException ex=new RuntimeException("This is not a Triangle");
throw ex;
}
this.a=a;
this.b=b;
this.c=c;
}

该方法必须使用 throws 关键字来声明,throws 关键字放在方法签名的尾部

也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。

一个方法可以声明抛出多个异常,多个异常之间用逗号隔开

4、finally 关键字

finally 关键字用来创建在 try 代码块后面执行的代码块。

无论是否发生异常,finally 代码块中的代码总会被执行。

在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。

接口


JAVA接口

JDK1.8中接口静态方法和默认方法

  • 静态方法,只能通过接口名调用,不可以通过实现类的类名或者实现类的对象调用。default方法,只能通过接口实现类的对象来调用。
  • 由于接口中方法默认为public abstract 变量默认为public static abstract所以子接口的内容永远>=父接口的内容

JAVA DB数据库初步了解


一些基础概念

数据库:数据库是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合,可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。

DBMS:数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管理员也通过DBMS进行数据库的维护工作。

RDBMS:关系数据库管理系统(Relational Database Management System:RDBMS)是指包括相互联系的逻辑组织和存取这些数据的一套程序 (数据库管理系统软件)。关系数据库管理系统就是管理关系数据库,并将数据逻辑组织的系统。

DBMS和RDBMS:DBMS是过去的50年中所出现的不同类型数据库管理技术的总称。RDBMS是DBMS的一种

它的特点是使用一个基于行的表结构,将相关数据元素连接到一起,保证事务完整性,并维护数据的准确性和一致性。RDBMS的另一个显著属性是支持结构化查询语言(SQL)。近年来,一些非关系型数据库系统开始兴起但是目前关系数据库仍然是大多数IT架构的中心。

JAVA DB(Derby): javadb就是一种关系数据库管理系统。Java DB是Apache Derby项目(Apache软件基金会(ASF)的开源关系数据库项目)的Oracle版本Apache Derby是纯Java,基于标准的关系数据库引擎

API:Application Programming Interface应用程序编程接口,是软件系统不同组成部分衔接的约定

JDBC:JDBC (Java Database Connectivity) API,即Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序可以访问各种不同类型的数据库。比如建立数据库连接、执行SQL语句进行数据的存取操作。

JDBC体系和核心组件

一般情况下,在应用程序中进行数据库连接,调用JDBC接口,首先要将特定厂商的JDBC驱动实现加载到系统内存中,然后供系统使用。基本结构图如下:

应用程序–>链接数据库——>调用JDBC API接口——>特定厂商的JDBC驱动加载和JDBC Driver对接–>使用DriverMannager对多个Driver 管理—>连接完成通过JDBC API中的各种类对数据库进行操作

JDBC核心组件

DriverManager:此类管理数据库驱动程序列表。使用通信子协议将来自java应用程序的连接请求与适当的数据库驱动程序匹配。

Driver:此接口处理与数据库服务器的通信,我们很少会直接与Driver对象进行交互。而是使用DriverManager对象来管理这种类型的对象

Connection:该界面具有用于联系数据库的所有方法。连接对象通信上下文,即,与数据库的所有通信仅通过连接对象。

Statement:使用从此接口创建的对象将SQL语句提交到数据库。除了执行存储过程之外,一些派生接口还接受参数。

ResultSet: 在使用Statement对象执行SQL查询后,这些对象保存从数据库检索的数据。它作为一个迭代器,允许我们移动其数据。

SQLException:此类处理数据库应用程序中发生的任何错误

JDBC URL

URL:Uniform Resource Locator统一资源定位符

JDBC URL:

jdbc:主协议;固定为:jdbc subprotocol:子协议;由 DBMS 类型确定,如:derby subname:数据库信息;由具体的数据库名字确定

基本SQL语句

表操作

1.创建表

create table 表名(列名1 类型1 修饰1, 列名2 类型2 修饰2, …)

1
create  table  "APP".CHOICE (	DESCRIPTION  VARCHAR(1000)  not  null,	STANDARDANSWER  VARCHAR(4)  not  null,	KNOWLEDGE  INTEGER  default  0  not  null,	DIFFICULTY  INTEGER  default  0  not  null)

2.删除表

1
drop table 表名

3.修改表名

1
rename  table  表名  to  新表名
行操作

1.插入记录(增)

1
2
3
4
insert  into  表名(列名1, …)  values(值1,  …)
//省略列名时则默认为全部列,后面的值与前面的列一一对应对应
Insert into choice VALUES(‘…’, ‘AB’, 0, 1)
//字符型用单引号,内部单引号用两个单引号表示

2.删除记录(删)

1
2
3
delete   from  表名  where  条件表达式
//省略where子句将会删除所有记录,慎用!
delete from score where 姓名=‘王二’

3.更新记录(改)

1
2
3
update  表名  set  列名=值  where  条件表达式
//省略where子句将会更新所有记录,慎用!
update score set 姓名=‘王三’ where 姓名=‘王二’

4.查询记录(查)

1
2
3
4
5
6
SELECT 语句
SELECT 姓名,成绩 FROM SCORE WHERE C1>80
SELECT * FROM stu WHERE 姓名 LIKE ‘张%’
SELECT * FROM stu ORDER BY 成绩
select * from choice where knowledge=1 and difficulty=0
Select * from choice //选出表中的所有记录(整个表)
列操作

1.添加列(增)

1
2
alter  table  表名  add  字段名  数据类型
alter table 成绩表 add 姓名 varchar(6)

2.删除列(删)

1
2
alter   table  表名  drop  字段名
alter table 成绩表 drop 性别

3.修改列(改)

1
2
alter  table  表名  alter  字段名  set  data  type  数据类型
alter table 成绩表 alter 姓名 set data type varchar(8)

访问数据库

1、通过DriverManager获取Connection对象,链接数据库

使用DriverManager类来获取的Connection连接,是无法重复利用的。如果close()后要想再利用,必须重新创建连接,所以没有完成对数据库的所有操作之前,一般不要close掉

常用方法:

  • public static Connection getConnection(String url, String user, String password)返回Connection对象

2、通过Connection对象方法,建立该链接数据库的Statement类或者其子类对象用于执行SQL指令等。

​ 主要方法:

  • Statement stmt = conn.createStatement(int, int);创建向数据库发送sql的statement对象。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
参数1:结果集游标的滚动类型及对数据库变化的反映
ResultSet.TYPE_FORWARD_ONLY
//默认参数结果集的游标只能向下滚动。 ;
ResultSet.TYPE_SCROLL_INSENSITIVE
//结果集的游标可以上下移动,当数据库变化时,当前结果集不变。
ResultSet.TYPE_SCROLL_SENSITIVE
//返回可滚动的结果集,当数据库变化时,当前结果集同步改变。
参数2:是否能用结果集对数据库进行更新
ResultSet.CONCUR_READ_ONLY
//默认参数不能用结果集更新数据库中的表。
ResultSet.CONCUR_UPDATABLE
//能用结果集更新数据库中的表。

Statement stmt = conn.createStatement(); //参数取默认值

PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement

  • PreparedStatement prepareStatement(String sql);该方法返回预编译的Statement对象,即将SQL语句提交到数据库进行预编译;
1
2
3
4
5
6
7
例如:
PreparedStatement stmt = conn.prepareStatement("select * from choice where knowledge=? and difficulty=?", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY );
设定参数
stmt.setXxx(n, x); //n – 参数位置,x – 参数值
例如:
stmt.setInt(1, 3);
stmt.setInt(2, 1);
  • prepareCall(sql):创建执行存储过程的callableStatement对象。

3、通过Statement类或者其子类对象方法,执行SQL指令等,返回指令的结果集

主要方法:

  • ResultSet executeQuery(String sql)该方法用于执行查询语句,并返回查询结果对应ResultSet对象。该方法只能用于执行查询语句。
  • int executeUpdate(String sql)用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零 可以配合PreparedStatement对象,完成参数设置后,执行executeUpdate()即可更新数据库
  • boolean execute(String sql) 该方法可以执行任何sql语句。如果执行后第一个结果为ResultSet对象,则返回true;如果执行后第一个结果为受影响的行数或没有任何结果,则返回false;

4、通过ResultSet对象接受Statement类或者其子类对象用于执行SQL指令后的结果集。

​ 主要方法:

  • boolean next() 将结果集的记录指针定位到下一行,如果移动后的记录指针指向一条有效的记录,则该方法返回true;
  • boolean Previous()移动到前一行
  • boolean absolute( int row )将结果集的记录指针移动到第row行,如果row是负数,则移动到倒数第row行,如果移动后的记录指针指向一条有效记录,则该方法返回true;
  • beforeFirst()移动resultSet的最前面。
  • afterLast()移动到resultSet的最后面。

值得注意的是,在ResultSet集合中初始指针指向为表头(行0,是表格的描述一行非数据行)

在ResultSet集合,行从0开始列从1开始

  • int getInt(int); //使用列号,从 1 开始计,从左到右获取指针指向的行的某列数据
  • int getInt(String); //使用列名获取指针指向的行的某列数据
  • boolean last()将结果集的记录指针定位到最后一行,如果移动后的记录指针指向一条有效的记录,则该方法返回true;
  • void close()释放ResultSet对象;

5、异常处理

​ try-catch

参考和建议阅读文章

JAVA数据库链接基础知识

关于JDBC的简介(简介)(体系)(核心)(语法)

JDBC层次结构和基本构成

JDBC常用接口和类

createStatement的参数

JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查

jdbc就是这么简单

java界面开发基础


Eclipse进行可视化插件——WindowBuilder的安装

Java-GUI快速入门—简介界面开发原理,主要为Swing

WindowsBuilder的基础使用教程

netBeans中集成了可视化开发可以直接使用

windousbuilder使用Tip
  • 先将absolutelayout拖入到Jframe中就可以自由组合各种器件了适合新手

  • 添加器件的时候除了点击器件然后放入面板,还可以点击器件,放入到companies想要放入的相应的位置(适合直接放入面板不方便的适合

    例如:点击Jpanal

    在companiers放入到tabbedPane中!

Swing组件中的常用容器(Containers)

1、Jpanal(面板)

可以将若干相关的组件布局在一 起,形成一个组合体。

2、JTabbedPane(标签化窗格或叫选项卡面板)

JTabbedPane选项卡面板实现了一个多卡片的用户界面,通过它可以将一个复杂的对话框分割成若干个选项卡,实现对信息的分类显示和管理,使界面更简洁大方,还可以有效地减少窗体的个数。

3、JSplitPane(拆分窗格或叫分割面板)

拆分窗格是一种能够将若干容器按照横向或纵向方式进行布局的容器,并且可以通 过拖拽分割条的方式实现容器尺寸的改变。

4、JToolBar(工具栏)

一个用来显示常用控件的容器组件通常按钮 类型居多,通过结合文本和图标以更加形象直观的方式进行展示,一般位于菜单栏的下方,也可以设置为可浮动的形式。

Swing组件中的常用控件(Companies)

1、JLabel(标签)

标签通常用来表示静态的文本或图标内容,用于提示某些组件的作用等

2、JTextField(文本字段)

文本字段用于输入单行文本。

3、JPasswordField(口令字段)

用设定字符屏蔽输入内容,常用于密码输入字段

4、JButton(按钮)

它会触发动作事件以实现若干功能和操作

5、JTextArea(文本区域)

文本区域用于输入多行文本,该组件自动与滚动窗格相结合实现文本的横向和纵向 滚动。

6、JRadioButton(单选按钮)和ButtonGroup(按钮组件)

它常用于将若干互斥的状态或功能组织在一起,常常与ButtonGroup组件一起使用

Netbeans中可以通过可视化操作,windowbuilders需要自行添加ButtonGroup代码

添加ButtonGroup代码

7、JCheckBox(复选框)

8、JComboBox(组合框)

组合框是一种将若干条目组织在一起,通过下拉列表的形式进行选择,通常只显示 其中的一个条目,占用界面空间少。

9、JSeparator(分隔符)

它能够 使界面的区域划分看上去更加清晰。

10、JList(列表框)

列表框是一种将若干条目组织在一起的组件,它可以同时显示出多个条目,并结合滚动条实现条目的滚动显示,并能够以图标方式进行更加直观的展示,较为复杂。

11、JTable(表格)

表格是一种更加复杂的组件,它能够以二维表格的形式展示数据,并可以进行大量 的属性设置和编码操作,支持与滚动窗格的自动结合。

12、JToggleButton(开关按钮)
13、JSlider(滑块)、JProgressBar(进度栏)JSpinner(微调器)****

Swing组件中的常用菜单(Menu)

1、JMenuBar(菜单栏)

2、JMenu(菜单)

在菜单栏上添加菜单

3、JMenuItem(菜单项)

4、JCheckBoxMenuItem(复选框菜单项)、JRadioButtonMenuItem(单选按钮菜单项)

复选框菜单项:

单选菜单项也需要按钮组配合产生单选效果:

5、JPopupMenu(弹出式菜单)

弹出式菜单是一种用途非常广泛的组件,它通常通过右键单击进行显示,对于用户 执行相关的功能带来了极大的方便。弹出式菜单也是一种在界面上不可见的组件。使用时需要自行对其添加额外代码

Java文件操作


Java日期操作


常用日期类:

  • *java.text.SimpleDateFormat *
  • *java.util.Date *
  • *java.util.Calendar *

获取当前日期(Calendar->Date):

1
2
3
Calendar now = Calendar.getInstance();
Date date = now.getTime(); //直接取得一个 Date 类型的日期,默认为当前时间,可以是操作后的。
//输出date得到:Mon Jun 22 17:18:12 CST 2020

当前日期的加减:

1
2
3
4
5
6
Calendar now = Calendar.getInstance();
now.add(Calendar.YEAR, 1);//数字可变,代表加多少年,可为负数,向前推
now.add(Calendar.MONTH, 1);//数字可变,代表加多少月,可为负数,向前推
now.add(Calendar.DATE, 1);//数字可变,代表加多少日,可为负数,向前推
//其他小时、秒等自行查阅JDK或者百度
Date date = now.getTime(); //加减后取得一个 Date 类型的日期

日期格式化为字符串(Date->String):

1
2
3
4
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd ");
Calendar now = Calendar.getInstance();
Date date = now.getTime(); //直接取得一个 Date 类型的日期
String dateString=sdf.format(date);//获取时间模板化后的String

其他格式化模板再查询。

例如:”yyyy-MM-dd HH:mm:ss” 即”2016-01-01 11:11:11”

字符串格式重新化为日期(String->Date):

1
2
3
4
5
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd ");
Calendar now = Calendar.getInstance();
Date date = now.getTime(); //直接取得一个 Date 类型的日期
String dateString=sdf.format(date);//获取时间模板化后的String
Date date2 = sdf.parse(dateString);//时间模板化后的String重新转化为日期

日期之间的比较:

1
2
3
4
5
6
Calendar now = Calendar.getInstance();
Date date1=now.getTime();
now.add(Calendar.YEAR, 1);
Date date2=now.getTime();
System.out.println(date1.before(date2));
//结果是true

Date->Calendar:

1
2
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);

计算日期之间相隔的天数

1
2
3
4
5
6
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss");
Calendar now = Calendar.getInstance();
Date date1=now.getTime();
Date date2=sdf.parse("2020-04-23-14:45:30");
int day =(int) ((date1.getTime()-date2.getTime())/(60*60*24*1000));
System.out.println(day);
-----------------------本文结束 感谢阅读-----------------------
坚持原创技术分享,您的支持将鼓励我继续创作!恰饭^.^~