Java基础

Java基础
叶小楠Java的基础知识
前置准备工作,Windows,能访问外网以及内网服务器的电脑。(好用的脑子一个)
JDK的组成
JVM—————– JVM(Java Virtual Machine):java虚拟机,真正运行Java的地方
核心类库———-核心类库:Java写好主机的程序,给程序员自己的程序调用的
开发工具:———-JRE(JAVA Runtime Environment):Java的运行环境
Java | Javac JDK(JAVA Development Kit):Java开发工具包(包括JVM,核心类库,JRE)
Java程序是先用javac进行编译,后用java进行输出。
在计算机中,任意数据都是以二进制的形式来存储的
Java的跨平台,工作原理
- 一次编译,处处可用。
Java程序—–>(javac编译)—–>Class文件
Java为我们写好了JVM虚拟机运行环境,这使得我们可以在Windows,Linux,MacOS都可以无缝衔接的运行javac编译好的Java文件。
Java Path配置
1.什么是Path环境变量?
- Path环境变量用于配置程序的路径
- 方便我们在命令行窗口的任意目录启动程序
2.JDK安装时,环境变量需要注意什么?
- 较新的JDK会自动配置PATH环境变量,较老的JDK版本则不会
- 建议还是主机配置一下“path”,“JAVA_HOME”
IDEA开发工具的使用
在Java中常见的开发工具有:Eclipse, MyEclipse, Intellij IDEA, Jbuilder, NetBeans等
IDEA管理Java程序结构
- Project(项目,工程)
- Module(模块)
- Package(包)
- Class(类)
IDEA开发第一个Java程序:
- 创建工程(Project)
- 创建模块(Module)
- 创建包(Package)
- 创建类(Class)
使用IDEA开发一个输出HelloWorld
1 | package fun.yexiaonan.one; |
IDEA应用设置
设置主题
File > Settings > Appearance > Theme
设置字体大小
File > Settings > Editor > Font
IDEA快捷键
快捷键 | 功能效果 |
---|---|
main/psvm,sout | 快速插入相关代码 |
Ctrl + D | 复制当前选中代码到下一行 |
Ctrl + Y | 删除所在行,建议用 Ctrl + X(剪切) |
Ctrl + ALT + L | 格式化代码 |
ALT + SHIFT + ↑ ,ALT + SHIFT + ↓ | 上下移动当前代码 |
Ctrl + / , Ctrl + SHIFT + / | 对代码进行注释 |
Java基础
Java单行注释
1 | // Java单行注释 |
Java多行注释
1 | /* |
Java文档注释
1 | /** |
Java字面量
在Java中,他的输出字符串与数字的方式与我们正常书写一样
1 | package fun.yexiaonan.day02; |
Java字面量总结
- 字符必须用单引号围起来,而且仅能有一个字符
- 字符串必须用双引号围起来
- 几个常见的特殊值的书写格式:
- true
- false
- null
- \n
- \t
Java变量
变量是用来记住程序要处理的数据的
使用变量便于扩展和维护
变量的定义格式:
变量中的数值是可以被替换的
例如:
1 | public static void main(String[] args) { |
①注意:
如果需要重复赋值,那么需要重复赋值的步骤
例如:
1 | public static void main(String[] args) { |
②注意:
- 变量需要先声明才能使用
- 变量是什么类型,就应该用来赋值什么类型的数据,否则无法运行
1 | double money = "有钱"; |
- 变量从定义开始到 “}” 截至的范围内有效;而且同一个范围内,多个变量的名称不能重复
1 | int age = 18; |
- 变量定义的时候可以不赋初始值;但是在使用时,变量里面必须有值,否则无法运行
1 | int age; |
Java变量总结
- 变量是用来存储数据的,本质是内存中的一块区域
- 变量的完整定义:
- 数据类型 变量名称 = 数据
- int age = 18;
- 使用变量存储需要的数据,在书写代码时更加的灵活,管理代码更加方便
- 变量中的数据可以被替换
Java关键字,标志符
- 关键字
在Java中,关键字相当于Java自带的一些句子,在后续的变量中,变量名不能与Java的关键字相同
Java语法
Java的标识符
》标识符:就是给类,方法,变量等起的名字
标识符由数字,字母,下划线( _ )和美元符号($)组成
不能以数字开头
不能是关键字
区分大小写
小驼峰命名法:方法,变量
规范1:标识符是一个单词的时候,全部小写
规范1:name
规范2:标识符由多个单词组成的时候,第一个字母小写,其他单词首字母大写
规范2:fristName
大驼峰命名法:类名
- 规范1:标识符是一个单词的时候,首字母大写
- 规范1:Student
- 规范2:标识符由多个单词组成的时候,每个单词的首字母大写
- 规范2:GoodStudent
给每一个标识符起名字的时候,都应该做到见名知意
Java变量详解
变量里的数据在计算机中的存储原理
- 二进制
- 在Java中只有0,1,按照逢2进1的方式表示数据:
- 计算机中表示数据的最小单元
- 计算机中表示数据的最小单元:一个字节(Byte,简称B,是使用8个二进制位组成的)
- 字节中的每个二进制位就称为位(bit,简称B),1B=8b
- 二进制
数据类型
Text 文本
ASCII 字符代码表 一
Image 图片
Sound 声音
Java类型转换
- 基本数据类型:4大类8大种
数据类型 | 数据类型 | 内存占用(字节数) | 数据范围 |
---|---|---|---|
整型 | byte | 1 | -128~127 |
整型 | short | 2 | -32768~32767 |
整型 | int(默认) | 4 | -2147483648~2147483647(10位数,大概21亿多) |
整型 | long | 8 | -9223372036854775808~9223372036854775807(19位数) |
浮点型(小数) | float | 4 | 1.401298E -24 到3.4028235E+38 |
浮点型(小数) | double(默认) | 8 | 4.90000000 E-324 到1.797693 E+308 |
字符型 | char | 2 | 0-65535 |
布尔型 | boolean | 1 | true,false |
在Java中由于整数的类型默认是int类型导致在写入长数据想要使用long类型时,需要在数据后面加上
L 或者 l
在Java中由于浮点数的类型默认是double类型导致在写入某些数据想要使用float类型时,需要在数据后面加上
F 或者 f
例如:
public class Main { public static void main(String[] args) { long lg = 114514L; // 长数据类型 System.out.println(lg); } } public static void main(String[] args) { // float double类型 // 随便写的小数字面量默认是double类型,如果希望是float类型,需要在后面加上F 或者 f float f = 3.14F; System.out.println(f); double d = 3.1415926; System.out.println(d); } } public static void main(String[] args) { // char 字符型 char ch = 'a'; char ch2 = '中'; System.out.println(ch); System.out.println(ch2); // boolean 布尔型 boolean flag = true; boolean flag1 = false; System.out.println(flag); System.out.println(flag1); } }
1
2
3
4
5
6
7
8
9
10
11
- 引用数据类型:String
- ```java
public class Main {
public static void main(String[] args) {
// String 字符串类型,定义的变量可以用于记住一个字符串类型
String name = "叶小楠";
System.out.println(name);
}
}
自动类型转换,为什么要进行自动类型转换
类型范围小的变量,可以直接赋值给类型范围大的变量。
public class Main { public static void main(String[] args) { // 目标;理解自动类型转换机制。 byte a = 12; int b = a; // 类型自动转换 System.out.println(a); System.out.println(b); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- 小范围类型变量可以直接赋值给大范围类型变量
- ```java
public class Main {
public static void main(String[] args) {
// 目标;理解自动类型转换机制。
byte a = 12;
int b = a;
// 类型自动转换
System.out.println(a);
System.out.println(b);
char name = 'a';
int i = name;
System.out.println(name);
}
}
Java组成
- 类
- 声明
1 | package org.example; |
- 类型参数
1 | package org.example; |
Java运算符
- 在Java中有许多的运算,例如while,for,do…while。while语法结构
- while语法结构
1 | while( 布尔表达式 ) { |
- while语法案例
1 | package day; |
- do…while语法结构
1 | do { |
- do…while语法案例
1 | package day; |
- for语法结构
1 | for(初始化;布尔表达式;更新) { |
- for语法案例
1 | public class JavaCode { |
- 增强for循环语法结构
1 | for(声明语句 :表达式) |
- 增强for循环语法案例
1 | public class JavaCode { |
Java中的计算符
在Java中如果需要用到数字进行运算,那么也跟我们现实中的运算一样
例子
1 | public class JavaCode { |
- 取模的用法
- 在Java中,取模操作是指求两个数相除后的余数。它使用
%
运算符来实现。例如,如果你有两个整数a
和b
(其中b
不为0),a % b
的结果将是a
除以b
后的余数。
1 | package org.yexiaonan; |
Java IF判断语句
- 在Java中IF可以用来判断数据是否相同
1 | // 编写一个简单的Java判断语句 |
1 | // IF中还可以循环嵌套一个if |
Java面向对象
1 | package org.yexiaonan; |
1 | package org.yexiaonan; |
- Java的New使用
- 在Java中可以使用New来创建一个类的实例,例如我有一个
Task1
的类,那么可以永以下方法来创建它的一个新实例
- 在Java中可以使用New来创建一个类的实例,例如我有一个
1 | package fun.test; |
- 调用构造函数
- New关键字会调用类的构造函数来初始化对象。如果类中定义了构造函数,new会条用匹配的构造函数。
1 | Car myCar = new Car("Toyota", 2020); // 假设Car类有一个接受两个参数的构造函数 |
Java构造方法
- 在Java中,如果没有特意声明构造方法那么默认会构造一个没有返回值的方法,如果有需要,可以使用
public 构造方法名字(传参)
来构造一个新的方法
1 | /** |
- 小测试
- 创建一个
类
- 存在三种不同的构造方法
- 无参数的构造方法
- 1个参数的构造方法
- 多个参数的构造方法
- 创建三个不同的对象,要求每个实例必须调用的是不同的构造方法。
- 创建一个
1 | package com.yexiaonan; |
Java的封装
在面向对象程式设计方法中,封装是指将实现部分的细节部分包装,从而达到隐藏起来的方法
- 封装可以被认为是一个保护屏障,防止该
类
的代码和数据被外部定义的代码随机访问 - 要访问该类的代码和数据,必须通过严格的接口来控制
- 封装可以被认为是一个保护屏障,防止该
Java种是使用“访问修饰符”来控制哪些细节需要封装,哪些细节需要暴漏的。Java种的4种“访问修饰符”分别为private,default,protected,public。它们说明了面向对象的封装性。
修饰符 | 同一个类 | 同一个包 | 子类 | 所有类 |
---|---|---|---|---|
private | ***** | |||
default | ***** | ***** | ||
protected | ***** | ***** | ***** | |
public | ***** | ***** | ***** | ***** |
- private 表示私有,只有自己类能访问
- default 表示没有访问修饰符,只有同一个包内可以访问
- protected 表示可以被同一个包的类以及其他包中的子类可以访问
- public 表示全部人都可以访问
Protected 【小细节】
- 1.若父类和子类在同一个包中,子类可以访问父类的 Protected 成员,也可以访问父类对象的 Protected 成员。
- 2.若子类和父类不在同一个包中,子类可以访问父类的 Protected 成员,不能访问父类对象的 Protected 成员。
小案例(用户到银行存钱和取钱)
1 | package Packaging; |
Java的继承
- 继承抽象理解可以为父母留给我们的房子,我们继承他,拥有使用权限
- 继承方便直接调用指定类的属性,从而不需要重写一遍,提高整洁
1 | package org.yexiaonan; |
Java的多态
多态是面向对象编程的一个核心特性,意思是“同一种行为,具有多种不同的表现形式”。在 Java 中,多态允许相同的代码在不同上下文中表现出不同的行为,提高了程序的灵活性和可扩展性。
多态的核心机制
Java 实现多态主要通过以下两种方式:
- 方法的重写(Override)
子类对父类的非静态方法进行重新定义,方法签名(方法名和参数列表)相同,但子类提供具体实现。 - 方法的重载(Overload)
同一类中多个方法具有相同的方法名但参数列表不同(参数类型、个数或顺序)。
多态的实现方式
父类引用指向子类对象
Java 支持用父类类型的变量来引用子类对象,这是实现多态的基础。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29class Animal {
void speak() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
void speak() {
System.out.println("Dog barks");
}
}
class Cat extends Animal {
void speak() {
System.out.println("Cat meows");
}
}
public class TestPolymorphism {
public static void main(String[] args) {
Animal a1 = new Dog(); // 父类引用指向子类对象
Animal a2 = new Cat();
a1.speak(); // 输出: Dog barks
a2.speak(); // 输出: Cat meows
}
}动态绑定(Dynamic Binding)
在运行时,根据实际对象的类型调用对应的方法,而非编译时决定调用哪个方法。这是多态的核心。
多态的好处
代码复用性
可以编写通用代码,针对父类进行操作,无需关心具体的子类类型。1
2
3void makeAnimalSpeak(Animal animal) {
animal.speak();
}扩展性强
当增加新的子类时,不需要修改原有代码,只需要新增子类实现。
注意事项
向上转型和向下转型
- 向上转型:子类对象可以赋值给父类引用,安全且自动。
- 向下转型:将父类引用强制转换为子类类型,需要显式强制转换,并确保类型匹配。
1
2Animal animal = new Dog(); // 向上转型
Dog dog = (Dog) animal; // 向下转型多态只能用于方法
成员变量的调用依赖于引用的类型,而非实际对象类型。静态方法和静态绑定
静态方法属于类本身,而不是对象,因此无法实现多态。
Java键盘录入
在Python中可以使用 input 接受用户输入的数据,但是在Java中是没有 input 语法的,我们需要使用官方定义好的Scanner库来导入以实现从键盘获取用户输入的数据。
java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。
下面是创建 Scanner 对象的基本语法:
1 | // 导入Scanner |
Java数据类转换
在Java中,数字进行运算时,数字类型不一样不能运算,需要转换成
一样
的才能运算。隐式转换:
- 取值范围
小
的数值转换为取值范围大
的数值
- 取值范围
取值范围小的,和取值范围大的进行运算,小的会先提升为大的,再进行运算
byte,sourt,char三种类型的数据在运算的时候,都会直接先提升为int,然后再进行运算
范例:
1 | package org.yexiaonan; |
- 强制转换:
- 取值范围
大
的数值,强制转换为取值范围小
的数值
- 取值范围
- 格式:目标数据类型 变量名 = (目标数据类型)被强制转换的数据;
范例:
1 | package org.yexiaonan; |
取值范围从小到大依次是:
byte > short > int > long > float > double
Java的自增自减运算符
基本用法
符号 | 作用 | 说明 |
---|---|---|
++ | 加 | 变量的值加1 |
– | 减 | 变量的值减1 |
范例:
1 | package org.yexiaonan; |
- ++和–既可以放在变量的前面,也可以放在变量的后面
Java的赋值运算符
- 赋值运算符的分类
符号 | 作用 | 说明 |
---|---|---|
= | 赋值 | int a =10,将10赋值给变量a |
+= | 加后赋值 | a+=b,将a+b的值赋值给a |
-= | 减后赋值 | a-=b,将a-b的值赋值给a |
*= | 乘后赋值 | a*=b,将aXb的值赋值给a |
/= | 除后赋值 | a/=b,将a÷b的商给a |
&= | 取余后赋值 | a%=b,将a÷b的余数给a |
1 | package org.yexiaonan; |
- (关系运算符/比较运算符)的分类
符号 | 说明 |
---|---|
== | a==b,判断a和b的值是否相等成立为true不成立为false |
!= | a!=b,判断a和b的值是否不相等,成立为true,不成立为false |
> | a>b,判断a是否大于b,成立为true,不成立为false |
>= | a>=b,判断a是否大于等于b,成立为true,不成立为false |
< | a<b,判断a是否小于b,成立为true,不成立为false |
<= | a<=b,判断a是否小于等于b,成立为true,不成立为false |
- 范例1
1 | package org.yexiaonan; |
- 范例2
1 | package org.yexiaonan; |
Java的逻辑运算符
- 在数学中,一个数据x,大于5,小于15,我们可以用 5< x < 15;
- 在Java中,需要把式子先拆分,在进行合并表达
- 拆解为:x>5和x<15
- 合并后:x>5 & x<15
符号 | 作用 | 说明 |
---|---|---|
& | 逻辑与(且) | 并且两边都为真,结果才是真 |
| | 逻辑或 | 或者两边都为假,结果才是假 |
^ | 逻辑异或 | 相同为 false,不同为 true |
! | 逻辑非 | 取反 |
- 范例
1 | package org.yexiaonan; |
Java的短路逻辑运算符
符号 | 作用 | 说明 |
---|---|---|
&& | 短路与 | 结果和 & 相同,但是有短路效果 |
|| | 短路或 | 结果和 ` |
- 范例
1 | package org.yexiaonan; |
Java的三元运算符
- 格式:关系表达式?表达式1:表达式2;
- 范例:求两个数的较大值
1 | int max = a > b ? a : b; |
- 范例
1 | package org.yexiaonan; |
- 范例2
1 | import java.util.Scanner; |
Java的运算符优先级
在 Java 中,运算符的优先级决定了在没有括号的情况下,表达式中各个运算符的执行顺序。了解运算符优先级可以帮助我们正确地编写和理解代码。
以下是 Java 中运算符的优先级表,从高到低排列(优先级越高,越先执行):
优先级等级 | 运算符类型 | 运算符 | 结合性 |
---|---|---|---|
1 | 括号 | () |
从左到右 |
2 | 后缀 | expr++ , expr-- |
从左到右 |
3 | 一元运算 | ++expr , --expr , + , - , ~ , ! |
从右到左 |
4 | 乘除余 | * , / , % |
从左到右 |
5 | 加减运算 | + , - |
从左到右 |
6 | 移位运算 | << , >> , >>> |
从左到右 |
7 | 比较 | < , <= , > , >= , instanceof |
从左到右 |
8 | 相等性 | == , != |
从左到右 |
9 | 按位与 | & |
从左到右 |
10 | 按位异或 | ^ |
从左到右 |
11 | 按位或 | ` | ` |
12 | 逻辑与 | && |
从左到右 |
13 | 逻辑或 | ` | |
14 | 条件运算 | ? : |
从右到左 |
15 | 赋值运算 | = , += , -= , *= , /= , %= , <<= , >>= , >>>= , &= , ^= , ` |
=` |
16 | 逗号 | , |
从左到右 |
说明
括号优先级最高:表达式中的括号
()
总是最先执行。1
int result = (2 + 3) * 4; // 括号先执行,结果为 20
后缀操作优先级高于前缀:后缀递增
i++
的优先级高于前缀递增++i
。1
2int i = 5;
System.out.println(i++ + ++i); // 5 + 7 = 12算术运算符优先级:乘法
*
和除法/
的优先级高于加法+
和减法-
。1
int result = 2 + 3 * 4; // 等价于 2 + (3 * 4),结果为 14
逻辑运算:
&&
的优先级高于||
。- 逻辑表达式建议使用括号明确顺序。
1
boolean result = true || false && false; // 等价于 true || (false && false),结果为 true
条件运算符:
? :
的优先级低于算术和比较运算。1
2int x = 5;
int y = (x > 0) ? x * 2 : x - 2; // 判断 x > 0,然后执行 x * 2
使用建议
尽量使用括号明确优先级:虽然理解优先级规则很重要,但为提升代码可读性,建议通过括号显式指定表达式的计算顺序。
复杂逻辑用分步拆解:对于包含多层运算符的表达式,分步骤计算会更直观且易于调试。
范例:
1 | package org.yexiaonan; |
Java的原码,反码,补码
- 原码:
- 十进制数据的二进制表现形式,最左边是符号位,0为证,1为负
- 反码:
- 正数的补码是其本身,负数的反码是符号位保持不变,其余 位取反
- 补码:
- 正数的补码是其本身,负数的补码是在其反码的基础上+1
Java的数组
数组是一种容器,可以用来存储同种数据类型的多个值
- 数组容器在存储数据的时候,需要结合隐式转换考虑
- 初始化:就是在内存中,为数组开辟空间,并将数据存入容器中的过程
数组的写法:
Java的For语句结合If判断
1 | package org.yexiaonan; |
Java的数组
- 在 Java 中,数组是一种容器对象,用于存储固定大小的同类型元素集合。数组中的元素可以是基本数据类型(如
int
、char
、double
等)或者引用数据类型(如对象、字符串等)。数组的大小一旦确定,就不能更改,因此它是一个静态数据结构。
1 | // 声明一个数组有两种方式 |
在上面,我们可以看到声明数组类型的案例,请注意!在声明数组的时候要像生成变量一样,在数组前面加上数组里面的数据类型。
可能大部分人在这一步想在控制台输出看看数组里面的内容,但是我告诉你的是,在Java中,如果你想要查看数组里面的数据,你不能像正常(下面这样)输出,这样输出是
1 | System.out.println(arr3); |
Java的方法
- 方法就是程序中最小的执行单元
- 在实际开发中,具有独立功能的代码可以抽取到方法中
- 在实际开发中,可以方便的维护代码,提高可维护性
- 最简单的方法和定义
(方法必须显定义后调用,负责程序将报错)
1 | public static void PlayGame(){ |
- 带参数的方法定义
(如果括号中有多个参数,需要使用逗号分隔)
1 | public static void GetSum(int number) {......} |
- 带返回值方法的定义
1 | public class MethodFor5 { |