Java基础知识点学习

JAVA基础知识点学习

一、Java三大版本

1、Java2标准版(J2SE):占领桌面(桌面程序、控制台开发)

2、Java2移动版(J2ME):占领手机(手机、小家电)、嵌入式开发

3、Java2企业版(J2EE):占领服务器(web端、服务器开发)、企业级开发

二、Java特性与优势

1、简单性

2、面向对象

3、可移植性:跨平台运行

4、高性能

5、分布式

6、动态性:放射

7、多线程

8、安全性

9、健壮性

三、JDK、JRE、JVM概念

1、JDK:Java Development Kit:Java开发者工具

2、JRE:Java Runtime Environment:Java运行时环境

3、JVM:Java Virtual Machine:Java虚拟机

image-20231207143157928

四、Java程序运行机制

1、编译型和解释型

2、过程:源程序(.java文件)—>Java编译器—>字节码(.class文件)—>类加载器—>字节码校验器—>解释器—>操作系统平台

五、Java基础语法

1、Java中的注释有三种

1.1、单行注释://

1.2、多行注释:/....../

1.3、文档注释:/**

* @Author liqing

* @Date 2023\10\28 19:46:23

**/

2、标识符

2.1、所有的标识符都应该以字母(a-z或A-Z)、美元符($)、下划线(_)开始。

2.2、首字符之后可以是字母(a-z或A-Z)、美元符($)、下划线(_)或数字的任何字符组合。

2.3、不能使用关键字作为变量名、方法名或类名。

2.4、标识符大小写敏感。

2.5、可以使用中文命名,但一般不建议,也不建议拼音命名,很low。

2.6、合法标识符举例:age、$salary、_value。

2.7、非法标识符举例:123abc、-salary、#abc。

3、数据类型

3.1、Java是一种强类型语言(C++),即要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用。

3.2、弱类型语言:VB、JS

3.3、Java的数据类型分为两大类:

image-20231207155830636

3.4、扩展:

3.4.1、位:bit,计算机内部数据储存的最小单位,用b表示

字节:byte,计算机数据处理的基本单位,用B表示

1字=2字节、1字节=8位

字符:计算机中使用的字母、数字、字和符号。

3.4.2、整数型:二进制以0b开头,八进制、十进制以0开头,十六进制以0x开头

3.4.3、浮点型:float:接近但不等于,最好完全避免使用浮点数进行比较,用数字工具类BigDecimal类

3.4.4、字符:所有的字符本质还是数字,用Unicode编码表示,1个字符最多用2个字节表示,最大Unicode码值为65536,用int强制转换

转义字符:\t:制表符(Tab键),\n:换行

3.5、类型转换:

3.5.1、运算中,不同类型的数据先转化到同一类型,再进行运算。

3.5.2、精度顺序:

低—————————————————————>高

byte、short、char—>int—>long—>float—>double

3.5.3、强制类型转换:高—>低,格式:(要强转的类型)被强转的变量

自动类型转换:低—>高

3.5.4、注意点:不能对布尔类型进行转换

不能把对象类型转换为不相干的类型

在把高容量转换成低容量时,强转可能存在内存溢出或精度丢失问题

操作比较大的数时,注意溢出问题

3.5.5、JDK新特性,数字之间可以用下划线分割,例如:10000000—>10_000_000

示例:

int money = 1000000000;
int years = 20;
int total = money*years;//计算结果超出int类型的最大取值范围,计算时溢出
long total2 = money*years;//默认是int,转换前计算出的结果也都是int,所以还是溢出
long total3 = money*((long)years);//解决办法:把一个int类型的数转换为long即可

4、变量

4.1、概念:Java变量是程序中最基本的存储单元,包括变量名、变量类型和作用域

4.2、作用域:

实例变量:写在类里面、方法外面;必须声明,不一定要初始化值,如果不初始化值,则为默认值;

布尔值:默认值是false;整数类型:默认值是int,即0;浮点数类型:默认值是double,即0.0;除了基本类型外,其余的默认值都是null。

类变量:在实例变量前加static关键字。

局部变量:写在方法里,当需要使用该变量时,必须声明和初始化值。

