Java基础

Java快速入门

视频链接:Java入门基础视频教程,java零基础自学就选黑马程序员Java入门教程(含Java项目和Java真题)_哔哩哔哩_bilibili

JDK的选择安装和下载

LTS:long-term support 长期支持版

JDK-8 LTS(目前企业常用)

下载JDK:oracle.com官网

Java 17 Windows x64 installer

JDK是否安装成功:java.exe和javac.exe是否安装成功(命令行窗口cmd输入:java和javac)

验证版本:java -version和javac -version(版本为17)

javac.exe:编译工具

java.exe:执行工具(对编译后的程序进行执行)

VSCode配置java运行环境

1.下载插件Extension Pack for Java(Microsoft官方)

2.FIle->Preferences->Settings(或者快捷键Ctrl+’,’),搜索java home,在Startup选项中点击Edit in setting.json,修改如下(这里填写的是安装的Java的路径):

1
"java.jdt.ls.java.home": "D:\\Programs\\Java\\jdk-21",

1660152660273

参考链接:

VSCode下载安装和配置Java环境_java下载vscode-CSDN博客

如何在vscode中配置java运行环境? - 知乎 (zhihu.com)

Java:开发helloworld

HelloWorld.java(源代码)–>(使用javac编译)HelloWorld.class(字节码文件)–>(使用java运行)

运行命令:

javac HelloWorld.java

java HelloWorld

Java程序的执行原理

编译成计算机底层能识别的机器语言

机器语言->汇编语言->高级语言

JDK的组成和跨平台原理

JVM(Java Virtual Machine):Java虚拟机,运行Java程序

核心类库:Java写好的程序,给程序员调用

JRE(Java Runtime Environment):Java的运行环境,包括JVM和核心类库

JDK(Java Development Kit):Java开发工具包,包括JRE和开发工具(java、javac、等)

Java的跨平台:

一次编译,处处可用(对不同电脑系统提供了不同虚拟机)

IDEA开发Java程序

1.创建工程new Project(空工程)

2.创建模块new Module

3.创建包new Package

4.创建类new class

编译后的class文件在工程路径下的out文件夹。

HelloWorld.java文件:

1
2
3
4
5
public class HelloWorld {
public static void main(String[] args) {
System.out.println("hello world");
}
}

Java基础语法

‘A’:65

‘a’:97

‘0’:48

二进制:0B或0b开头

八进制:0开头

十六进制:0X或0x开头

数据类型

基本数据类型+引用数据类型

基本数据类型:4大类8种

注意:

1.整型默认是int,加上l/L为long,如888L

2.浮点型默认是double,加上f/F为float,如3.14F

类型转换

自动类型转换(小->大)

表达式的自动类型转换

(最终结果由表达式中的最高类型决定)

表达式中,byteshortchar是直接转成int类型参与运算。(目的:防止加法超出表示范围,所以扩大字节为int)

注意:

1
2
3
4
5
byte x = 10;
byte y = 30;
// x = x + y; //这句话会编译错误,因为byte类型是转成int类型进行运算,无法赋值给byte类型,应改为:
x = (byte)x+y;
//上述形式也可以相当于 x+=y;

强制类型转换(大->小,会报错)
1
2
int a = 20;
byte b = (byte)a;

强制类型转换只截取最低的字节。

浮点->整形:只保留整数部分,截断小数部分

运算符

逻辑运算符:&(逻辑与)、|(逻辑或)、!(非)、^(异或:前后条件结果相同返回false,不同返回true)

&&(短路与):结果与&一样,左边为false,则右边不执行

||(短路或):结果与|一样,左边为true,则右边不执行

&和|左右边都要执行

注:一般用&&、||、!

Java流程控制

分支结构

switch的表达式类型只能是byte、short、int、char,JDK5开始支持枚举,JDK7开始支持String,不支持double(精度问题,0.1+0.2=0.3000004,无法和正确的0.3匹配)、float、long(long的范围太大了)

case的值不允许重复,且只能是字面量(具体的数、字母),不能是变量

