2021-05-16

本文详细介绍了Java编程的基础知识,包括Java的起源、主要特性、数据类型、注释、变量、运算符、流程控制及内存管理。重点讨论了数据类型的使用、转换规则以及内存中的原码、反码和补码表示。此外,还涵盖了方法的声明、调用以及内存划分,如栈内存、堆内存和方法区的作用。内容深入浅出,适合初学者学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、java概述

创建时间:1991年,命名OAK,是SUN公司推出,1995开始以java名义推出

创建人:Java之父詹姆斯·高斯林

分类:JavaSE,JavaEE,JavaME

二、java特性

面向对象,跨平台,自动垃圾回收,多线程(jvm四大特性)

java是准动态强类型解释性语言

java的准动态主要体现在反射机制

三、注释

1、单行注释

//这是单行注释

2、多行注释

/**
*这
*是
*多
*行
*注
*释
*/

四、数据

1、数据概念

程序:命令的集合

源文件是文本文件

二进制文件是电脑处理的文件

编写文本的是编辑器

把文本转为二进制文件的编译器

2、单位

bit:比特,最小的单位,位

byte:字节,一个字节是8位

最高位表示符号位,0表示正数,1表示负数

3、存储方式

内存:两端无限延伸的线

硬盘:螺旋线

光盘:同心圆

五、数据类型

1、分类

基本数据类型

​ 数值型

​ 整型

​ byte 字节 8bit -128~127

​ short 短整型 16bit

​ int 整形 32bit

​ long 长整形 64bit

​ 浮点型

​ float 单浮点 32bit

​ double 双浮点 64bit

​ 字符型

​ char 字符 16bit

​ 布尔型

​ boolean 布尔 8bit

引用数据类型

​ 类,数组,接口

注意:java中不能表示2进制,但是可以可以表示8进制,10进制

8进制:0开头

10进制:非0开头

16进制:0x开头 A-F表示10到15

2、命名规范

除了强制命名还有非强制命名

非强制命名:类名遵循大驼峰,变量名和方法名遵循小驼峰

3、类型的使用

1、整型