4.3、常量:加上final关键字,初始化后不能再改变的值。

修饰符不存在先后顺序:static final double PI = 3.14;和final static double PI = 3.14;是一样的。

常量名一般使用大写字符。

4.4、变量的命名规范:

类名:首字母大写和驼峰原则,如GoodMan

常量名:大写字母和下划线,如MAX_VALUE

其他均是首字母小写和驼峰原则,如lastName、runDay()

5、运算符

5.1、算术运算符:+、-、*、/、%、++、--

5.2、赋值运算符:=

5.3、关系运算符:>、<、>=、<=、==、!=、instanceof

5.4、逻辑运算符:&&、||、!

5.5、%:取余,21➗10 = 2...1,所以21%10 = 1

5.6、幂运算:用Math.pow(2,3) = 8,即2×2×2 = 8

5.7、++:自增

实例:

a = 1;
b = a++;//先将a值赋值给b,再对a加1,所以b = 1
c = ++c;//先对a加1,再将a值赋值给c,所以c = 2

--(自减)也是如此。

5.8、位运算符:&(与)、|(或)、^、~、>>、<<、>>>

^:异或运算符,两个数相同则为0,两个数不同则为1

~:取反运算符

<<:左移运算符,相当于*2,例如:2<<3,相当于2×2×2×2 = 16

>>:右移运算符,相当于/2

5.9、逻辑运算符中,短路运算,即与运算(&&)

示例:

int c = 5;
boolean d = (c<4)&&(c++<4);
//输出d为false,输出c为5,因为当做与运算时,先判断第一个条件(c<4)是否为真,为真则继续判断下一个条件(c++<4),不为真则下一个条件不做判断了,直接返回false。

5.10、条件运算符: ? :

x?y:z:若x为true,则结果为y,否则结果为z。

5.11、扩展赋值运算符:+=、-=、*=、/=

a+=b—>a=a+b、a-=b—>a=a-b、a×=b—>a=a×b、a/=b—>a=a/b

5.12、字符串连接符:+

例如:int a = 10;//""+a+b,输出为1020

int b = 20;//a+b+"",输出为30

6、包机制

一般利用公司域名倒置作为包名,例如:百度网址:www.baidu.com,所以包名路径可定为com.baidu.www。

7、JavaDoc

7.1、概念:javadoc命令是用来生成自己API文档的

7.2、参数信息:

@author 作者名

@version 版本号

@since 指明需要最早使用的jdk版本

@param 参数名

@return 参数名

@throws 异常抛出情况

7.3、通过Dos命令行生成java API文档:

在需要生成API文档的类所在目录下的Dos命令窗口下执行该命令:

javadoc -encoding UTF-8 -charset UTF-8 Doc.java

设置编码为UTF-8、字符集为UTF-8,都是为了避免中文乱码

8、Java流程控制

8.1、Scanner对象:通过Scanner获取用户输入

8.1.1、创建一个扫描器对象,用于接收键盘数据

Scanner scanner = new Scanner(System.in);
//判断用户有无输入
if(scanner.hasNext()){
    //使用next方法接收
    String str = scanner.next();
}
//凡是属于IO流的类,如果不关闭会一直占用资源,养成用完就关掉的好习惯
scanner.close();        

8.1.2、next():一定要读取到有效字符后才可以结束输入;

对输入有效字符之前遇到的空白,next()方法会自动将其去掉;

只有输入有效字符后才将其后面输入的空白作为分隔符或结束符;

next()不能得到带有空格的字符串。

8.1.3、nextLine():以Enter为结束符,即nextLine()方法返回的是输入回车之前的所有字符;

可以获得空白。

8.1.4、接收整数、浮点数输入,用到的方法:hasNextInt()、nextInt()、hasNextFloat()、nextFloat()。

8.2、顺序结构:Java的基本结构就是顺序结构,顺序结构是最简单的算法结构。

8.3、选择结构:if单选择结构(if{})、if双选择结构(if{}else{})、if多选择结构(if{}else if{}else if{}else{})、嵌套if结构(if{if{}})。

8.3.1、switch多选择结构:

