自学Java-0基础到框架(JDK17 ->JDK8)-day02
昨天发帖说自己从jdk17入门,发现好多大佬都在jdk8,甚至觉得目前自己用jdk12都觉得版本很高。发现目前还是jdk8为主流。趁现在只写了“hello world”赶紧转jdk8。jdk8学完之后再慢慢了解jdk17的新特性,不过目前基础部分使用jdk8和jdk17应该大差不差
1.基本数据类型
变量就是申请内存来存储值。
Java的两大数据类型
内置数据类型
-
Byte
-
short
-
int
-
long
以上类型都可以用十进制,八进制,十六进制表示0
前缀表示八进制 0x
表示16进制
>
> java > int a = 100; > int b = 0142; > int c = 0x64; >
-
float
-
单精度、32位浮点数
-
在储存大型浮点数组的时候可节省内存空间
-
浮点数不能用来表示精确的值,如货币
-
默认0.0f
-
float a = 1234.5f
-
double
-
boolean
-
长度:一位
-
只能取true 或 false
-
默认值是 false
-
boolean a = true;
-
char
-
单一的 16 位 Unicode 字符
-
最小值是 \u0000
(十进制等效值为 0)
-
最大值是 \uffff
(即为 65535)
-
char 数据类型可以储存任何字符
-
char letter = 'A';
/*
* 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
-
一个引用变量可以用来引用任何与之兼容的类型
-
ClassName obj = new ClassName();
常量
常量在程序运行时是不能被修改的
final
关键字来修饰常量
final double PI = 3.1415926535898
转义字符
类型转换
整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算,转换从低级到高级
(低级)byte,short,char—> int —> long—> float —> double (高级)
- 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入
- 转换过程中可能导致溢出或损失精度
- 不能把对象类型转换成不相关类的对象
- 不能对boolean类型进行类型转换
- 在把容量大的类型转换为容量小的类型时必须使用强制类型转换
类型自动转换
必须满足转换前的数据类型的位数要低于转换后的数据类型
类型强制转换
变量
- 静态变量属于类,该类不生产对象,通过类名就可以调用静态变量
- 实例变量属于该类的对象,必须产生该类对象,才能调用实例变量
- 实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量
- 静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了
2.类和对象
类
类是一个模板,它描述一类对象的行为和状态。其中包含属性和方法
对象
类的实例化
构造方法
-
每个类都有构造方法。如果没有显式地为类定义构造方法,Java 编译器将会为该类提供一个默认构造方法
-
在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法
-
public class First{
public First(){
//构造器1
}
public First(String nihao){
// 这个构造器2仅有一个参数:name
}
}
创建对象
在Java中,使用关键字 new 来创建一个新的对象。
- 声明:声明一个对象,包括对象名称和对象类型
- 实例化:使用关键字 new 来创建一个对象
- 初始化:使用 new 创建对象时,会调用构造方法初始化对象
例如“犬”是类,斗牛犬、柴犬、牧羊犬、柯基等除品种外包含各种详细信息(年龄、毛色、动作等)则为“犬”这个类的实例化对象
访问实例变量和方法例子
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 超(父)类对象的一个指针。
输出结果:
创建小狗对象
name:chaiquan
Color:Orange
age:18
size:2
调用getInfo方法!
3.源文件、包
Java包
- 包主要用来对类和接口进行分类。当开发 Java 程序时,可能编写成百上千的类,因此很有必要对类和接口进行分类
- 作用就是 c++ 的 namespace 的作用,防止名字相同的类产生冲突
import语句
- import 语句就是用来提供一个合理的路径,使得编译器可以找到某个类
源文件
- 一个源文件中只能有一个 public 类,多个非 public 类
- 源文件的名称应该和 public 类的类名保持一致
- 如果一个类定义在某个包中,那么 package 语句应该在源文件的首行
- 如果源文件包含 import 语句,那么应该放在 package 语句和类定义之间。如果没有 package 语句,那么 import 语句应该在源文件中最前面
- import 语句和 package 语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明
资料
Java强制要求类名(唯一的public类)和文件名统一,因此在引用其它类时无需显式声明。在编译时,编译器会根据类名去寻找同名文件
例子
在刚刚创建的FirstClass类目录下创建SecondClass类
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();
}
}
执行结果:
创建小狗对象
size:2
name:fir
创建小狗对象
name:sec
调用getInfo方法!