java初始以及开发环境的搭建

常用的DOS命令:

/*
DOS命令有很多,我们不需要学习所有DOS命令,只需要学习我们Java中要用到的常用DOS命令,内容如下:
1.清屏:cls;
    当DOS控制台内容过多时,可以使用清屏命令,等同与“擦黑板”;
    例如:C: >cls,然后按回车键。
2.切换盘符::;
    默认情况下我们是在C盘中,如果想去其他盘符可以使用该命令;
    例如:C: >E:,然后按回车键就到了E盘下。
3.进入指定目录:cd;
    当我们想进入某个目录时可以使用该命令;
    例如:D:>cd develop,这样就进入了D:develop目录,当然你需要保证这个目录是存在的;
    例如:D:>cd developJava,这样就进入了D:developJava目录。
4.返回上一级目录:cd..;0
    当你需要返回到上一级目录时可以使用该命令;
    例如:D:developJava>cd..,然后按回车,就会返回到D:develop目录下。
5.返回盘符根目录:cd;
    当需要返回到当前盘符根目录下可以使用该命令;
    例如:D:developJava>cd,然后按回车,这样就返回到D:/目录下了。
6.显示当前目录下的文件和子目录信息:dir;
    当需要查看当前目录下所有文件和子目录信息时可以使用该命令;
7.运行应用程序:程序完整名称 参数
    当需要运行某个应用程序时可以使用该命令;
    例如要运行记事本程序时:D:>C:windows
otepad.exe,这样就打开了记事本程序,这与你到C:windows目录下双击该程序图标的效果相同,因为该程序支持双击运行;
    还可以省略“.exe”后缀,例如:D:>C:windows
otepad,效果同上;
*/

安装java环境:

/*
JDK的全称是JavaSE Development Kit,即java开发工具包,是sun公司提供的一套用于开发java应用程序的开发包,它提供了编译、运行java程序所需的各种工具和资源,包括java编译器、java运行时环境,以及常用的java类库等。
这是又设计到一个概念:JRE,全称Java Runtime Environment ,java运行时环境。它是运行java程序的必须条件。
一般而言,如果只是运行java程序,可以只安装JRE,无需安装JDK。
*/
// 下载地址:http://www.oracle.com/cn/index.html
// 傻瓜式安装,下一步即可。但默认的安装路径是在C:Program Files下,为方便统一管理建议修改安装路径,将与开发相关的软件都安装到一个目录下,例如:E:develop。

JDK的安装目录介绍:

目录名称 说明
bin 该路径下存放了JDK的各种工具命令。javac和java就放在这个目录。
conf 该路径下存放了JDK的相关配置文件。
include 该路径下存放了一些平台特定的头文件。
jmods 该路径下存放了JDK的各种模块。
legal 该路径下存放了JDK各模块的授权文档。
lib 该路径下存放了JDK工具的一些补充JAR包。

跨平台特性:

/*
Java程序并非是直接运行的,Java编译器将Java源程序编译成与平台无关的字节码文件(class文件),然后由Java虚拟机(JVM)对字节码文件解释执行。
所以在不同的操作系统下,只需安装不同的Java虚拟机即可实现java程序的跨平台。
*/
/*
1.平台指的是操作系统 (Windows,Linux,Mac)。
2.Java程序可以在任意操作系统上运行,一次编写到处运行
3.实现跨平台需要依赖Java的虚拟机 JVM (Java Virtual Machine)
*/

JRE和JDK的理解:

/*JVM(Java Virtual Machine),Java虚拟机

JRE(Java Runtime Environment),Java运行环境,包含了JVM和Java的核心类库(Java API)

JDK(Java Development Kit)称为Java开发工具,包含了JRE和开发工具

总结:我们只需安装JDK即可,它包含了java的运行环境和虚拟机。*/

Path环境变量的配置(应用):

为什么配置环境变量:

/*开发Java程序,需要使用JDK提供的开发工具(比如javac.exe、java.exe等命令),而这些工具在JDK的安装目录的bin目录下,
如果不配置环境变量,那么这些命令只可以在该目录下执行。我们不可能把所有的java文件都放到JDK的bin目录下,
所以配置环境变量的作用就是可以使bin目录下的java相关命令可以在任意目录下使用。
*/

