java基础知识梳理

news2024/10/7 8:20:36

虽然已经在实际工作中与java打交道5年之多,但是一直没系统地对java这门语言进行梳理和总结,掌握的知识也比较零散。恰好利用这段时间重新认识下java,并对一些常见的语法和知识点做个总结与回顾,一方面为了加深印象,方便后面查阅,一方面为了学好java打下基础。拉勾IT课小编为大家分解

Java简介

java语言于1995年正式推出,最开始被命名为Oak语言,由James Gosling(詹姆斯·高斯林)在Sun Microsystems公司和同事共同研发,Microsystems如今已经被oracle收购。java语言具有以下特点:

·简单性

·面向对象

·可移植性

·安全性

·健壮性

·多线程

Java文件运行过程如下:

1.编写源代码,文件格式:.java

2.编译.java文件 生成.class文件(二进制字节码文件)

3.运行.class文件在JVM上(java虚拟机,支持多平台)

如果大家在学习过程中遇到什么问题,或者缺乏相关的Java学习资料,可查看右侧公告栏获取,有问题随问随答,还有我这段时间整理的一些Java学习手册,面试题,开发工具,PDF文档书籍教程,需要的话都可以免费分享给大家。言归正传:

Java语言基础语法注释

注释用于解释程序,增强可读性,java中注释有以下几种:

1.单行注释,语法如下:

//单行注释

2.多行注释,语法如下:

/*

多行注释

多行注释

*/

3.javadoc注释,是一种专业注释,可以被javadoc.exe工具解析提取生成帮助文档

/**

* javadoc注释

*/

标识符

标识符用于标识类名,方法名,变量名,接口名等,命名需要满足以下规则:

·只能由"数字,字母(A-Z或者a-z),美元符($)、或者下划线(_)"组成

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

·严格区分大小写,不能用关键字做标识符

java编程规范建议遵守驼峰命名法,类名和接口名首字母大写,变量和方法名首字母小写。Java采用unicode的编码方式,所以标识符也支持中文。

类的定义

java定义一个类用class关键字,有以下几点需要注意:

·一个java源文件定义公开的类只能有一个,类名称必须和java源文件名称一致

·一个java源文件可以编写多个class

·每一个class都可以编写main方法

Java数据类型基本数据类型

数据类型的作用是指导JVM在运行程序的时候给该数据分配多大的内存空间,Java提供了以下八种基础数据类型:



整型表示方式

整型有三种表示方式,默认是十进制:



类型转换

类型转换有如下规则:

1.八种基本数据类型除了布尔类型之外,剩下的7种类型都可以互相转换

2.小容量向大容量转换,可以自动进行,容量从小到大排序为:byte

3.大容量数据转换成小容量,需要进行强制类型转换,强转会损失精度

4.byte, short ,char混合运算,各自转换成int;多种数据类型混合运算,转换成容量最大的类型再运算。

对于强制类型转换,将long强转成int的语法如下:

long k = 6475201314L;

int num = (int) k;

注意:大容量转换成小容量编译无法通过,比如下面代码无法编译:

byte b = 19;

b = b + 13; //相当于直接把整型赋值给byte型,报错

b += 13; //可以编译,等同于b = (byte)(b + 13)

复合数据类型字符串(String)

在Java中使用String类来创建和操作字符串,初始化一个String的语法如下:

//常用,用双引号直接创建

String testStr = "Wasting time is robbing oneself";

//不常用,使用char数组创建

char[] helloArray = {'h', 'e', 'l', 'l', 'o'};

String helloString = new String(helloArray);

由于字符串使用非常频繁,String类也提供了很多方法,下面介绍一些用的比较多的。

·对字符串进行修改的常用方法有(包括格式化,大小写转换):



·对字符串进行查找和替换的方法有:



·获取子字符串的常用方法有:



·对字符串进行比较的方法有:



·其他常见的方法比如统计长度,拼接,转换等:



数组

数组可以用于存放固定大小的同类型元素,声明一个数组的语法如下:

变量类型[]数组名;

