持续更新(等我有空😁)
Java基础知识
目录
一、基础语法
1. 变量
- 变量通常是可以被修改的,即可以用来表示可变的状态;需先声明才能使用。
三种类型变量:局部变量、类变量、成员变量
2. 常量
程序运行过程中不能改变的值
3. 数据类型
4. String类
- 用于定义一个字符串,字符串是常量,值在创建之后不能更改 。
- String的方法:
1). 计算字符串长度:length()
2). 连接字符串:1.使用“+”连接 2.concat()
3).字符串比较:1.equal():比较两个对象的内容是否相同 2."==":两个对象在内存中存储的地址是否一样
4)charAt() 方法:按照索引值(第一个字符的索引值是 0),获得字符串中的指定字符。
5)提取字符串
5. 运算符
1).算术运算符
2)位运算符:
3)逻辑运算符
4).关系运算符
6. 修饰符
分为两类:访问修饰符和非访问修饰符
1).访问修饰符:
default (即默认,什么也不写): 在整个包内均可被访问,不使用任何修饰符。使用对象:类、接口、变量、方法。
private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
public : 对所有类可见。使用对象:类、接口、变量、方法
protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
2).非访问修饰符:
static:用来修饰类方法和类变量。
final :用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。
abstract :用来创建抽象类和抽象方法。
synchronized 和 volatile :主要用于线程的编程。
7. 方法
定义方法的语法:
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
8. 流程控制
(三类)循环结构、条件语句、跳转语句
1).循环结构:
- while 循环:
while( 布尔表达式 ) {
//循环内容
}
说明:只要布尔表达式为true,循环一直被执行下去
- do…while 循环:
do {
//代码语句
}while(布尔表达式);
说明:与while循环相似,但是do...while循环,先执行一次,再循环判断(至少被执行一次)。
- for 循环 :
for(初始化①; 布尔表达式②; 循环变量值操作③) {
//代码语句④
}
执行顺序:
1.执行循环变量初始化部分(1),设置循环的初始状态(可为空),此部分在整个循环中只执行一次。
2.进行循环条件的判断(2),如果条件为 true,则执行循环体内代码(4);如果为 false ,则直接退出循环。
3.执行循环变量值操作部分(3),对循环变量的值进行修改更新,然后进行下一次循环条件判断(4)。
2). 条件语句:
- if语句:
if(条件)
{
//条件成立时执行的代码
}
如果条件为 true,则执行 if 语句中的代码块,否则执行 if 语句块后面的代码
- if…else语句:
if(条件){
代码块1
}
else{
代码块2
}
当条件成立时,则执行 if 部分的代码块; 条件不成立时,则进入 else 部分
3).switch case 语句:
switch(表达式){
case 值1:
代码块1
break;
case 值2:
代码块2
break;
...
}
表达式的值与case的值相同时,执行case内的语句,遇到break时跳出switch语句。
4).跳转语句:
- break :用在条件和循环语句中,用来跳出循环语句。
- continue:跳过循环体中剩余的语句执行下一次循环。
9. 数组
有序的元素序列
1).数组:相同数据类型的元素按一定顺序排列的集合
定义数组:
数据类型 数组名[ ] = new 数据类型 [ 数组长度 ];
例:int stu[] = new int[10];
注:数组下标从0开始
遍历数组:for 语句在数组内可以使用特殊简化版本,在遍历数组、集合时,foreach 更简单便捷。
语法:
for(元素类型 元素变量:遍历对象){
执行的代码//System.out.println(元素变量);
}
2).二维数组:
语法:
数据类型 [][] 数组名 = new 数据类型[行的个数][列的个数];
或者:
数据类型 [][] 数组名 = {
{第一行值1,第一行值2,...}
{第二行值1,第二行值2,...}
...
}
二、面向对象
Java一切皆对象!
1. 面向对象基本概念
对象:类的一个实例,有属性和行为。
类:描述一类对象的行为和属性。类是具有相同属性和行为的对象的集合
面向对象:从对象的整体去看它,它由什么组成,可以做什么事情
2. 类
类 = 属性(成员变量)+方法
一个类可以包含以下类型变量:
- 1).局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
- 2).成员变量:(也叫实例变量)成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量在对象创建的时候创建,在对象被销毁的时候销毁。成员变量可以被类中方法、构造方法和特定类的语句块访问。
- 3).类变量:(也叫静态变量)类变量也声明在类中,方法体之外,但必须声明为static类型。(大多数被声明为常量)
定义类:
public class 类名 {
//定义属性部分(成员变量) 有什么
属性1类型 属性1;
属性2类型 属性2;
...
//定义方法部分 干什么
方法1
方法2
...
}
3. static修饰词
用来修饰类方法和类变量(静态变量)
- 静态变量:被static修饰的变量;被类的所有对象所共享。静态变量可以使用类名直接访问,也可以使用对象名进行访问。
如:
public class Student{
public static String stu="zhangsan";
public static void main(String[] args){
//静态变量不需要实例化,就直接可以访问
System.out.println(Student.stu);
//如果不加static关键字 需要像这样访问
Student student=new Student();
System.out.println(student.stu);
//如果加上static关键字,上面的两种方法都可以使用
}
}
- 静态方法:被static修饰的方法;不依赖对象;不用将类实例化就可调用,所以不能有 this,也不能访问非静态成员变量和非静态方法。但是非静态成员变量和非静态方法可以访问静态方法。
4.final修饰词
可以修饰类、方法、属性和变量
1). 修饰类,则该类不允许被继承,为最终类
2).修饰方法,则该方法不允许被覆盖(重写)
3).修饰属性:则该类的属性不会进行隐式的初始化(类的初始化属性必须有值
4). 修饰变量,则该变量的值只能赋一次值,即常量
5.封装
封装:隐藏对象的属性和实现细节(私有化),同时提供一些可以被外界访问的接口。(get,set)
封装的好处:
- 1)只能通过规定的方法访问数据。
- 2)隐藏类的实例细节,方便修改和实现。
- 3)良好的封装能够减少耦合
如何实现类的封装?
- 修改属性的可见性,在属性的前面添加修饰符 (private)
- 对每个值属性提供对外的公共方法访问,如创建 一对getter/setter(取赋值)方法,用于对私有属性的访问
6. 继承
继承:类与类之间的衍生关系
语法格式: class 子类 extends 父类
继承的好处:避免冗余,实现代码复用。
继承的特性:
- 1)子类拥有父类除private以外的所有属性和方法
- 2)子类可以拥有自己的属性和方法。(子类可以对父类进行扩展)
- 3)子类可以用自己的方式去实现父类的方法。
- 4)Java 中的继承是单继承,一个类只有一个父类。(
(Java实现多继承的一个办法是implement实现接口) - 5)提高了类之间的耦合性(缺点,不利于代码独立)
关键字:
- extends关键字实现单继承,一个子类只有一个父类
- implement关键字实现多继承,类继承接口,可以同时继承多个接口(接口跟接口之间采用逗号分隔)
- this关键字代表当前对象,当成员变量和局部变量之间发生冲突时,在属性名前面添加了 this 关键字,指向自己的引用。
- super关键字super 关键字在子类内部使用,代表父类对象
使用:1)访问父类的属性:super.属性名
2) 访问父类的方法:super.方法名()
3) 子类构造方法调用父类有参的构造方法时,需在子类的构造方法体里最前面的位置:super()。
7. 多态
多态:允许不同类的对象对同一消息做出响应(只通过父类就能引用不同的子类)。只有在程序运行的时才知道引用变量所指向的具体实例对象。
- 多态的优点:消除类型之间的耦合,可扩充
- 实现多态的三个必要条件:继承、重写和向上转型(即父类引用指向子类对象)
- 多态的实现方式:继承父类进行方法重写,抽象类和抽象方法,接口实现。
9. 重写与重载
是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成一个类的多态性表现
- 1)重写(Override):子类对父类的允许访问的方法的实现过程进行重新编写, 发生在子类中,返回值、形参和都不能改变
- 2)重载(Overload):在一个类中定义多个同名的方法。方法名相同,参数不同,个数不同,调用时根据参数选择方法
10. 抽象类
抽象类:定义类时,前面加上 abstract 关键字修饰的类
抽象方法:用abstract关键字声明,仅有声明没有方法体(不给出方法的具体实现)
抽象类规定:
- 抽象类不能被实例化。由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用
- 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类
- 抽象类中的抽象方法只是声明,不包含方法体
- 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
5.抽象类的对象不能直接创建,通常是定义引用变量指向子类对象- 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类
- 接口
用于描述类所具有的功能,而不提供功能的实现,功能的实现需要写在实现接口的类中,并且该类必须实现接口中所有的未实现方法。
语法格式:
修饰符 interface 接口名称 [extends 其他的接口名] {
// 声明变量
// 抽象方法
}
三、常用类
1. Array类
Arrays 类包含用于操作数组的各种方法(例如排序和搜索),它所提供的方法都是静态的
功能:
• 给数组赋值:通过 fill 方法(所有元素都赋上相同的值)
• 对数组进行排序:通过 sort 方法,按升序。
• 比较数组:通过 equals 方法比较两个数组中元素值是否相等。
• 查找数组元素:通过 binarySearch 方法对排序后的数组使用二分法查找数据。
2. StringBuffer 和 StringBuilder 类
- 当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
- StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
- StringBuilder 类和 StringBuffer类 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
- 由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
StringBuilder 类的常用方法:
- insert(int offset,Object obj):在 offset 的位置插入字符串 obj
- append(Object obj):在字符串末尾追加字符串
- length():确定 StringBuilder 对象的长度
- replace(int start, int end, String str): 使用一组字符替换另一组字符
- delete(int start, int end):删除字符串
- reverse():反转字符串
3.Math类
Math类:用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。
常见方法:
- max(int a, int b):返回 int 型 a 和 b 中的较大值,也接收 long、float 和 double 类型的参数
- min(int a, int b):返回 a 和 b 中的较小值,也可接受 long、float 和 double 类型的参数
- abs(int num):计算 int 类型值 numvalue 的绝对值,也接收 long、float 和 double 类型的参数
- sqrt(double num):计算给定值的正平方根
- sin(double num):计算角 num 的正弦值
- cos(double num):计算角 num 的余弦值
- tan(double num):计算角num的正切值
- pow(double a, double b):计算 a 的 b 次方
4. Date 类
Date 类表示日期和时间,经常用来获取系统当前时间
两个构造方法:
1) Date():使用当前日期和时间来初始化对象
2) Date(long date):接收一个参数,该参数是从1970年1月1日起的毫秒数
- 获取当前日期时间:使用 Date 对象的 toString() 方法来打印当前日期和时间
- 格式化时间:使用 SimpleDateFormat 格式化日期,
Date dat = new Date( );
SimpleDateFormat sdf = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
System.out.println("当前时间为: " + sdf.format(dat));