java程序介绍:

java初始以及开发环境的搭建

/*
1.源文件:编写Java源文件(我们也称之为源代码文件),它的扩展名为.java;(用javac.exe编译成字节文件.如:javac helloword.java)
2.编译:然后通过编译器把源文件编译成字节码文件,字节码文件扩展名为.class;(用java.exe来运行字节文件.如:java helloword)文件名不能带.class!!!
3.运行:最后使用解释器来运行字节码文件。
*/

HelloWorld案例:

/*
1.HelloWorld案例是指在计算机屏幕上输出“HelloWorld”这行文字。

2.开发Java程序,需要三个步骤:编写程序,编译程序,运行程序。

3.新建文本文档文件,修改名称为HelloWorld.java。

4.用记事本打开HelloWorld.java文件,输写程序内容。
*/
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("HelloWorld");
    }
}
/*
存文件,打开命令行窗口,将目录切换至java文件所在目录,编译java文件生成class文件,运行class文件。

1.编译:javac 文件名.java
    范例:javac HelloWorld.java

2.执行:java 类名
    范例:java HelloWorld
*/

java初始以及开发环境的搭建

注释的使用:

//Java中提供了三种注释方式,分别是:
    1.单行注释    //注释内容
    2.多行注释    /*注释内容*/
    3.文档注释    /**注释内容*/

关键字:

// 关键字是指被java语言赋予了特殊含义的单词。

/*
关键字的特点:
​    关键字的字母全部小写。
​    常用的代码编辑器对关键字都有高亮显示,比如现在我们能看到的public、class、static等。
*/

常量:

/*常量:在程序运行过程中,其值不可以发生改变的量。

Java中的常量分类:
​    1.字符串常量  用双引号括起来的多个字符(可以包含0个、一个或多个),例如"a"、"abc"、"中国"等
​    2.整数常量  整数,例如:-10、0、88等
​    3.小数常量  小数,例如:-5.5、1.0、88.88等
​    4.字符常量  用单引号括起来的一个字符,例如:'a'、'5'、'B'、'中'等
​    5.布尔常量  布尔值,表示真假,只有两个值true和false
​    6.空常量  一个特殊的值,空值,值为null

除空常量外,其他常量均可使用输出语句直接输出。*/
public class Demo {
    public static void main(String[] args) {
        System.out.println(10); // 输出一个整数
        System.out.println(5.5); // 输出一个小数
        System.out.println('a'); // 输出一个字符
        System.out.println(true); // 输出boolean值true
        System.out.println("欢迎来到黑马程序员"); // 输出字符串
    }
}

数据类型:

/*
我们知道计算机是可以用来存储数据的,但是无论是内存还是硬盘,计算机存储设备的最小信息单元叫“位(bit)”,我们又称之为“比特位”,通常用小写的字母”b”表示。
而计算机中最基本的存储单元叫“字节(byte)”,通常用大写字母”B”表示,字节是由连续的8个位组成。 除了字节外还有一些常用的存储单位,其换算单位如下: 1B(字节) = 8bit 1KB = 1024B 1MB = 1024KB 1GB = 1024MB 1TB = 1024GB
*/
/*Java是一个强类型语言,Java中的数据必须明确数据类型。在Java中的数据类型包括基本数据类型和引用数据类型两种。*/

四类

八种

字节数

数据表示范围

byte

1

-128~127

short

2

-32768~32767

int

4

-2147483648~2147483648

long

8

-263~263-1

浮点型

float

4

-3.403E38~3.403E38

double

8

-1.798E308~1.798E308

字符型

char

2

表示一个字符,如('a','A','0','家')

布尔型

boolean

1

只有两个值true与false

/*
e+38表示是乘以10的38次方,同样,e-45表示乘以10的负45次方。
​在java中整数默认是int类型,浮点数默认是double类型。
*/

变量:

/*
变量:在程序运行过程中,其值可以发生改变的量。

从本质上讲,变量是内存中的一小块区域,其值可以在一定范围内变化。
*/

定义变量规则:

