Java语言基础 进阶(一)

思维导图

在这里插入图片描述

1 概述与环境搭建

1.1 Java发展历史

创始公司:Sun Microsystems

发布时间:1995年

创始人:詹姆斯·高斯林

Java前身:oak

  • 1998年发布JDK1.2 : J2SE、J2EE、J2ME
  • 2004年发布JDK1.5:Java SE、Java EE、Java ME
  • 2009年被Oracle收购
  • 2014年由Oracle发布Java 8.0

1.2 java语言的特点

面向对象:贴近人类思维模式,模拟现实世界,解决现实问题

简单性:自动内存管理机制、不易造成内存溢出,简化流程处理、语义清晰

跨平台:跨操作系统,服务器等

开源:开放源代码

2 Java运行机制

2.1 计算机的执行机制

编译执行

将源文件编译成平台相关的机器码文件,一次编译,多次运行

执行效率高,不可跨平台

解释执行

将源文件交给不同平台独有的解释器。

执行效率低,可以跨平台。

Java的执行机制

先编译,再解释

将源文件编译成字节码文件(.class),再将字节码文件进行解释执行

Java的设计理念:一次编译,到处运行

2.2 环境

名词解释

JVM(Java Virtual Machine):Java虚拟机,使用软件在不同操作系统中,模拟相同的环境

JRE(Java Runtime Environment):Java运行环境,包含JVM和解释器,完整的Java运行环境

JDK(Java Development Kit):Java开发环境,包含JRE + 类库 + 开发工具包(编译器+调试器)

JDK目录

bin:binary 二进制文件

db:数据库

include:头文件

jre:Java运行环境

lib:类库

配置环境变量

右键我的电脑 --> 属性 --> 高级系统设置 --> 环境变量

1、在系统变量中新建:Java_Home

​ 变量值:JDK安装路径

2、在系统变量中新建:CLASSPATH

​ 变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

3、找到:Path

​ 在后面添加:%Java_Home%\bin;%Java_Home%\jre\bin;

2.3 常用DOS命令

windows + R # 打开命令提示符
d:     # 切换盘符为d盘
dir    # 显示当前目录下所有文件
dir /o # 分类显示
dir /w # 宽屏显示
dir /p # 分页显示
dir /s # 显示所有文件(包括子目录下的文件)

cd..     # 回到上级目录
cd \     # 切换到根目录
cd 目录名 # 切换目录

cls            # 清空屏幕
del my.txt     # 删除文件
del 目录        # 删除此目录下的所有文件(不删除目录)
rd 目录         # 删除目录(只能删除空目录)
rd /s 非空目录   # 除目录本身外,还将删除指定目录下的所有子目录和文件。用于删除目录树。
rd /q          # 安静模式,带 /S 删除目录树时不要求确认

md 目录    # 新建目录 (可以创建多级,用\分割)

copy robot\zbx\bird.png robot\picture # 复制文件 
xcopy ... /e                          # 复制目录下的文件及子目录

3 第一个Java程序

3.1 记事本编写Java程序

在c盘的myjava目录下创建一个文件 Hello.java

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

打开命令提示符,进入此文件所在的目录,执行如下命令

先编译:javac Hello.java
再执行:java Hello

3.2 字节码文件

查看字节码文件(.class)

javap -c Hello // 查看概要信息
    
// 虚拟机指令
C:\myjava>javap -c Hello
Compiled from "Hello.java"
public class Hello {
  public Hello();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String Hello World
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}
javap -v Hello // 显示更详细的信息

字节码文件标示

EditPlus工具打开字节码文件,使用十六进制查看器

前面四个字节 CA FE BA BE (魔术 字节码文件标示)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ipQ7Hvmc-1595379591611)(C:\A-Importance Data For My Study\md随手笔记\图像存储位置\image-20200721115030583.png)]

3.3 类 class

同一个文件可以定义多个类,但只能有一个public 类

public 修饰的类称为公开类,要求类名必须与文件名相同

编译后,每个类都会生成一个字节码文件

一个类中,只能有一个主方法,每个类都可以生成自己的主方法

3.4 包 package

作用:类似于文件夹,用于管理字节码文件

编写代码

package com.robot.base;

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

编译运行

javac -d . Hello.java    // .代表当前目录 -d代表带包编译

java com.robot.base.Hello

3.5 命名规范

包名

包名全部小写,只可以使用特殊字符“.”,但不能用“.”开头或结尾

采用域名倒置的规则:www.baidu.com —> com.baidu.xxx

例如:cn.com.company.department.group.project. module.XxxClass

标识符命名

可以由字母、数字、下划线、$组成,但不能以数字开头

不能与标识符,保留字重名

类名

大驼峰(一个单词或多个单词组成,每个单词的首字母大写)

函数名、变量名

小驼峰(一个单词或多个单词组成,第一个单词的首字母小写,其余拼接单词的首字母大写)

常量名

常量全大写,多个单词之间用下划线连接

3.6 注释

// 单行注释

/*
 * 多行注释
 */

/**
 * 文档注释
 */

4 Java变量

变量:计算机内存中的一块存储空间,是存储数据的基本单元