case必须写break,不然会有穿透性(穿透性可以用于:多个值对应的case块的操作是相同的)

循环结构

for和while功能上完全一样

do-while:一定会执行一次(可用于抢票软件,先执行抢票再进行判断)

数组(引用数据类型)

静态初始化数组

定义数组时同时确定具体元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
//完整格式
int[] ages = new int[]{12,13,14};
double[] scores = new double[]{99, 98.5, 98.888};

//简化格式
int[] ages = {12,13,14};
//也可以写成
int ages[] = {12,13,14};

//数组长度:数组.length
for (int i =0 ; i < ages.length; i++){
System.out.print(ages[i]);
}

动态初始化数组

定义数组时不存入具体元素值,只确定数组存储的数据类型数据长度

1
int[] ages = new int[3]; //默认值全为0,ages=[0,0,0]

动态初始化数组元素默认值:

Java内存分配

.java文件是编译成.class文件,然后将.class文件放到JVM虚拟机中运行的。

JVM虚拟机内存分配(Java内存分配):方法区、堆、栈

数组在计算机中的执行原理:

多个变量指向同一个数组:

如果某个数组变量存储的地址是null,那么该变量将不再指向任何数组对象。

1
2
3
4
5
6
int[] arr1 = new int[]{1, 2, 3};
int[] arr2 = arr1;
System.out.println(arr2);

arr2 = null;
System.out.println(arr2);//输出为null,但不可访问arr2[0],这是空指针,无法访问

方法

方法的格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//有参数,有返回值
public static int sum ( int a , int b ){
return a + b;
}

//无参数,无返回值
public static void print (){
System.out.println("hello world");
}

//有参数,无返回值
public static void printN(int n){
for (int i = 0; i < n; i++) {
System.out.println("hello world");
}
}

注意问题:

1.方法在类中的位置放前放后无所谓,但是一个方法不能定义在另一个方法里面。

2.return之后不能写代码。(运用return ;在无返回值方法中,可以跳出并立即结束当前方法的执行。)

方法在计算机中的执行原理

方法被调用时,进入栈内存中运行。

Java的参数传递机制(都是值传递)

值传递:传输实参变量中存储的值的副本

基本类型的参数传递:值传递(存储的数据)

引用类型的参数传递:值传递(存储的地址)

方法重载

方法重载:一个类中,多个方法名称相同,但是形参列表不同。

注意:

1.方法重载只要求:方法名称相同形参列表不同。(修饰符,返回值类型是否一样无所谓)

2.形参列表不同:形参个数类型顺序不同,与形参名称无关。

面向对象编程(OOP)

对象:特殊的数据结构。对象是用new出来的。

class(类):对象的设计图/对象的模板。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//编写一个类作为对象
package com.itheima.hello;

