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
楼主通过什么途径学习的呀
因为有点别的语言的基础,这个是在菜鸟教程上看的,然后调整了一下学习的顺序
页:
[1]