switch (expression){
    case value:
        //语句
        break;//可选
    case value:
        //语句
        break;//可选 
    //可以有任意数量的case语句
    default://可选
        //语句
}

switch语句中的变量类型可以是byte、short、int、char,从jdk7开始,支持String,case标签必须为常量。

case穿透:case后面有break,则匹配成功,执行完成,跳出循环。case后面未写break,则即使匹配成功,执行完成也不会跳出循环,继续执行下面语句。

8.4、break和continue的区别:

break强行退出整个循环;continue终止某次循环

9、方法定义

9.1、格式:

修饰符 返回值类型 方法名(参数类型 参数名){

方法体

return 返回值;

}

java都是值传递;return相当于终止方法。

9.2、方法重载:在一个类中,有相同的函数名称,但形参不同的函数。

9.2.1、规则:方法名称必须相同;

参数列表必须不同(个数不同、类型不同、参数排列顺序不同等);

方法的返回类型可以相同也可以不相同;

仅仅返回类型不同不足以成为方法的重载;

9.2.2、实现理论:方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译报错。

9.3、命令行传参:

public static void main(String [] args){
    args[i]
}

命令:java 类名 参数1 参数2

9.4、可变参数:

9.4.1、jdk1.5开始,java支持传递同类型的可变参数给一个方法;

9.4.2、在方法声明中,在指定参数类型后加一个省略号(...);

9.4.3、一个方法中只能指定一个可变参数,它必须时方法的最后一个参数;

9.4.4、任何普通参数必须在其之前声明;

9.4.5、示例:

public void test(String name,double age,int...i){}

9.5、递归:A方法调用A方法,即自己调用自己。

9.5.1、递归结构包括两部分:

递归头:什么时候不调用自身方法,如果没有头,将陷入死循环。

递归体:什么时候需要调用自身方法。

9.5.2、示例:n! = n×(n-1)×(n-2)×...×1

public static int f(int n){
    if(n==1){
        return 1;
    }else{
        return n*f(n-1);
    }
}

10、数组

10.1、声明数组变量语法:

dataType [] arrayRefVar ;//首选

dataType arrayRefVar [];//效果相同,不是首选

10.2、创建数组语法:dataType [] arrayRefVar = new dataType[arraySize];

10.3、通过索引方法数组元素,索引从0开始。

10.4、数组长度:arrayRefVar .length

10.5、内存分析:

堆:存放new的对象和数组;可以被所有的线程共享,不会存放别的对象引用

栈:存放基本变量类型(会包含这个基本类型的具体数值);引用对象的变量(会存放这个引用在堆里面的具体地址)

方法区:可以被所有的线程共享;包含了所有的class和static变量

10.6、三种初始化:

静态初始化: int [] a = {1,2,3};

Man [] mans = {new Man(1,1),new Man(2,2)};

动态初始化:int [] a = new int[2];

a[0] = 1;

a[1] = 2;

数组的默认初始化:数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。

10.7、数组的四个基本特点:

长度是确定的,数组一旦被创建,大小不可改变;

元素必须是相同类型,不允许出现混合类型;

元素可以是任何数据类型,包括基本类型和引用类型;

数组变量属引用类型,数组对象本身在堆中的。

10.8、数组的使用:

for each循环:不能取数组下标的具体值进行操作,适用于打印数组

普通的for循环。

10.9、多维数组:可以看成数组的数组。

二维数组:int [] [] a = new int[2] [5];//两行五列数组

10.10、Arrays类:数组的工具类:java.util.Arrays

常用方法:给数组赋值:通过fill方法。

对数组排序:通过sort方法,按升序。

比较数组:通过equals方法,比较数组中元素值是否相等。

查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作。

10.11、冒泡排序:时间复杂度为O(n^2)

10.12、稀疏数组:当一个数组中大部分元素为0,或者为同一值得数组时,可以使用稀疏数组来保存该数组。

稀疏数组的处理方式:记录数组一共有几行几列,有多少个不同值;把具体不同值得元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模。

示例:

原始数组 稀疏数组:共6行,7列,8个不同值

0 0 0 22 0 0 15 行 列 值

0 11 0 0 0 17 0 6 7 8

0 0 0 -6 0 0 0 0 3 22

