❤️💕💕java的学习指南,从入门到大师篇章。Myblog:http://nsddd.top
[TOC]
jshell> var scanner = new Scanner(System.in)
scanner ==> java.util.Scanner[delimiters=\p{javaWhitespace}+] ... \E][infinity string=\Q∞\E]
jshell> scanner.nextInt()
123
$2 ==> 123
jshell> scanner.nextInt()
1241254
$3 ==> 1241254
jshell> scanner.nextInt()
123
$4 ==> 123
jshell> $2 + $4
$5 ==> 246
该类Scanner
用于获取用户输入,可在java.util
包中找到。
要使用Scanner
该类,请创建该类的一个对象并使用Scanner
类文档中的任何可用方法。在我们的示例中,我们将使用nextLine()
用于读取字符串的方法:
import java.util.Scanner; // Import the Scanner class
class Main {
public static void main(String[] args) {
Scanner myObj = new Scanner(System.in); // Create a Scanner object
System.out.println("Enter username");
String userName = myObj.nextLine(); // Read user input
System.out.println("Username is: " + userName); // Output user input
}
}
在上面的示例中,我们使用了nextLine()
用于读取字符串的方法。要阅读其他类型,请查看下表:
Method | Description |
---|---|
nextBoolean() |
Reads a boolean value from the user |
nextByte() |
Reads a byte value from the user |
nextDouble() |
Reads a double value from the user |
nextFloat() |
Reads a float value from the user |
nextInt() |
Reads a int value from the user |
nextLine() |
Reads a String value from the user |
nextLong() |
Reads a long value from the user |
nextShort() |
Reads a short value from the user |
在下面的示例中,我们使用不同的方法来读取各种类型的数据:
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner myObj = new Scanner(System.in);
System.out.println("Enter name, age and salary:");
// String input
String name = myObj.nextLine();
// Numerical input
int age = myObj.nextInt();
double salary = myObj.nextDouble();
// Output input by user
System.out.println("Name: " + name);
System.out.println("Age: " + age);
System.out.println("Salary: " + salary);
}
}
double浮点型可能会出现浮点数精度丢失问题(这是计算机底层的问题),普片用的IEE754的标准
Java 没有内置的 Date 类,但我们可以导入java.time
包来使用日期和时间 API。该软件包包括许多日期和时间类。例如:
Class | Description |
---|---|
LocalDate |
Represents a date (year, month, day (yyyy-MM-dd)) |
LocalTime |
Represents a time (hour, minute, second and nanoseconds (HH-mm-ss-ns)) |
LocalDateTime |
Represents both a date and a time (yyyy-MM-dd-HH-mm-ss-ns) |
DateTimeFormatter |
Formatter for displaying and parsing date-time objects |
要显示当前日期,请导入java.time.LocalDate
类并使用其now()
方法:
import java.time.LocalDate; // import the LocalDate class
public class Main {
public static void main(String[] args) {
LocalDate myObj = LocalDate.now(); // Create a date object
System.out.println(myObj); // Display the current date
}
}
输出将是:
2022-09-08
要显示当前时间(小时、分钟、秒和纳秒),请导入java.time.LocalTime
类并使用其now()
方法:
import java.time.LocalTime; // import the LocalTime class
public class Main {
public static void main(String[] args) {
LocalTime myObj = LocalTime.now();
System.out.println(myObj);
}
}
输出将是:
15:03:55.634269
要显示当前日期和时间,请导入java.time.LocalDateTime
类并使用其now()
方法:
import java.time.LocalDateTime; // import the LocalDateTime class
public class Main {
public static void main(String[] args) {
LocalDateTime myObj = LocalDateTime.now();
System.out.println(myObj);
}
}
输出将是:
2022-09-08T15:03:55.634305
上例中的“T”用于分隔日期和时间。您可以使用DateTimeFormatter
该类与ofPattern()
同一包中的方法来格式化或解析日期时间对象。以下示例将从日期时间中删除“T”和纳秒:
import java.time.LocalDateTime; // Import the LocalDateTime class
import java.time.format.DateTimeFormatter; // Import the DateTimeFormatter class
public class Main {
public static void main(String[] args) {
LocalDateTime myDateObj = LocalDateTime.now();
System.out.println("Before formatting: " + myDateObj);
DateTimeFormatter myFormatObj = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
String formattedDate = myDateObj.format(myFormatObj);
System.out.println("After formatting: " + formattedDate);
}
}
输出将是:
Before Formatting: 2022-09-08T15:03:55.635372After Formatting: 08-09-2022 15:03:55
如果您想以不同的格式显示日期和时间,该ofPattern()
方法接受各种值。例如:
Value | Example |
---|---|
yyyy-MM-dd | "1988-09-29" |
dd/MM/yyyy | "29/09/1988" |
dd-MMM-yyyy | "29-Sep-1988" |
E, MMM dd yyyy | "Thu, Sep 29 1988" |
变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。
内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。
因此,通过定义不同类型的变量,可以在内存中储存整数、小数或者字符。
Java 的两大数据类型:
- 内置数据类型
- 引用数据类型
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
byte:
- byte 数据类型是8位、有符号的,以二进制补码表示的整数;
- 最小值是 -128(-2^7^);
- 最大值是 127(2^7^-1);
- 默认值是 0;
- byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;
- 例子:
byte a = 100
,byte b = -50
。
short:
- short 数据类型是 16 位、有符号的以二进制补码表示的整数
- 最小值是 -32768(-2^15^);
- 最大值是 32767(2^15^ - 1);
- Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一;
- 默认值是 0;
- 例子:short s = 1000,short r = -20000。
int:
- int 数据类型是32位、有符号的以二进制补码表示的整数;
- 最小值是 -2,147,483,648(-2^31^);
- 最大值是 2,147,483,647(2^31^ - 1);
- 一般地整型变量默认为 int 类型;
- 默认值是 0 ;
- 例子:
int a = 100000
,int b = -200000
。
一般新的编程语言比如说Golang,分为
int32
和int64
,在没有特别声明情况下默认是int64
,这是和C语言不一样的。
long:
- long 数据类型是 64 位、有符号的以二进制补码表示的整数;
- 最小值是 -9,223,372,036,854,775,808(-2^63^);
- 最大值是 9,223,372,036,854,775,807(2^63^ -1);
- 这种类型主要使用在需要比较大整数的系统上;
- 默认值是 0L;
- 例子:
long a = 100000L
,longb = -200000L
。 "L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。
float:
- float 数据类型是单精度、32位、符合
IEEE 754
标准的浮点数; - float 在储存大型浮点数组的时候可节省内存空间;
- 默认值是 0.0f;
- 浮点数不能用来表示精确的值,如货币;
- 例子:
float f1 = 234.5f
。
对于同样使用
IEE754
标准的Go语言来说,内置的浮点数很容易出现精度丢失问题,需要引入包。
double:
-
double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数;
-
浮点数的默认类型为 double 类型;
-
double类型同样不能表示精确的值,如货币;
-
默认值是 0.0d;
-
例子:
double d1 = 7D ; double d2 = 7.; double d3 = 8.0; double d4 = 8.D; double d5 = 12.9867;
7 是一个 int 字面量,而 7D,7. 和 8.0 是 double 字面量。
boolean:
- boolean数据类型表示一位的信息;
- 只有两个取值:true 和 false;
- 这种类型只作为一种标志来记录 true/false 情况;
- 默认值是 false;
- 例子:
boolean one = true
。
char:
- char 类型是一个单一的 16 位 Unicode 字符;
- 最小值是
\u0000
(十进制等效值为 0); - 最大值是
\uffff
(即为 65535); - char 数据类型可以储存任何字符;
- 例子:
char letter = 'A'
;。
定义一个方法来计算两个整数的和
class Aa {
static int add(int a, int b) {
System.out.println("求幂= "+Math.pow(a, b));
return a + b;
}
public static void main(String[] args) {
System.out.println("hello word 你好");
int c = add(2,3);
System.out.println("求和 c = "+c);
}
}
编译:
PS D:\文档\git\java\code> java .\2.java
hello word 你好
求幂= 8.0
求和 c = 5
重载有以下的好处:
- 减轻了起名的麻烦
- 减轻了记名的麻烦
例如:求两个数的和:
public static int add(int inta,int intb) {
return inta + intb;
}
public double add(double inta,double intb) {
return inta + intb;
}
public double add(double inta,int intb) {
return inta + intb;
}
public double add(int inta,double intb) {
return inta + intb;
}
上面的三个方法名称相同,功能相同,参数个数不同 –> 使用可变参数优化
int...
表示接受的是可变参数,类型是int
,所以你还可以写成double...
- 使用可变参数的时候,可当作数组来使用,即nums可以当作数组
可变参数的实参可以是数组
案例:
public class VarParameterDetail {
public static void main(String[] args) {
int[] arr = {1,2,4};
T t = new T();
t.f1(arr);
}
}
class T {
public void f1(int... nums) {
System.out.println("长度 = " + nums.length); //3
}
}
如果你把可变参数和普通的类型参数放在一起的时候,必须保证可变参数在最后
public void f1(double d2,double... nums) {
System.out.println("d2 = " + d2 + "长度 = " + nums.length);
}
重写快捷键:Alt+Insert==>override
满足条件:
-
方法名必须相同
-
参数列表必须相同
-
修饰符:范围可以扩大但不能缩小:
public>Protected>Default>private
-
抛出的异常:范围可以缩小,但不能扩大;
ClassNotFoundException-->Exception(大)
因为面对对象的特性,我们需要用package来管理项目,称之为包管理工具
package表示当前的包
import表示导入包,当你的类需要导入另一个类时候使用,此时需要判断
- 在同一个包
- 不在同一个包
有规定,类名必须大写,大写表示public,而小写表示private
符合模块化的程序设计
Java 中的包用于对相关类进行分组。将其视为 文件目录中的文件夹。我们使用包来避免名称冲突,并编写更好的可维护代码。包分为两类:
- 内置包(来自 Java API 的包)
- 用户定义的包(创建自己的包)
Java API 是一个预先编写的类库,可以免费使用,包含在 Java 开发环境中。
该库包含用于管理输入、数据库编程等的组件。完整列表可在 Oracle 网站上找到:
该库分为包和类。这意味着您可以导入单个类(及其方法和属性),也可以导入包含属于指定包的所有类的整个包。
要使用库中的类或包,您需要使用import
关键字:
import package.name.Class; // Import a single class
import package.name.*; // Import the whole package
如果你找到一个你想使用的Scanner
类,例如用于获取用户输入的类,请编写以下代码:
import java.util.Scanner;
在上面的例子中,java.util
是一个包,而是包Scanner
的一个类java.util
。
要使用Scanner
该类,请创建该类的一个对象并使用Scanner
类文档中的任何可用方法。在我们的示例中,我们将使用nextLine()
用于读取完整行的方法:
使用Scanner
类获取用户输入:
import java.util.Scanner;
class MyClass {
public static void main(String[] args) {
Scanner myObj = new Scanner(System.in);
System.out.println("Enter username");
String userName = myObj.nextLine();
System.out.println("Username is: " + userName);
}
}
有很多套餐可供选择。在前面的示例中,我们使用Scanner
了包中的类java.util
。这个包还包含日期和时间工具、随机数生成器和其他实用程序类。
要导入整个包,请以星号 ( *
) 结束句子。以下示例将导入java.util
包中的所有类:
import java.util.*;
要创建自己的包,您需要了解 Java 使用文件系统目录来存储它们。就像您计算机上的文件夹一样:
例子:
└── root └── mypack └── MyPackageClass.java
要创建包,请使用package
关键字:
package mypack;
class MyPackageClass {
public static void main(String[] args) {
System.out.println("This is my package!");
}
}
将文件保存为MyPackageClass.java并编译它:
C:\Users\Your Name>javac MyPackageClass.java
然后编译包:
C:\Users\Your Name>javac -d . MyPackageClass.java
这会强制编译器创建“mypack”包。
-d
关键字指定保存类文件的目的地。您可以使用任何目录名称,例如 c:/user (windows),或者,如果您想将包保存在同一目录中,您可以使用点号“.
”,如上例所示。
**注意:**包名要小写,避免与类名冲突。
当我们在上面的示例中编译包时,会创建一个名为“mypack”的新文件夹。
要运行MyPackageClass.java文件,请编写以下内容:
C:\Users\Your Name>java mypack.MyPackageClass
输出将是:
This is my package!
我们同样需要将包发布出去,需要用到jar工具
JAR 文件以 ZIP 文件格式打包,因此您可以将它们用于无损数据压缩,归档,解压缩和归档解压缩等任务。 这些任务是 JAR 文件最常见的用途之一,您只需使用这些基本功能即可实现许多 JAR 文件的优点。
Operation | Command |
---|---|
创建 jar | jar cf jar-file input-file(s) |
查看 jar 文件内容 | jar tf jar-file |
提取/解压 jar 文件内容 | jar xf jar-file |
提取指定文件 | jar xf jar-file archived-file(s) |
运行 jar(需要 Main-class 清单头文件) | java -jar app.jar |
创建 JAR 文件的基本格式是:
jar cf jar-file input-file(s)
参数解释:
- c : 表示要创建一个 jar 文件
- f : 表示要输出到一个文件中
- jar-file : 生成 jar 文件的具体名称。惯例是 xxx.jar,后缀名称不是强制的
- input-file(s) : 可以输入一个或多个文件,包含
*
通配符,如果是一个目录则递归添加到 jar 归档中
c 和 f 选项可以按任意顺序出现,但是它们之间不应该有任何空格。
这个命令将生成一个压缩 JAR 文件并将其放入当前目录中。该命令还将为 JAR 存档生成一个默认的清单文件。
注意: JAR 文件中的元数据,例如条目名称、注释和清单的内容,必须是 UTF8 编码。