创建数组的语法:

数组名= new变量类型[数组大小];

变量类型[]数组名= {value0, value1, ..., valuek};

数组的变量类型可以是前面介绍八种基本数据类型以及复合数据类型,“数组名[索引]”可以访问数组元素,下面是一个操作一维数组例子:

int[] primeNumbers = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};

for (int num : primeNumbers) {

System.out.println("num: " + num);

}

操作二维数组的例子如下:

int[][] a = new int[2][3];

a[0][0] = 19;

String[][] s = new String[2][];

s[0] = new String[2]; //第一个数组长度为2

s[1] = new String[3]; //第二个数组长度为3

s[0][0] = "Hello";

s[0][1] = "World";

java.util.Arrays类能方便地操作数组,它提供的所有方法都是静态的,比较常见的方法有:



使用Arrays的sort方法进行排序的例子如下:

int[] primeNumbers = {7, 11, 5, 2, 3};

Arrays.sort(primeNumbers);

for (int num : primeNumbers) {

System.out.println("num: " + num);

}

集合

Java语言提供了一个完善的集合框架,主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射经常用到的集合有:



ArrayList提供的常用方法有:



下面是操作一个java.util.ArrayList的例子:

ArrayList list = new ArrayList();

list.add(2);

list.add(3);

list.add(5);


for (int i = 0; i


System.out.println(list.get(i));

}

list.remove(1);

list.set(1, 19);

类型转换方法



运算符

Java的运算符种类比较多,本文介绍几种常见的运算符:

算术运算符

java的算术运算符如下表(int a = 10; int b= 9;):



基本的赋值运算符"="可以与前5种算术运算符组合成+=,-=,*=,/=,%=等扩展的赋值运算符int a = 10; a += 5; 等价于a = (int)(a + 5);其他的运算符类似,扩展运算符默认有类型转换,但是不改变运算结果类型

对于"+"运算符,只要两边的操作数有一个是字符串就会进行字符串连接运算生成一个新的字符串。

关系运算符

java中主要有以下六种关系运算符:



关系运算符返回的结果是布尔型

逻辑运算符

主要有以下三种逻辑运算符(boolean a = true; boolean b = false):



位运算符

位运算符对两个操作数的每一位进行运算,有以下几种常见的类型:



三目运算符

三目元素符的语法规则:

布尔表达式?表达式1 :表达式2;

布尔表达式为真执行表达式1,为假执行表达式2,利用三目运算符求最大值的一个例子如下:

int a = 10;

int b = 9;

int max = (a > b) ? a : b;

System.out.println("max number is: " + max);

控制语句

每种编程语言都少不了控制语句来控制代码流程,java语言也提供了丰富的控制语句。

选择结构if语句

if语句常见的语法:

//第一种写法,else分支可以省略

if (布尔表达式) {

表达式为真要执行的语句;

} else {

其他条件要执行的语句

}

//第二种写法,最后的else分支可以省略

if (布尔表达式) {

表达式为真要执行的语句;

} else if (布尔表达式1) {

表达式1为真要执行的语句

} else if (布尔表达式2) {

表达式2为真要执行的语句

} else {

除上述条件之外要执行的语句

}

switch语句

switch语句的语法如下:

switch (expression) {

case value1 :

//匹配value1成功之后执行的语句

break; //可选

case value2 :

//匹配value2成功之后执行的语句

break; //可选

...

default : //可选

//前面case分支都没匹配时执行的语句

}

其中expression支持byte、short、int、char以及字符串(String),byte、short、char会转换为int类型。程序只有遇到break语句才会跳出switch语句,缺少break的分支会继续往下面分支执行。

循环结构

程序当中总会有些需要重复执行的代码片段,因此各个编程语言都支持循环语法。

for语句

for语句的语法如下:

for (初始化表达式;布尔表达式;更新表达式) {

//要重复执行的代码片段

}

执行过程:

1.初始化表达式最先执行而且只执行一次;

2.判断布尔表达式,如果是真执行循环体,如果是假则退出循环