变量的组成:数据类型 变量名 = 值

4.1 变量的定义

int count; // 先声明 
count = 125; // 再赋值

String name = "robot"; // 声明并赋值

int a = 12, b = 25; // 多个同类型变量的声明与赋值

4.2 面试题

// 不使用第三个变量交换两个数字
public void exchange() {
    int a = 12;
    int b = 25;
    // 第一种方法,加减法
    a = a + b;
    b = a - b;
    a = a - b;
    System.out.println("a:" + a + "  b:" + b);
    
    // 第二种方法,异或
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    System.out.println("a:" + a + "  b:" + b);
}

异或分析

a = 2   b = 3

0010
0011
-----
0001   a = 1

0001
0011
-----
0010   b = 2

0001
0010
-----
0011   a = 3

a = 3   b = 2

5 Java数据类型

5.1 Java数据类型包括

  • 基本数据类型:整数、小数、布尔、字符

  • 引用数据类型:字符串、数组、对象

基本数据类型引用数据类型大小(字节)范围
byteByte1-2^7 ~ 2^7-1
shortShort2-2^15 ~ 2^15-1
intInteger4-2^31 ~ 2^31-1
longLong8-2^63 ~ 2^63-1
floatFloat4
doubleDouble8
charCharacter2
booleanBoolean1

面试题

double d = (1.4 - 0.5) / 0.9;
System.out.println(d);

// 结果
//    0.9999999999999999
// 原因
//    1.4和0.9在计算机中不能转换为精确的二进制数
System.out.println(1.0/0);
// 结果: Infinity
// 原因: 整数不能除零,会出现除零异常
//       浮点数除零,会显示无穷

5.2 转义字符

\'  // 单引号
\n  // 换行
\r  // 回车,光标移到行首
\t  // 制表符

5.3 类型转换

自动类型转换:目标类型 > 源类型

  • byte —> short —> int —> long —> float —> double
  • char —> int
byte a = 12;
int b = 25;
b = a; // b > a 所以可以自动转换

强制类型转换:目标类型 < 源类型

float c = 3.14f;
double e = 5.20;
c = (float) e; // c < e 需要强转

5.4 面试题

byte,short,char三者在计算时会转换成 int 类型。

byte b1 = 10;
byte b2 = 20;
byte b3 = (byte) (b1 + b2);

int整型常量和字符常量在合理范围内可以直接赋值给byte、 short、 int、char

6 原码、反码、补码

负数在计算机中使用补码存储

-128 = 1000 0000  # 特例

原码

最高位为符号位,0代表正数,1代表负数,其它位为改数字绝对值的二进制数

0111 1111  # 127的原码
1111 1111  # -127的原码

反码

正数:正数的反码与原码一致

负数:对原码 按位取反,但符号位不变

0111 1111  # 127的反码
1000 0000  # -127的反码

补码

正数:正数的补码与原码一致

负数:对原码 按位取反,末尾加一,但符号位不变

0111 1111  # 127的补码
1000 0001  # -127的补码

7 进制转换

二进制

逢二进一,例如:10110

十进制

逢十进一,例如:12

八进制

逢八进一,例如:12O

十六进制

逢十六进一,例如:2AH,0x25

基本数字:0-9,A-F

二进转十进制

从左到右用二进制的每个数去乘以2的权次幂相加

小数转换:小数点后面从-1次幂开始

二进制转八进制

三位转一位

110 101
 6   5
结果:65O

二进制转十六进制

四位转一位(因为四位二进制表示的范围和十六进制一位表示的范围一样)

1011 0101
 B    5
结果:B5H

十进制转二进制

除2取余,逆序排列

小数转换:小数点后面乘2取整

例如:2.5 = 10.1 2.8 = 10.11001…

8 Java运算符

8.1 运算符

算术运算符

+  -  *  /  %  ++  --

赋值运算符

=  +=  -=  *=  /=  %=

关系运算符

>  <  >=  <=  ==  !=

逻辑运算符

&&  || !

三元运算符

? :
a==b ? 1 : 0  // 如果a=b,则取值1,否则取值0

8.2 自动类型提升

进行算数运算时:

  • 两个操作数有一个为double,计算结果提升为double
  • 如果操作数中没有double,有一个为float,计算结果提升为float
  • 如果操作数中没有float,有一个为long,计算结果提升为long
  • 如果操作数中没有long,有一一个为int,计算结果提升为int
  • 如果操作数中没有int,均为short或byte,计算结果仍旧提升为int

8.3 练习题

一个四位数的数字,求各个位上数字的和

public void demo02() {
    int card = 4567;
    int ge = card % 10;
    int shi = card / 10 % 10;
    int bai = card / 100 % 10;
    int qian = card / 1000;

    System.out.println(ge + shi + bai + qian);
}

8.4 面试题

int k = 20;
for (int i = 0 ; i < 10 ; i++) {
    k = k++;
}
System.out.println(k);
// 结果: 20
//
// k = k++
// 1. (k++) = 20
// 2.  k = 21
// 3.  k = (k++) = 20
// 最后赋值给k的是(k++)不是k
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值