0 0 0 0 0 39 0 0 6 15

91 0 0 0 0 0 0 1 1 11

0 0 28 0 0 0 0 1 5 17

2 3 -6

3 5 39

4 0 91

5 2 28

11、面向对象编程(OOP)、面向对象(OO)

11.1、面向过程与面向对象的区别:

11.1.1、面向过程思想:步骤清晰简单,第一步做什么,第二步做什么,适合处理一些较为简单的问题,是具体的。

11.1.2、面向对象思想:分类的思维模式,是抽象的。

11.2、oop的本质是:以类的方式组织代码,以对象的组织(封装)数据。

11.3、抽象:对同一个目标的共有的属性(特征)和方法(功能/行为)进行抽取、归纳、总结。所以抽象不是了解和解决全部问题,而是选择公共的部分,忽略一个主题中与当前目标无关的哪些地方。从认识论角度考虑是先有对象后有类。对象是具体的事物;类是抽象的,是对对象的抽象。

11.4、三大特性:封装、继承、多态

11.5、break与return区别:

break:跳出switch,结束整个循环;

return:结束一个方法,并返回值。

11.6、静态方法是和类一起加载的,而非静态方法是类实例化后才存在的。

11.7、对象:使用new关键字创建对象,创建对象时,会分配内存空间,还会给创建好的对象进行默认的初始化和对类中构造器的调用。

11.8、构造器的两个特点:必须和类的名字相同;必须没有返回类型,也不能写void。

无参构造:使用new关键字,本质是在调用构造器;用来初始化值。

有参构造:一旦定义了有参构造,无参就必须显示定义(前提是使用到无参构造时)。

11.9、创建对象内存分析:

image-20231214111251443

11.10、封装:隐藏对象的属性和实现细节,控制成员属性的访问和修改权限,通过特定公开的方法暴露给外面访问。该露的露,该藏的藏(对一些对象进行抽象成类)。

11.10.1、程序设计追求"高内聚,低耦合",即高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。

11.10.2、属性私有:用private修饰,通过统一的公有set、get方法调用私有属性。

11.10.3、意义:提高程序的安全性。保护数据;隐藏代码的实现细节;统一接口;系统可维护性增强。(对对象、类进行封装)

11.11、继承:子类继承父类的成员和方法,使得子类也能具有父类相同的行为。对类的抽象,关键字extends,子类(派生类),父类(基类)。

11.11.1、所有的类,都默认直接或间接继承Object类。

11.11.2、子类继承了父类,就会拥有父类的全部方法和属性(前提是 不是被private修饰)。

11.11.3、Java中类只有单继承,没有多继承。

11.11.4、super:调用父类的方法;this:调用本类的方法。子类的无参构造方法中,默认调用了父类的无参构造方法,并且必须要在子类构造方法的第一行。

注意:Java类之间只能实现单继承,接口之间可以多继承。

11.12、方法的重写:子类可以重写(覆盖)父类的方法,通过父类引用变量调用该方法时,根据实际对象的类型,会调用子类中的方法。父类的引用指向子类,例如:B b = new A();B是父类,A是子类(A extends B)。

11.12.1、对于静态方法而言,方法的调用只和左边(声明引用变量)有关,因为静态方式是属于类的,不属于实例的。

11.12.2、对于非静态方法而言,体现了子类的方法重写,@Override:重写的注释。

11.12.3、总结:重写需要有继承关系,子类重写父类的方法。

11.12.4、特点:

方法名必须相同;

参数列表必须相同;

修饰符:用private修饰的方法不能被重写,用static修饰的方法也不能被重写,范围可以扩大但是不能缩小(public>protected>default>private:从大到小);

抛出异常:范围可以缩小但不能扩大(FileException<Exception:从小到大);

11.12.5、重写:子类的方法和父类必须一致,而方法体不同。

11.12.6、为什么需要重写:父类的功能,子类不一定需要,或者不一定满足。

11.13、多态:同一个行为具有多个不同的表现形式或者形态,如一个类的方法在不同的情况有不同的表现形式。

11.13.1、多态需要满足的三个条件:有继承、有重写、有父类引用指向子类对象。最终多态体现为父类引用可以指向子类对象:父类类型 变量名 = new 子类类型()。