public class Student {
//成员变量:类中定义的变量(对象的属性)
String name;
int age;

//面向对象的方法不要加static
//成员方法:类中定义的方法(对象的行为)
public void printName() {
System.out.println(name);
}

public void printAge() {
System.out.println(age);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
//使用上述的对象
package com.itheima.hello;

public class HelloWorld {
public static void main(String[] args) {
Student s1 = new Student();
s1.name = "surourou";
s1.age = 18;
s1.printName();
s1.printAge();
}
}

对象在计算机中的执行原理

注意:

1.成员变量:类中定义的变量(对象的属性)。

成员方法:类中定义的方法(对象的行为)。

2.成员变量存在默认值(和数组一样)。

3.一个代码文件中,可以写多个class类,但只能有一个用public修饰。且public修饰的类名必须为代码文件名。

4.Java存在自动垃圾回收机制,会自动清楚垃圾对象。

this关键字

this:一个变量,用在方法中,来拿到当前对象

应用:解决变量名称冲突问题。

1
2
3
4
5
6
7
8
9
10
package com.itheima.hello;

public class Student {
String name;
int age;

public void printThis(){
System.out.println(this);//打印当前对象的地址,不同对象的地址不一样
}
}

方法里的this是如何拿到调用它的对象的:传入了参数this

1
2
3
public void printThis(Student this){
System.out.println(this);//打印当前对象的地址,不同对象的地址不一样
}

构造器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.itheima.hello;

public class Student {
String name;
int age;

//无参数构造器
public Student() {

}

//有参数构造器
public Student(String name, int age) {

}

}

注意:

1.类在设计时,如果不写构造器,Java会为类自动生成一个无参构造器。

2.若定义了有参数构造器,Java不会自动生成无参构造器。

封装

面向对象的三大特征:封装、继承、多态

封装:用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理这些数据的方法,设计到一个对象中去。

封装的设计规范:合理隐藏,合理暴露

公开成员:public

隐藏成员:private

实体类JavaBean

实体类:

1.这个类中的成员变量都要私有,并且要对外提供相应的getXxx ,setXxx方法。

2.类中必须要有一个公共的无参的构造器。

实体操作类:具体的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.itheima.hello;

public class StudentOperator {
private Student student;

public StudentOperator(Student student) {
this.student = student;
}

public void print(){
System.out.println(student.name + "," + student.age);
}
}

成本变量和局部变量

常用API

包:类似文件夹

注意:
1.同一个包下的类,互相可以直接调用。

2.调用其他包下的程序,必须在当前程序中导包。导包格式:import 包名.类名;

3.调用Java提供的程序需要先导包才可以使用;但是Java.lang包下的程序不需要导包的,可以直接使用。

4.要调用多个不同包下的程序,而这些程序名正好一样,此时默认只能导入一个程序,另一个程序必须带包名访问。

String

String创建对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//1.直接创建
String name = "surourou";

//2.调用String类的构造器
//(1)空白字符串
String name0 = new String();
//(2)字符串
String name1 = new String("surourou");
//(3)字符数组
char[] names = {'s','r','r'};
String name2 = new String(names);
//(4)字节数组
byte[] bytes = {115, 114, 114};
String name3 = new String(bytes);

System.out.println(name+ " " + name0 + " " + name1 + " " + name2 +" "+ name3);
String常用方法

注意:

1.String的对象是不可变字符串对象

2.只要是以“…”方式写出的字符串对象,会在堆内存中的字符串常量池中存储,且相同内容的字符串只存储一份。

1
2
3
String s1 = "srr";
String s2 = "srr";
System.out.println(s1 == s2);//true

3.通过new方式创建字符串对象,每new一次都会产生一个新的对象放在堆内存中。

1
2
3
4
char[] names = {'s', 'r', 'r'};
String s3 = new String(names);
String s4 = new String(names);
System.out.println(s3 == s4);//false

案例:

ArrayList(集合的一种)

集合:容器,存储数据,大小可变。

ArrayList:一种集合,是泛型类,可以用来约束存储的数据类型。

注意:集合和泛型都不支持基本数据类型,只能支持引用数据类型。

如:ArrayList<int>是错误的,应该使用ArrayList<Integer>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//1.不约束存储的数据类型
ArrayList list = new ArrayList();
//或者ArrayList<Object> list = new ArrayList<>();//推荐这样写
list.add("A");
list.add("B");
list.add(999);
list.add(55.4);
System.out.println(list);

//2.约束存储的数据类型
//ArrayList<String> list1 = new ArrayList<String>(); //法一
ArrayList<String> list1 = new ArrayList();//法二,jdk1.7之后支持,不用在后面的ArrayList中写<String>
list1.add("S");
list1.add("R");
list1.add("R");
System.out.println(list1);

注意:

1.从集合中遍历元素,并筛选出元素删除它,应该如何操作才能不出bug?

1
2
方式一:每次删除一个数据后,索引-1
方式二:从集合后面遍历然后删除,可以避免漏掉元素。

2.集合容器中存储的是每个对象在堆内存中的地址


Java基础
http://surourou8.github.io/2024/09/19/Java基础/
作者
Su Rourou
发布于
2024年9月19日
许可协议