3.循环体执行之后更新表达式,再执行步骤2,反复循环直到退出循环利用for循环计算数字1到10的和的代码如下:

int sum = 0;

for (int i = 0; i

sum += i;

}

System.out.println("the sum is: " + sum);

while语句

while语句的语法如下:

while (布尔表达式) {

//循环内容

}

执行过程:先判断布尔表达式的值,为真就执行循环体,为假则循环结束,循环体可能一次也不执行。使用while循环计算数字1到10的和是:

int sum = 0;

int i = 0;

while (i

sum += i;

i++;

}

System.out.println("The sum is: " + sum);

do…while循环

do…while循环的语法如下:

do {

//循环内容

} while (布尔表达式);

do…while循环先执行循环内容再判断表达式,循环体至少会执行一次。

控制循环语句break语句

break使用在switch语句中终止switch执行,使用在循环语句中终止循环,跳出当前循环体。语法如下:

break;

continue语句

continue表示直接进入下一次循环继续执行,语法如下:

continue;

Java变量类型

在Java中,所有的变量在使用前必须声明。声明变量的基本格式如下:

type identifier = value;

value的数据类型必须和声明的变量类型一致,变量的值可变化,必须先声明再赋值才能访问。

局部变量:

java中的局部变量声明在方法内部,有以下特点:

·变量只在作用域内有效,超出作用域变量将会被销毁;

·变量是在栈上分配,没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。

局部变量存储在栈内存中。

实例变量(成员变量):

成员变量在方法体之外声明,有以下特点:

·当一个对象被实例化之后,每个实例变量的值就跟着确定

·实例变量在对象创建的时候创建,在对象被销毁的时候销毁

·实例变量具有默认值,数值型变量的默认值是,布尔型变量的默认值是false,引用类型变量的默认值是null。

成员变量在JVM的堆内存中存储,垃圾回收器主要针对堆内存处理。

静态变量:

静态变量用static关键字声明,需要记住以下特点:

·无论一个类创建了多少个对象,类只拥有静态变量的一份拷贝

·静态变量在第一次被访问时创建,在程序结束时销毁。

·静态变量具有默认值,取值和实例变量类似

不同类型变量在JVM中的存储情况如下表:



方法/函数方法语法

方法实质就是一段可以重复使用,完成某项特定功能的片段,和C语言中的函数类似。方法的语法如下:

[修饰符]返回值类型 方法名(参数类型 参数名1,参数类型 参数名2 ...) {

...

方法体;

...

return返回值; //可选,与返回值类型一致

}

比如常见的main方法如下:

public static void main(String []args) {

System.out.println("Hello World!");

}

方法有如下几个部分组成:

1.修饰符:修饰符,这是可选的,定义了该方法的访问类型。比如public, static, private, protected等

2.返回值类型 :方法可能会返回值,支持前面介绍的八种基本数据类型以及String,如果不需要返回值,返回值类型就写成void。

3.方法名:是方法的实际名称,建议首字母小写。方法名和参数表共同构成方法签名。

4.参数类型:即形参列表,形参的个数可以是:0~N个。当方法被调用时,传递值给对应参数,这个值被称为实参。

5.方法体:方法体包含具体的语句,定义该方法的功能。下面是实现判断一个正整数是否是质数的函数的例子(假设num大于2):

private static boolean isPrimeNumber(int num) {

boolean isPrime = true;

for (int i = 2; i

if (num % i == 0) {

isPrime = false;

break;

}

}

return isPrime;

}

方法内存

方法代码片段属于.class字节码文件的一部分,在调用方法的时候才会在中分配内存,称为压栈;方法执行结束释放方法的内存空间称为弹栈。方法执行完之后,方法内局部变量的空间也释放,因此局部变量只在方法内有效。JVM的栈中主要存储的是局部变量。

方法重载

方法重载(overload)主要是是指方法名相同,参数列表不同,和返回值类型无关,和修饰符无关。要构成方法重载需要满足以下条件:

1.方法是在同一个类当中