11.13.2、多态的三种表现形式:普通类多态、抽象类多态、接口多态

11.13.3、多态的编译和运行:

成员变量:编译和运行都看左边

成员方法:编译看左边,运行看右边

11.13.4、不能重写的情况:

被static修饰的方法,是静态方法,是属于类的,而不属于实例,所以不能被重写;

被final修饰的方法,不能被重写;

被private修饰的方法,不能被重写。

11.14、instanceof关键字:判断两个类是不是父子关系。

11.14.1、格式:boolean result = object instanceof class。

11.14.2、参数说明:result :布尔类型;object:必选项。任意对象表达式;class:必选项。任意已定义的对象类。

11.14.3、说明:

如果 object 是 class 的一个实例,则返回 true。

如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false;

类的实例包含本身的实例,以及所有直接或间接子类的实例。

11.14.4、规则:

左边的对象实例不能是基础数据类型;

左边的对象实例和右边的类不在同一个继承树上;

null用instanceof跟任何类型比较时都是false;

11.15、static关键字:

11.15.1、静态变量:用static修饰的变量。

11.15.2、静态方法:用static修饰的变方法。

11.15.3、示例:

public class Person{
    {
        匿名代码块;//随对象创建而执行,并在构造方法前执行,一般用于赋初始值。
    }
    static{
        静态代码块;//随类加载时而执行,只执行一次。
    }
    public person(){
        无参构造方法;
    }
}

11.15.4、静态导入包:import static java.lang.Math.random;

11.16、抽象类:使用abstract关键字修饰类,抽象类只能单继承。

11.16.1、抽象方法:使用abstract关键字修饰方法,只有方法名字,没有方法的实现。

11.16.2、特点:

不能new抽象类,只能靠子类去实现它;

抽象类中可以写普通的方法;

抽象方法必须在抽象类中。

11.17、接口:使用interface关键字修饰,接口可多继承。

11.17.1、接口中的所有定义的方法其实都是抽象的(public abstract)。

11.17.2、接口中定义的变量都是常量(public static final)。

11.17.3、接口实现类 implements 接口1,接口2...{

重写接口1中的方法;

重写接口2中的方法;

...

}

11.17.4、接口不能被实例化,接口没有构造方法。

注意:在jdk1.8之前,接口中的方法不能有方法实现体,而jdk1.8及jdk1.8以后,接口中的方法可以有方法实现体。

11.18、内部类:在一个类的内部再定义一个类。

11.18.1、分类:成员内部类、静态内部类、局部内部类、匿名内部类。

11.18.2、成员内部类:

Outer outer = new Outer();

OuterInner inner = outer.new Inner();

inner.in();

成员内部类能获取外部类的私有属性、私有方法。

11.18.3、静态内部类:在成员内部类前用static修饰符。

静态内部类无法访问外部类的方法、属性,如果需要访问,则必须在外部类的方法、属性加上static进行修饰。

注意:一个java文件可以有多个class,但是只能有一个public class。

11.18.4、局部内部类:定义在外部类的方法中。

11.18.5、匿名内部类:没有名字初始化类,不用将实例保存到变量中。例如:new Apple().eat();

11.19、异常:程序运行中出现的不期而至的各种状况,比如:文件找不到、网络连接失败、非法参数等。

11.19.1、分类:检查性异常、运行时异常、错误。

检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如:要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。

运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。

错误:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

11.19.2、结构:

image-20231214135716123

11.19.3、异常处理机制:

抛出异常:throw、throws

捕获异常:try、catch、finally

异常处理的五个关键字:try、catch、finally、throw、throws

示例:

try{//监控异常区域
    
}catch(){//捕获异常,如果需要捕获多个异常,则需要从小到大
    
}catch(){//捕获异常
    
}catch(){//捕获异常
    
}finally{//处理异常善后工作
    
}
​
//如果方法中处理不了该异常,则需要throws用在方法上抛出异常,再处理的话,就向上抛出异常,写在类上
public void test() throws ArithmeticException{
    throw new ArithmeticException();//throw:主动抛出异常,一般用在方法中
}

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值