/*
变量的定义格式:
​    数据类型 变量名 = 数据值;
​    数据类型:为空间中存储的数据加入类型限制。整数?小数?
​    变量名:自己要为空间起的名字
​    数据值: 空间中要存储的数值
*/
// 数据类型 变量名 = 初始化值; // 声明变量并赋值
int age = 18;
System.out.println(age);

// 先声明,后赋值(使用前赋值即可)
// 数据类型 变量名;
// 变量名 = 初始化值;
double money;
money = 55.5;
System.out.println(money);

//在同一行定义多个同一种数据类型的变量,中间使用逗号隔开。
但不建议使用这种方式,降低程序的可读性。
int a = 10, b = 20; // 定义int类型的变量a和b,中间使用逗号隔开
System.out.println(a);
System.out.println(b);

int c,d; // 声明int类型的变量c和d,中间使用逗号隔开
c = 30;
d = 40;
System.out.println(c);
System.out.println(d);

/*
1. 在同一对花括号中,变量名不能重复。
2. 变量在使用之前,必须初始化(赋值)。
3. 定义long类型的变量时,需要在整数的后面加L(大小写均可,建议大写)。因为整数默认是int类型,整数太大可能超出int范围。
4. 定义float类型的变量时,需要在小数的后面加F(大小写均可,建议大写)。因为浮点数的默认类型是double, double的取值范围是大于float的,类型不兼容。
*/

标识符:

/*
标识符是用户编程时使用的名字,用于给类、方法、变量、常量等命名。

1.Java中标识符的组成规则:
​    由字母、数字、下划线“_”、美元符号“$”组成,第一个字符不能是数字。
​    不能使用java中的关键字作为标识符。
​    标识符对大小写敏感(区分大小写)。


2.Java中标识符的命名约定:
​    小驼峰式命名:变量名、方法名
​        首字母小写,从第二个单词开始每个单词的首字母大写。
​    大驼峰式命名:类名
​        每个单词的首字母都大写。

​    另外,标识符的命名最好可以做到见名知意

​        例如:username、studentNumber等。
*/

三元表达式:

//格式: 
    //(条件表达式)?表达式1:表达式2;

Scanner

//引用数据类型的使用:与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固定的步骤或格式。
    //数据类型  变量名  =  new 数据类型();
//每种引用数据类型都有其功能,我们可以调用该类型实例的功能。
    //变量名.方法名();

Scanner类的使用:

import java.util.Scanner;
public class ScannerDemo01 {
    public static void main(String[] args) {
        //创建Scanner引用类型的变量
        Scanner sc = new Scanner(System.in);//创建对象实例
        //获取数字
        System.out.println("请输入一个数字");
        int n = sc.nextInt();    // 用来接收控制台录入的数字
        System.out.println("n的值为" + n);
        //获取字符串
        System.out.println("请输入一个字符串");
        String str = sc.next();    // 用来接收控制台录入的字符串
        System.out.println("str的值为" + str);
    }
}

Random类的使用:

import java.util.Random;

public class RandomDemo {
    public static void main(String[] args) {
        // 创建Random类的实例
        Random r = new Random(); 
        // 得到0-100范围内的随机整数,将产生的随机整数赋值给i变量
        int i = r.nextInt(100); 
        //得到0.0-1.0范围内的随机小数,将产生的随机小数赋值给d变量
        double d = r.nextDouble(); 
        System.out.println(i); 
        System.out.println(d); 
    }
}

类型转换:

/*
在Java中,一些数据类型之间是可以相互转换的。分为两种情况:自动类型转换和强制类型转换。

隐式转换(理解):
    把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量。这种转换方式是自动的,直接书写即可。
*/
//例如:
double num = 10; // 将int类型的10直接赋值给double类型
System.out.println(num); // 输出10.0

java初始以及开发环境的搭建

// 说明:
// 1. 整数默认是int类型,byte、short和char类型数据参与运算均会自动转换为int类型:
byte b1 = 10;
byte b2 = 20;
byte b3 = b1 + b2;
// 第三行代码会报错,b1和b2会自动转换为int类型,计算结果为int,int赋值给byte需要强制类型转换。
// 修改为:
int num = b1 + b2;
// 或者:
byte b3 = (byte) (b1 + b2);
// 2.boolean类型不能与其他基本数据类型相互转换。

强制转换:

/*
把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量。

强制类型转换格式:目标数据类型 变量名 = (目标数据类型)值或者变量;
*/
// 例如:
double num1 = 5.5;
int num2 = (int) num1; // 将double类型的num1强制转换为int类型
System.out.println(num2); // 输出5(小数位直接舍弃)

类型转换案例:

byte a = 3;
byte b = 4;
byte c = a + b; //错误。因为两个byte变量相加,会先提升为int类型
byte d = 3 + 4; //正确。常量优化机制
/*
常量优化机制:
​    在编译时,整数常量的计算会直接算出结果,并且会自动判断该结果是否在byte取值范围内,
​     在:编译通过
         不在:编译失败
*/

运算符

/*
运算符:对常量或者变量进行操作的符号

表达式:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式。
不同运算符连接的表达式体现的是不同类型的表达式。
*/

int a = 10;
int b = 20;
int c = a + b;

// +:是运算符,并且是算术运算符。
 // a + b:是表达式,由于+是算术运算符,所以这个表达式叫算术表达式。
符号 作用 说明
+ 参看小学一年级
- 参看小学一年级
* 参看小学二年级,与“×”相同
/ 参看小学二年级,与“÷”相同
% 取余 获取的是两个数据做除法的余数

注意:

/*
1. /和%的区别:两个数据做除法,/取结果的商,%取结果的余数。

2. 整数操作只能得到整数,要想得到小数,必须有浮点数参与运算。
*/
int a = 10;
int b = 3;
System.out.println(a / b); // 输出结果3
System.out.println(a % b); // 输出结果1

//字符的“+”操作(理解):
/*
char类型参与算术运算,使用的是计算机底层对应的十进制数值。需要我们记住三个字符对应的数值:

'a'  --  97        a-z是连续的,所以'b'对应的数值是98,'c'是99,依次递加

'A'  --  65        A-Z是连续的,所以'B'对应的数值是66,'C'是67,依次递加

'0'  --  48        0-9是连续的,所以'1'对应的数值是49,'2'是50,依次递加
*/
// 可以通过使用字符与整数做算术运算,得出字符对应的数值是多少
char ch1 = 'a';
System.out.println(ch1 + 1); // 输出98,97 + 1 = 98

char ch2 = 'A';
System.out.println(ch2 + 1); // 输出66,65 + 1 = 66

char ch3 = '0';
System.out.println(ch3 + 1); // 输出49,48 + 1 = 49
// 算术表达式中包含不同的基本数据类型的值的时候,整个算术表达式的类型会自动进行提升。
/*
byte类型,short类型和char类型将被提升到int类型,不管是否有其他类型参与运算。

整个表达式的类型自动提升到与表达式中最高等级的操作数相同的类型

等级顺序:byte,short,char --> int --> long --> float --> double
*/

//提升规则:
byte b1 = 10;
byte b2 = 20;
// byte b3 = b1 + b2; // 该行报错,因为byte类型参与算术运算会自动提示为int,int赋值给byte可能损失精度
int i3 = b1 + b2; // 应该使用int接收
byte b3 = (byte) (b1 + b2); // 或者将结果强制转换为byte类型
//-------------------------------
int num1 = 10;
double num2 = 20.0;
double num3 = num1 + num2; // 使用double接收,因为num1会自动提升为double类型

字符串的“+”操作(理解):

//当“+”操作中出现字符串时,这个”+”是字符串连接符,而不是算术运算。
System.out.println("itheima"+ 666); // 输出:itheima666

//在”+”操作中,如果出现了字符串,就是连接运算符,否则就是算术运算。当连续进行“+”操作时,从左到右逐个执行。
System.out.println(1 + 99 + "年黑马");            // 输出:100年黑马
System.out.println(1 + 2 + "itheima" + 3 + 4);   // 输出:3itheima34

// 可以使用小括号改变运算的优先级 
System.out.println(1 + 2 + "itheima" + (3 + 4)); // 输出:3itheima7

数值拆分:

/*
需求:
​    键盘录入一个三位数,将其拆分为个位,十位,百位,打印在控制台
*/
import java.util.Scanner;
public class Test {
    public static void main(String[] args) {
        // 1:使用Scanner键盘录入一个三位数
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个三位数");
        int num = sc.nextInt();
        // 2:个位的计算:数值 % 10
        int ge = num % 10;        
        // 3:十位的计算:数值 / 10 % 10
        int shi = num / 10 % 10;    
        // 4:百位的计算:数值 / 100
        int bai = num / 100;
        // 5:将个位, 十位, 百位拼接上正确的字符串, 打印即可
        System.out.println("整数"+num+"个位为:" + ge);
        System.out.println("整数"+num+"十位为:" + shi);
        System.out.println("整数"+num+"百位为:" + bai);
        
    }
}

自增自减运算符:

符号 作用 说明
++ 自增 变量的值加1
-- 自减 变量的值减1
/*
注意事项:

​    ++和-- 既可以放在变量的后边,也可以放在变量的前边。

​    单独使用的时候, ++和-- 无论是放在变量的前边还是后边,结果是一样的。

​    参与操作的时候,如果放在变量的后边,先拿变量参与操作,后拿变量做++或者--。

​    参与操作的时候,如果放在变量的前边,先拿变量做++或者--,后拿变量参与操作。

​    最常见的用法:单独使用。
*/
int i = 10;
i++; // 单独使用
System.out.println("i:" + i); // i:11

int j = 10;
++j; // 单独使用
System.out.println("j:" + j); // j:11

int x = 10;
int y = x++; // 赋值运算,++在后边,所以是使用x原来的值赋值给y,x本身自增1
System.out.println("x:" + x + ", y:" + y); // x:11,y:10

int m = 10;
int n = ++m; // 赋值运算,++在前边,所以是使用m自增后的值赋值给n,m本身自增1
System.out.println("m:" + m + ", m:" + m); // m:11,m:11

练习:
int x = 10;
int y = x++ + x++ + x++;
System.out.println(y); // y的值是多少?
/*
解析,三个表达式都是++在后,所以每次使用的都是自增前的值,但程序自左至右执行,所以第一次自增时,使用的是10进行计算,但第二次自增时,x的值已经自增到11了,所以第二次使用的是11,然后再次自增。。。
所以整个式子应该是:int y = 10 + 11 + 12;
输出结果为33。
*/
// 注意:通过此练习深刻理解自增和自减的规律,但实际开发中强烈建议不要写这样的代码!小心挨打!

赋值运算符:

// 赋值运算符的作用是将一个表达式的值赋给左边,左边必须是可修改的,不能是常量。
/*
注意:
    扩展的赋值运算符隐含了强制类型转换。
*/

short s = 10;
s = s + 10; // 此行代码报错,因为运算中s提升为int类型,运算结果int赋值给short可能损失精度

s += 10; // 此行代码没有问题,隐含了强制类型转换,相当于 s = (short) (s + 10);
符号 作用 说明
= 赋值 a=10,将10赋值给变量a
+= 加后赋值 a+=b,将a+b的值给a
-= 减后赋值 a-=b,将a-b的值给a
*= 乘后赋值 a*=b,将a×b的值给a
/= 除后赋值 a/=b,将a÷b的商给a
%= 取余后赋值 a%=b,将a÷b的余数给a

关系运算符:

//    关系运算符有6种关系,分别为小于、小于等于、大于、等于、大于等于、不等于。
/*
注意事项:
​    关系运算符的结果都是boolean类型,要么是true,要么是false。
​    千万不要把“==”误写成“=”,"=="是判断是否相等的关系,"="是赋值。
*/
int a = 10;
int b = 20;
System.out.println(a == b); // false
System.out.println(a != b); // true
System.out.println(a > b); // false
System.out.println(a >= b); // false
System.out.println(a < b); // true
System.out.println(a <= b); // true

// 关系运算的结果肯定是boolean类型,所以也可以将运算结果赋值给boolean类型的变量
boolean flag = a > b;
System.out.println(flag); // 输出false
符号 说明
== a==b,判断a和b的值是否相等,成立为true,不成立为false
!= a!=b,判断a和b的值是否不相等,成立为true,不成立为false
> a>b,判断a是否大于b,成立为true,不成立为false
>= a>=b,判断a是否大于等于b,成立为true,不成立为false
< a<b,判断a是否小于b,成立为true,不成立为false
<= a<=b,判断a是否小于等于b,成立为true,不成立为false