2.这些方法的方法名相同

3.参数列表不同,可以是数量不同,顺序不同,类型不同

面向对象

面向对象是Java核心的特点,主要有以下特性:

·封装:封装就是隐藏实现细节,仅对外提供访问接口。优点是使代码模块化,具有安全性。

·继承:继承就是将已存在的类(父类)的定义作为基础建立新类,新类(子类)的定义可以增加新的数据或新的功能,也可以用父类的功能

·多态:多态就是引用变量指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定。使得程序灵活地运行在多个状态。

对象和类的定义:

·对象(object):对象是类的一个实例,是实际存在的个体,有状态和行为。

·类(class):类是一个模板,它描述一类对象的行为和状态,是抽象思考的结果。

对象和类的关系:一个类进行实例化就形成了对象,对象抽象形成类。

类的语法如下:

[修饰符列表] class类名{

属性; //对象的状态信息,通常采用变量方式定义,称为成员变量

方法; //对象的动作信息

}

类实例化需要用new运算符,语法如下:

new类名();

java中的类属于引用数据类型,new新建的java对象存储在JVM的堆内存中,new等号左侧类的变量名存储的是指向堆内存的地址。每个new出来的类的内存互相独立。Java面向对象中相关的重要知识点有:

·构造方法:构造方法名称与类名相同,无返回参数。构造方法在类初始化的时候调用,支持重载。类存在默认的无参构造方法。

·this关键字:this指向当前对象的引用,"this.属性名称"或者"this.方法名称"用于访问本类的变量或者方法,在构造方法中使用"this();"语句访问本类的构造方法。

·static关键字:static修饰属性表示静态变量,修饰类的方法表明无需类的对象就可以调用此方法。

·super关键字:super为对父类的引用,可以使用super来调用父类的属性,方法,和构造方法。

·final关键字:final修饰变量表示变量的值初始化后不能发生变化;final修饰方法表示不能被子类重写;final修饰的类无法被继承。

·抽象类:抽象类使用abstract关键字声明,非抽象类继承抽象类必须实现所有抽象方法,抽象类不能被实例化。抽象类不能声明为final。

·instanceof关键字:instanceof是用于检查对象是否为指定的类型,通常在进行类型转换时要使用,以避免发生类型转换异常。

·接口(Interface):接口是一个抽象类型,是抽象方法的集合。接口不是类,接口没有构造方法,不能被实例化,只能被类实现。接口只能包含static和final变量。

Java中声明一个接口的语法如下:

interface接口名称[extends其他的接口名] {

全局常量;

抽象方法;

}

常用函数

接着介绍Java中使用非常频繁的几个函数:

输出函数

控制台的输出由print()和println()完成。这些方法都由类PrintStream定义,System.out是该类对象的一个引用。print()打印指定的字符不换行,println()打印完成换一行。下面是使用的例子:

System.out.print("Remember: ");

System.out.println("Haste makes waste");

输入函数

Java中使用java.util.Scanner类获取用户的输入,使用前需要先创建Scanner对象。常用next()与nextLine()方法获取输入的字符串,对应地用hasNext()与hasNextLine()判断是否还有输入的数据。下面是使用next函数获取用户输入字符串的例子:

//创建scanner对象

Scanner scan = new Scanner(System.in);

//判断是否还有输入

if (scan.hasNext()) {

String inputStr = scan.next();

System.out.println("you input:" + inputStr);

}

//关闭scanner

scan.close();

还可以使用nextInt接收一个整数,Scanner常用的方法如下表:



总结

Java这门语言涵盖的知识点比较丰富,一篇文章是不可能将所有知识点都完全覆盖到的。本文的主要目的是梳理下基础常见的知识点,帮助大家一起复习下,学习一门语言打好基础是至关重要的。掌握了这些基础知识点,自己动手写一些小程序问题也不大。文章最后再附上一个完整代码的小例子,实现的功能是将用户输入的字符串逆序输出:

