Skip to content

Latest commit

 

History

History
665 lines (428 loc) · 17.8 KB

File metadata and controls

665 lines (428 loc) · 17.8 KB

第6节 数据类型、方法、包

❤️💕💕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 日期

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"

变量

变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。

内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。

img

因此,通过定义不同类型的变量,可以在内存中储存整数、小数或者字符。

Java 的两大数据类型:

  • 内置数据类型
  • 引用数据类型

内置数据类型

Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。

byte:

  • byte 数据类型是8位、有符号的,以二进制补码表示的整数;
  • 最小值是 -128(-2^7^)
  • 最大值是 127(2^7^-1)
  • 默认值是 0
  • byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;
  • 例子:byte a = 100byte 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,分为int32int64,在没有特别声明情况下默认是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 = 100000Llong b = -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

满足条件:

  1. 方法名必须相同

  2. 参数列表必须相同

  3. 修饰符:范围可以扩大但不能缩小: public>Protected>Default>private

  4. 抛出的异常:范围可以缩小,但不能扩大;ClassNotFoundException-->Exception(大)

package

因为面对对象的特性,我们需要用package来管理项目,称之为包管理工具

package表示当前的包

import表示导入包,当你的类需要导入另一个类时候使用,此时需要判断

  • 在同一个包
  • 不在同一个包

有规定,类名必须大写,大写表示public,而小写表示private

image-20220903112624431

符合模块化的程序设计

包和API

Java 包和 API

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关键字:

MyPackageClass.java

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工具

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 文件的基本格式是:

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 编码。

END 链接