public static void main(String[] args){
        int i_1 = 10;
        //这里的10默认是int类型
        System.out.print(10);
        

2、浮点型

public static void main(String[] args){
        //float的值必须加F
        float f_1 = 2.2F;
        float f_2 = (float)2.2;
        double d_1 = 2.0;

3、字符型

/**
	char是字符型,用英文单引号表示,并且单引号中只能有一个字符
	
	char 占用两个字节,16位,范围0~65535
*/
public static void main (String[] args){
    char a = 'li'
}

4、布尔型

/**
java里面布尔型只有true和false

*/

 
public static void main(String[] args){
        boolean flag = true;
    }

5、转义符

public calss DT_04_char{
    public static void main(String[] args){
        //为了解决某些特殊的字符赋值,引入了转义字符\
        char c_1 = '\'';
        // \n 换行 \t tab键
    }
}

4.数据类型的转换

1、8中数据类型中除了boolean类型之外,其他的都可以相互转换

2、低精度到高精度是自动转换(隐式转换),高精度到低精度是强制转换(显示转换)

byte->short->int->long->float->double

char->

注意short不可以自动转char,因为short是32767,char到65535

byte也不可以自动转char,因为有负数

3、强制转换会把高位截取掉,可能会造成数据错误

4、多种数据类型混合运算中,结果的类型是参与运算的类型中最大的类型

注意:byte short char int 任意之中或者多种运行,结果都是int

5.常量、变量、字面量

常量:在程序生命运行周期,值不可以更改

字面量/直接量:没有明确表示空间存储,不能重复使用

变量:在程序生命周期,值可以改变,可以理解为有名字的变量空间

变量的声明:

数据类型 变量名;

数据类型划分内存空间大小,给空间取名字,然后赋值

变量定义:

数据类型 变量名 = 赋值;

作用域:

一个大括号{}就是一个作用域,一个变量的使用范围,不会超过包含他的大括号

 

 

原码,反码,补码

原码:二进制表示法,最高位是符号位,"0"表示正,"1"表示负,其余是数值位

反码:正数的反码与原码相同,负数的反码就是对其原码逐一取反,符号位除外

补码:正数的补码与原码相同,负数的补码是在反码的末尾加1

注意:我们读取的十进制是根据原码来读取,而在内存中,数值都是以二进制补码形式保存的。

一.算数运算符

1.种类

符号名称
+
-
*
/
%取余
++自增
--自减

2.i++和i--的区别

i++:先赋值后加1

++i:先加1后赋值

只要记住程序是从左往右运行的就行

3.优先级

优先级:单目>双目>三目

单目:只有一个操作数,比如++和--

双目:1+2

4.注意

0.1+0.2不等于0.3

所以千万不要使用小数进行比较

二.关系运算符

1.分类

符号名称
>大于
>=大于等于
<小于
<=小于等于
==等于
!=不等于

2.注意

==比较的是基本类型的大小,而引用类型是比较地址

==是比较,=是赋值

三.位运算符

1.分类

符号名称解释
&位与两边都是true,结果才是true
|位或两边一个是true,结果就是true
!位非取反
^位异或两边不一样,结果就是true
~按位非将内存中的二进制位逐一取反(注意内存中保存的是二进制的补码)
>>右移运算符(考虑符号位)二进制向右移动
<<左移运算符(考虑符号位)二进制向左移动
>>>右移运算符(不考虑符号位)二进制向右移动
&&且,短路与和 & 一样,如果第一个是false,第二个就不执行了, 但是 & 第二个也会执行
||或,短路或如果第一个是true,第二个就不执行了, 但是 |第二个会执行

2.>>和>>>详解

>>和<<

符号位不变

8>>2
    0000 1000
    运算后: 0000 0010
    结果:2
面试经常问的就是如何计算2的3次方
    result = 2<<2;
    因为是直接操作内存中的2进制数,所以会比较快
8<<2
    运算后:0010 0000
-1<<2
    -1的原码:1000 0001
        反码:1111 1110
        补码:1111 1111(内存中保存的就是补码)
    <<运算后:1111 1100
        反码:1111 1011
        原码:1000 0100
        结果:-4
-1>>2
    -1的原码:1000 0001
        反码:1111 1110
        补码:1111 1111(内存中保存的就是补码)
    >>运算后:1111 1111
        结果没有变

规律:

符号位不变,移动其他位

>>>

符号位变

8>>>2
    补码:0000 1000
    >>>后:0000 0010
-128>>>2
    -128的原码:1000 0000
        反码:0111 1111
        补码:1000 0000(内存中保存的就是补码) 
    >>>运算后:1110 0000

注意没有<<<

注意:以上的都是模拟8位2进制数来计算的,实际上-128没法表示,如果你会的话评论下面教教我

四.赋值运算符

符号解释
=把左边的值赋值给右边
+=i+=2等价于i = i + 2
-=i-=2等价于i = i - 2
*=i*=2等价于i = i * 2
/=i/=2等价于i = i / 2
%=i%=2等价于i = i % 2

注意:

byte b = 2;
b = (int)(b + 2);//需要强转
b += 2;//不需要强转

 

五.字符串连接符

"+"号既是数值运算符号也是字符串的拼接符号

String str = "hello";
int a = 10;
str = str + a;//str会变成hello10

 

六.三目运算符

语法 : boolean表达式 ? 真语句 : 假语句;

int i = 0;
// 需求 : 如果为真 给变量i 赋值1,否则赋值 11
i =  2<3 ? 1 : 11;

七.优先级

以下优先级由高到低

运算符分类结合顺序运算符
分隔符左结合.[]();,
一元运算符右结合! ++ – - ~
算术运算符左结合* / % + -
移位运算符左结合<< >> >>>
关系运算符左结合< > <= >= instanceof == !=
逻辑运算符左结合! && ||~ & |^
三目运算符右结合布尔表达式?表达式1:表达式2
赋值运算符右结合= *= /= %= += -= <<= >>= >>>= &= *= |=

 

 

 

一.顺序结构

从上往下,从左到右执行

二.分支结构

通过某个判断条件,选择不同的执行分支

2.1单分支

有不执行情况

if(boolean表达式){
    //success do
}

 

2.2双分支

肯定会执行

if(boolean表达式){
    //success do
}else{
    //fail do 
}

 

2.3多分支

2.3.1 if else

else结尾肯定会执行,否则有不执行情况,多分支只会有一个执行

if(boolean表达式){
    //success do
}else if(boolean表达式){
    //success do 
}else{
    //fail do
}

注意:如果分支下只有一条语句,那么可以不用加括号

2.3.2 switch

语法 : 
 switch( 变量 ){ 
        case 值: java语句; break; // 可以不写 
        case 值: java语句; break; 
        case 值: java语句; break; 
        default: // 可以不写 默认执行程序; 
 }

注意:1.7之前 ,只能传入整型(byte,short,char,int) 自动类型转换 1.7开始,还可以传入字符串

三.循环结构

3.1for循环

for循环又被称为计数循环

语法:

for(表达式1;表达式2;表达式3){
    //要循环做的事
}

表达式1 : 是初始化表达式,最先执行,且执行一次

表达式2 : 必须是boolean类型的表达式

表达式3 : 步长

例子:输出0-9之内的偶数

for(int i = 0;i<10;i+=2){
    System.out.println(i);
}

运行过程:

表达式1---->判断表达式2真假------>(真)执行循环体---------->表达式2判断真假(循环执行)

------->(假)退出循环

循环三要素:

初始值,终止条件,步长

 

嵌套循环

九九乘法表

for(int i = 1;i<10;i++){
    for(int j = 1;j<=i;j++){
        System.out.println(j+" * "+i+"="+i*j);
    }
}

 

3.2while循环

while循环又被称为真假循环

语法:

while(boolean表达式){
    java代码;
}

for和while的执行次数都是0~n次

某个次数范围内,for有优势

某个条件为真的条件下,while有优势

3.3do..while...

保障代码至少执行一次

先执行后判断

语法:

do{
   java语句;
}while(boolean表达式);

四.break,continue,return

break

1.用于switch语句中,结束分支语句,防止case穿透现象

2.用于循环体中结束循环执行,默认结束最近的一次循环

continue

跳过本次循环,继续下次循环

return

结束方法

五.内层循环结束外层循环方法

方法一

boolean flag = false;
for(int i = 0;i<10;i++){
    for(int j = 0;j<10;j++){
        if(i==5&&j==5){
            flag = true;
        }
    }
    if(flag == true){
        break;
    }
}

方法二

boolean flag = false;
outer:for(int i = 0;i<10;i++){
    for(int j = 0;j<10;j++){
        if(i==5&&j==5){
            break outer;
        }
    }
}

 

 

 

 

一.方法

1.1概述和作用

一堆代码的集合,可以重复使用

1.使程序变得简洁更清晰

2.有利于程序维护

3.提高开发效率

4.提高代码重复性/复用性

1.2方法声明

[修饰符列表] 返回值类型 方法名(参数列表){方法体}

[]:0-n个

1.方法修饰符列表,是可选的:

权限控制:public private protected,默认(不写)

static(声明静态),abstract,synchronized,finall

2.返回值类型:11中数据类型的任意一种,或者是void

3.方法名:合法的标识符即可(大小写字母,下划线,美元符号,数字,数字不能打头,不能使用关键字和保留字)

4.参数列表,可以有,可以没有,可以有多个,过个之间使用逗号隔开

形参:形容参数,在方法声明的时候,规定传入什么类型的数据

实参:调用方法的时候,时间传入的数据

5.方法体:要做的事情,代码的集合

如果有返回值类型,那么方法体中,最后一条语句必须写return 数据;

如果没有返回值类型,那么方法体中可以没有语句,如果要加return语句,那么return之后不能有数据

只能写return;.此时return只有终止方法运行的作用.

1.3方法的分类

静态方法:使用static关键字修饰的方法.类相关

成员方法没有使用static关键字修饰的方法.对象相关

构造方法用于创建对象

静态方法

public static void test(){}

 

成员方法

public int test(){}

 

构造方法(没有返回值,方法名和类名一样)

public Test(){}

1.4方法的调用

方法不调用不执行,调用才执行,并把结果返回到调用处

1.静态方法:类名.静态方法名(参数值);

2.成员方法:对象.成员方法(参数值)

3构造方法:使用new关键字调用

1.5返回值

1如果方法有返回值,必须有return

2 如果方法没有返回值,可以没有return

注意:return语句的后面不可以有语句

 

1.6方法的重载

方法重载:overload

方法名相同,参数列表不同(个数或者类型不同)

在同一个类中,方法名是允许相同的,可以根据方法名和参数列表来确定一个方法

例子:

public static void sum(int a,int b){
    System.out.println(a+b);
}
public static void sum(double a,double b){
    System.out.println(a+b);
}
public static void sum(byte a,byte b){
    System.out.println(a+b);
}

注意:只考虑方法名和参数列表

作用:记忆方便,代码简洁

二.内存划分

程序:一堆命令的集合,是可执行文件,并且是个静态概念,一般保存在硬盘中

进程:就是正在执行的程序,是个动态概念,会按照程序设计,一步步在内存中执行

java中的内存划分:

java Runtime Data Area: java运行时数据区,也可以叫jvm内存

内存被划分为5个区域:程序计数器,方法区/静态区,栈内存,堆内存,本地方法栈

2.1程序计数器:

是一块比较小的内存区域,可以看做是当前执行的字节码位置,分支,循环,跳转,异常等都需要依赖程序计数器,可以理解为保存执行的代码行号,每个方法都会有一个计数器,否则不知道返回值要返回到哪里

2.2.方法区/静态区

保存我们的程序文件(class),载入内存后的那个文件,java中就是calss文件

包括方法,还有代码段,内部的运行常量池

2.3栈内存

虚拟机栈/VM栈/栈内存

方法是在栈内存中执行的,包括局部变量也是在栈内存

栈内存:就是一个以栈为数据结构模型的一段内存空间

栈:先进先出,比如弹夹

栈的构成:

栈空间:就是指以栈数据结构为模型的于丹内存空间

栈帧:栈内存中的每一个元素

栈底元素:最先入栈的元素

栈顶元素:最后入栈的元素

栈操作:

压栈:元素入栈的操作

弹栈:元素出栈的操作

2.4堆内存

用来存放对象

每个对象的空间分为3块:

1.数据部分:成员变量

2.头部:hashCode值

3.类型:保存类文件在静态区的地址

2.5本地栈

为虚拟机执行使用到的Native方法服务,本地方法栈 和 VM栈 结构一样

2.6java内存模型图解

image-20210516215551217

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值