逻辑运算符:

// 逻辑运算符把各个运算的关系表达式连接起来组成一个复杂的逻辑表达式,以判断程序中的表达式是否成立,判断的结果是 true 或 false。
//定义变量
int i = 10;
int j = 20;
int k = 30;

//& “与”,并且的关系,只要表达式中有一个值为false,结果即为false
System.out.println((i > j) & (i > k)); //false & false,输出false
System.out.println((i < j) & (i > k)); //true & false,输出false
System.out.println((i > j) & (i < k)); //false & true,输出false
System.out.println((i < j) & (i < k)); //true & true,输出true
System.out.println("--------");

//| “或”,或者的关系,只要表达式中有一个值为true,结果即为true
System.out.println((i > j) | (i > k)); //false | false,输出false
System.out.println((i < j) | (i > k)); //true | false,输出true
System.out.println((i > j) | (i < k)); //false | true,输出true
System.out.println((i < j) | (i < k)); //true | true,输出true
System.out.println("--------");

//^ “异或”,相同为false,不同为true
System.out.println((i > j) ^ (i > k)); //false ^ false,输出false
System.out.println((i < j) ^ (i > k)); //true ^ false,输出true
System.out.println((i > j) ^ (i < k)); //false ^ true,输出true
System.out.println((i < j) ^ (i < k)); //true ^ true,输出false
System.out.println("--------");

//! “非”,取反
System.out.println((i > j)); //false
System.out.println(!(i > j)); //!false,,输出true
符号 作用 说明
& 逻辑与 a&b,a和b都是true,结果为true,否则为false
| 逻辑或 a|b,a和b都是false,结果为false,否则为true
^ 逻辑异或 a^b,a和b结果不同为true,相同为false
! 逻辑非 !a,结果和a的结果正好相反

短路逻辑运算符:

/*
在逻辑与运算中,只要有一个表达式的值为false,那么结果就可以判定为false了,没有必要将所有表达式的值都计算出来,短路与操作就有这样的效果,可以提高效率。同理在逻辑或运算中,一旦发现值为true,右边的表达式将不再参与运算。

- 逻辑与&,无论左边真假,右边都要执行。

- 短路与&&,如果左边为真,右边执行;如果左边为假,右边不执行。

- 逻辑或|,无论左边真假,右边都要执行。

- 短路或||,如果左边为假,右边执行;如果左边为真,右边不执行。
*/
int x = 3;
int y = 4;
System.out.println((x++ > 4) & (y++ > 5)); // 两个表达式都会运算
System.out.println(x); // 4
System.out.println(y); // 5

System.out.println((x++ > 4) && (y++ > 5)); // 左边已经可以确定结果为false,右边不参与运算
System.out.println(x); // 4
System.out.println(y); // 4
符号 作用 说明
&& 短路与 作用和&相同,但是有短路效果
|| 短路或 作用和|相同,但是有短路效果

三元运算符:

/*
三元运算符语法格式:
    关系表达式 ? 表达式1 : 表达式2;
解释:问号前面的位置是判断的条件,判断结果为boolean型,为true时调用表达式1,为false时调用表达式2。其逻辑为:如果条件表达式成立或者满足则执行表达式1,否则执行第二个。
*/
int a = 10;
int b = 20;
int c = a > b ? a : b; // 判断 a>b 是否为真,如果为真取a的值,如果为假,取b的值.

/*
需求:
一座寺庙里住着三个和尚,已知他们的身高分别为150cm、210cm、165cm,请用程序实现获取这三个和尚的最高身高。
*/
public class OperatorTest02 {
    public static void main(String[] args) {
        //1:定义三个变量用于保存和尚的身高,单位为cm,这里仅仅体现数值即可。
        int height1 = 150;
        int height2 = 210;
        int height3 = 165;    
        //2:用三元运算符获取前两个和尚的较高身高值,并用临时身高变量保存起来。
        int tempHeight = height1 > height2 ? height1 : height2;        
        //3:用三元运算符获取临时身高值和第三个和尚身高较高值,并用最大身高变量保存。
        int maxHeight = tempHeight > height3 ? tempHeight : height3;    
        //4:输出结果
        System.out.println("maxHeight:" + maxHeight);
    }
}