xiaotian1339 发表于 2022-3-31 20:04

Java自学第二天-数据类型、类、对象、源文件、包

# 自学Java-0基础到框架(JDK17 ->JDK8)-day02

> 昨天发帖说自己从jdk17入门,发现好多大佬都在jdk8,甚至觉得目前自己用jdk12都觉得版本很高。发现目前还是jdk8为主流。趁现在只写了“hello world”赶紧转jdk8。jdk8学完之后再慢慢了解jdk17的新特性,不过目前基础部分使用jdk8和jdk17应该大差不差

## 1.基本数据类型

变量就是申请内存来存储值。

Java的两大数据类型

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

### 内置数据类型

1. #### Byte

   - 长度8位

   - 有符号

   - 以二进制补码表示的整数

   - -128~`0(默认)`~127

   - 可在数组中使用byte类型替代int类型。因为 byte 变量占用的空间只有 int 类型的1/4

   - ```java
   byte a = 100;
   byte b = -10;
   ```

2. #### short

   - 长度16位

   - 有符号

   - 二进制补码表示的整数

   - -2^15~`0(默认)`~(2^15)-1

   - 可在数组中使用short类型替代int类型。因为 short 变量占用的空间只有 int 类型的1/2

   - ```java
   short a = 7652;
   short b = -1245
   ```

3. #### int

   - 长度:32位

   - 有符号

   - 二进制补码表示的整数

   - -2^31~`0(默认)`~(2^31)-1

   - 一般地整型变量默认为 int 类型

   - ```java
   int a = 123456;
   int b = -20321;
   ```

4. #### long

   - 长度:64 位

   - 有符号

   - 以二进制补码表示的整数

   - -2^63~`0L(默认)`~(2^63) -1

   - 数字后加`L`或`l`否则Java将作为整型解析

   - ```java
   long a = 1234567L;
   long b = -1234567L
   ```

   > L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写

   > 以上类型都可以用十进制,八进制,十六进制表示`0`前缀表示八进制   `0x`表示16进制
   >
   > ```java
   > int a = 100;
   > int b = 0142;
   > int c = 0x64;
   > ```

5. #### float

   - 单精度、32位浮点数

   - 在储存大型浮点数组的时候可节省内存空间

   - 浮点数不能用来表示精确的值,如货币

   - 默认`0.0f`

   - ```java
   float a = 1234.5f
   ```

6. #### double

   - 双精度、64 位浮点数

   - 浮点数的默认类型为 double 类型

   - double类型同样不能表示精确的值,如货币

   - 默认`0.0d`

   - ```java
   double a = 6D;
   double b = 6.;
   double c = 7.0;
   double d = 8.D;
   double e = 1.234
   ```

   > 上面都表示double类型数据

7. #### boolean

   - 长度:一位

   - 只能取true 或 false

   - 默认值是 `false`

   - ```java
   boolean a = true;
   ```

8. #### char

   - 单一的 16 位 Unicode 字符

   - 最小值是 `\u0000`(十进制等效值为 0)

   - 最大值是 `\uffff`(即为 65535)

   - char 数据类型可以储存任何字符

   - ```java
   char letter = 'A';
   ```

```java
/*
* 1.二进制位数: 类型.SIZE
* 2.包装类:java.lang.类型
* 3.最小值:类型.MIN_VALUE
* 4.最大值:类型.MAX_VALUE
*/
                //以int类型为例
      System.out.println("基本类型:int 二进制位数:" + Integer.SIZE);
      System.out.println("包装类:java.lang.Integer");
      System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE);
      System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE);
```

### 引用类型

- 引用类型指向一个对象,指向对象的变量就是引用变量,一旦声明后,类型就不能被改变了

- 它的值是指向内存空间的引用,就是地址,所指向的内存中保存着变量所表示的一个值或一组值。

- 对象、数组都是引用数据类型

- 默认值`null`

- 一个引用变量可以用来引用任何与之兼容的类型

- ```java
ClassName obj = new ClassName();
```

### 常量

**常量在程序运行时是不能被修改的**

` final `关键字来修饰常量

```java
final double PI = 3.1415926535898
```

### 转义字符