class Test{

public static void main(String args[]) {

Scanner scan = new Scanner(System.in);

String inputStr = scan.nextLine();

// String转换为char数组

char[] nums = inputStr.toCharArray();

for (int i = nums.length; i>0; i--) {

System.out.print(nums[i-1]);

}

System.out.println("");

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/507694.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OtterCTF---Memory Forensics内存取证(1-13)

一.OtterCTF 内存取证 CTF地址: OtterCTF 国产化一下: 注册一下 登录就可以 (注:因为邮箱不验证,随意搞个就可以): 1 - What the password? 第一题: 国产化: 下载…

DEJA_VU3D - Cesium功能集 之 104-攻击箭头(标绘+编辑)

前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小140个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(每篇博文都会奉上完整demo的源代码,…

FreeRTOS:中断配置

目录 一、Cortex-M 中断1.1中断简介1.2中断管理简介1.3优先级分组定义1.4优先级设置1.5用于中断屏蔽的特殊寄存器1.5.1PRIMASK 和 FAULTMASK 寄存器1.5.2BASEPRI 寄存器 二、FreeRTOS 中断配置宏2.1configPRIO_BITS2.2configLIBRARY_LOWEST_INTERRUPT_PRIORITY2.3configKERNEL_…

Class 01 - R语言介绍及部分功能演示

Class 01 - R语言介绍及部分功能演示 教程介绍功能演示数据导入 R语言&Python对比在数据科学中的不同优势 教程介绍 在本章中,将学习到编程的新概念,以及如何使用R语言来做数据的分析。 我们先谈谈计算机编程吧,计算机编程是指向计算机…

计算机网络学习笔记-数据链路层

目录 概述 三个功能 封装成帧 透明传输 差错检测 点对点协议PPP 三个组成部分 帧格式 透明传输 工作状态 使用广播信道的局域网 以太网 两个主要标准 高速以太网(速率 > 100Mb/s) MAC层: 集线器 交换机 自学习和转发帧 生…

tkinter+re实现百度网盘分享链接自动跳转

目录 一、背景 二、需求分析 三、实现 三、打包 四、测试 一、背景 相信大家使用百度网盘的时候都会去一些链接网站吧,比如下面这个网站 这个网站具体实现的功能是:管理员上传百度网盘链接,用户点击复制链接按钮可以将百度网盘的分享链…

线性结构-数组

数组(Array)是最简单的数据结构,是由有限个相同类型的变量或对象组成的有序集合。因为数组中各元素之间是按顺序线性排列的,所以数组是一种线性数据结构。 数组是一类物理空间和逻辑形式都连续的线性数据结构: 数组用唯一的名字标识&#xf…

输出数字的位数(C语言)以及逆序输出

#include <stdio.h>int main() {int N;int i 0;scanf("%d",&N);int a[5];int j;while(N > 0){a[i] N%10;i;N N/10;}printf("这个数字是%d位数\n",i); for(j 0;j < i;j){printf("%d",a[j]);} } 原题如下&#xff1a;

并发编程08:原子操作类

文章目录 8.1 基本类型原子类8.1.1 常用API简介8.1.2 Case 8.2 数组类型原子类8.2.1 常用API简介8.2.2 Case 8.3 引用类型原子类8.4 对象的属性修改原子类8.4.1 使用目的8.4.2 使用要求8.4.3 Case 8.5 原子操作增强类原理深度解析8.5.1 常用API8.5.2 面试题8.5.3 点赞计数器8.5…

读书笔记-《ON JAVA 中文版》-摘要15[第十五章 异常]

文章目录 第十五章 异常1. 异常概念2. 基本异常2.1 基本异常2.2 异常参数 3. 异常捕获3.1 try 语句块3.2 异常处理程序3.3 终止与恢复 4. 自定义异常4.1 自定义异常 5. 异常声明6. 异常捕获6.1 捕获所有异常6.2 多重捕获6.3 栈轨迹6.4 重新抛出异常6.5 精准的重新抛出异常 6.6 …

ExpressGridPack Crack快速电子表格

ExpressGridPack Crack快速电子表格 ExpressEditors库 外壳对话框-对话框窗体不会出现在活动监视器中。 TdxVisualRefinements.PPadding属性对dxTokenEdit没有影响。 Express库 TdxVisualRefinements.PPadding属性对dxTokenEdit没有影响。 ExpressQuantumTreeList套件 TcxTreeL…

二层交换机和三层交换机到底区别在哪?

你好&#xff0c;这里是网络技术联盟站。 今天我们谈谈二层交换机和三层交换机。 二层交换机的概念和特点 二层交换机是一种工作在数据链路层的网络设备&#xff0c;主要功能是根据数据帧中的MAC地址进行转发&#xff0c;并将这些MAC地址与对应的端口记录在自己内部的一个地…

IDA常用宏定义函数

一.引言 做题目遇到了几个神奇的函数. SDWORD1(x), SDWORD2(x), SHIDWORD(x) 通过查询得知是IDA的宏定义函数 宏定义本身类似字符串替换,假设#define x 666 只是编译器在预处理阶段进行宏展开,将所有的x替换为666,然后再进行编译 二.IDA宏定义头文件 可以在路径\IDA_Pro_7.7…

Dubbo2.7 纯注解使用+ Nacos + Springboot 整合集成

Dubbo2.7 纯注解使用 NacosSpringboot 环境准备篇相关依赖nacos准备代码编写服务提供者服务使用者整体结构图 结果 常规操作篇服务分组服务版本参数传递泛化调用参数校验只订阅延迟暴露服务端异步回调多协议复用多注册中心本地存根 服务治理篇超时时间重试并发控制权限控制服务…

css04笔记

目录 盒子模型 5.7 外边距折叠现象 – ① 合并现象 5.8 外边距折叠现象 – ② 塌陷现象 5.9 行内元素的margin和padding无效情况 一、结构伪类选择器 &#xff08;了解&#xff09;nth-of-type结构伪类选择器 二、伪元素 三、标准流 四、浮动 浮动的代码&#xff1a; …

用 Pygal 模拟掷骰子

这篇博客&#xff0c;我们将学习使用 python可视化包 Pygal 来生成矢量图形文件。针对于需要在尺寸不同的屏幕上显示的图表具有很大用处。因为它们可以自动缩放&#xff0c;以此来适合观看者的屏幕。 . 在这个项目中&#xff0c;我们将对掷骰子的结果进行分析。掷6面的常规骰子…

<Linux> 基础IO(文件操作、文件描述符fd、重定向)

基础IO&#xff08;文件操作、文件描述符fd、重定向&#xff09; 文章目录 基础IO&#xff08;文件操作、文件描述符fd、重定向&#xff09;一、回顾C和C的文件操作二、C语言文件IO1.什么是当前路径&#xff1f;2.C语言文件接口汇总3.默认打开的三个流 三、系统文件IO1.open2.c…

真题详解(索引长度计算)-软件设计(七十一)

真题详解(哈希冲突)-软件设计&#xff08;七十)https://blog.csdn.net/ke1ying/article/details/130566800 在面向对象系统中&#xff0c;一个类定义了大体相似的对象&#xff0c;这些对象共享_____。 属性和行为。 &#xff08;属性就是状态&#xff09; 数据库主要分为用户…

shapefile.js实现shp数据的上传与展示

概述 shapefile是常见的矢量数据格式&#xff0c;但是由于其文件组成结构很难在webgis上直接展示。本文通过express和compressing实现打包后shapefile文件的上传&#xff0c;并结合shapefile.js实现shapefile数据的转换展示。 实现效果 实现代码 1. 后端实现 router.post(/…

Android 引入hunter-debug监测代码运行时函数耗时和参数及返回值,Java(1)

Android 引入hunter-debug监测代码运行时函数耗时和参数及返回值&#xff0c;Java&#xff08;1&#xff09; &#xff08;1&#xff09;在工程的根build.gradle文件里面添加cn.quinnchen.hunter:hunter-debug-plugin引用&#xff1a; buildscript {repositories {mavenCentra…