!(https://s1.ax1x.com/2022/03/31/qWgKSS.png)

### 类型转换

整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算,转换从低级到高级

```java
(低级)byte,short,char—> int —> long—> float —> double (高级)
```

-浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入
-转换过程中可能导致溢出或损失精度
-不能把对象类型转换成不相关类的对象
-不能对boolean类型进行类型转换
-在把容量大的类型转换为容量小的类型时必须使用强制类型转换

### 类型自动转换

必须满足转换前的数据类型的位数要低于转换后的数据类型

### 类型强制转换

- 条件:转换的数据类型必须是兼容的

- 格式:(强转类型)值

- ```java
a = 123.456;
int inta = (int)a;
```

- **整数默认类型int,小数默认类型double,float需要在数字后跟`f`或`F`**

### 变量

!(https://s1.ax1x.com/2022/03/31/qWTjPJ.png)

- 静态变量属于类,该类不生产对象,通过类名就可以调用静态变量
- 实例变量属于该类的对象,必须产生该类对象,才能调用实例变量
- 实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量
- 静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了

## 2.类和对象

### 类

类是一个模板,它描述一类对象的行为和状态。其中包含属性和方法

### 对象

类的实例化

### 构造方法

- 每个类都有构造方法。如果没有显式地为类定义构造方法,Java 编译器将会为该类提供一个默认构造方法

- 在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法

- ```java
public class First{
      public First(){
          //构造器1
      }
   
      public First(String nihao){
          // 这个构造器2仅有一个参数:name
      }
}
```

### 创建对象

在Java中,使用关键字 new 来创建一个新的对象。

- **声明**:声明一个对象,包括对象名称和对象类型
- **实例化**:使用关键字 new 来创建一个对象
- **初始化**:使用 new 创建对象时,会调用构造方法初始化对象



> 例如“犬”是类,斗牛犬、柴犬、牧羊犬、柯基等除品种外包含各种详细信息(年龄、毛色、动作等)则为“犬”这个类的实例化对象

### 访问实例变量和方法例子

```java
public class FirstClass {

    /*
    * 因为本来有一点python面向对象的基础
    * 所以写了一个示例函数,感受一下与其的不同和相同之处
    */

    String name;
    String color;
    int age;
    int size;

    public FirstClass(){
      System.out.println("创建小狗对象");
    }

    public void setColor(String color) {
      this.color = color;
      System.out.println("Color:"+this.color);
    }

    public void setName(String name) {
      this.name = name;
      System.out.println("name:"+this.name);
    }

    public void setSize(int size) {
      this.size = size;
      System.out.println("size:"+this.size);
    }

    public void setAge(int age) {
      this.age = age;
      System.out.println("age:"+this.age);
    }

    public void getInfo() {
      System.out.println("调用getInfo方法!\n");
    }

    public static void main(String[] args) {
      FirstClass chai = new FirstClass();
      chai.setName("chaiquan");
      chai.setColor("Orange");
      chai.setAge(18);
      chai.setSize(2);
      chai.getInfo();

    }
}

```

> - **this** 指向对象本身的指针,形参与成员名字重名,用 this 来区分。
> - **super** 超(父)类对象的一个指针。

输出结果:

```bash
创建小狗对象
name:chaiquan
Color:Orange
age:18
size:2
调用getInfo方法!
```

---

## 3.源文件、包

### Java包

- 包主要用来对类和接口进行分类。当开发 Java 程序时,可能编写成百上千的类,因此很有必要对类和接口进行分类
- 作用就是 c++ 的 namespace 的作用,防止名字相同的类产生冲突

### import语句

- import 语句就是用来提供一个合理的路径,使得编译器可以找到某个类

### 源文件

1. 一个源文件中只能有一个 public 类,多个非 public 类
2. 源文件的名称应该和 public 类的类名保持一致
3. 如果一个类定义在某个包中,那么 package 语句应该在源文件的首行
4. 如果源文件包含 import 语句,那么应该放在 package 语句和类定义之间。如果没有 package 语句,那么 import 语句应该在源文件中最前面
5. import 语句和 package 语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明

> **资料**
>
> Java强制要求类名(唯一的public类)和文件名统一,因此在引用其它类时无需显式声明。在编译时,编译器会根据类名去寻找同名文件

**例子**

在刚刚创建的FirstClass类目录下创建SecondClass类

```java
public class SecondClass {
    public static void main(String[] args) {
      FirstClass fir = new FirstClass();
      fir.setSize(2);
      fir.setName("fir");
      FirstClass sec = new FirstClass();
      sec.setName("sec");
      sec.getInfo();
    }
}
```

执行结果:

```bash
创建小狗对象
size:2
name:fir
创建小狗对象
name:sec
调用getInfo方法!
```

---

赵小迪 发表于 2022-4-1 11:24

楼主通过什么途径学习的呀

xiaotian1339 发表于 2022-4-1 23:24

赵小迪 发表于 2022-4-1 11:24
楼主通过什么途径学习的呀

因为有点别的语言的基础,这个是在菜鸟教程上看的,然后调整了一下学习的顺序
页: [1]
查看完整版本: Java自学第二天-数据类型、类、对象、源文件、包