Java基础语法补充v2
一、介绍JAVA
编译型语言:C、C++、Java
解释型语言:JavaScript
java的编码、编译、执行过程:
1.java的三个版本 se ee me
2.java开发工具包 JDK(java开发工具包,JDK包含JRE,编译工具,文档工具等):
环境变量:path可执行文件的目录 classpath:lib目录所在的路径
%JAVA_HOME%\bin 设置jdk环境变量
!!!这里要注意!!!:
Easy.java 源(代码)文件 javac后生成的java.class为字节码文件。
cd L(...) 按tab补全提示
**java程序运行过程**
(1、编码过程
(2、javac 编译 将java文件编译成字节码文件.class
javac编译后.class文件
运行程序 java XXX(class文件的文件名)
运行程序时和编码的平台没有关系
一次编译(.class)到处运行 归功于下面:
java语言的跨平台性:编译后的字节码文件并没有直接在系统上运行,而是交由JVM解析成系统指令,我们在不同系统上安装指定版本的JVM就可以运行java程序。
所以java程序才有跨平台性。
(3、执行过程 java 类名
3、JRE:java程序的运行环境
4、JVM:java虚拟机(将字节码内容转换成系统指令)
如图:
二、语法及变量
2.1 注释
package com.easy;
/*类的全名 包名+类名
* com.easy.EasyA
* */public class EasyA {/*注释*///注释的内容 单行注释/* 注释内容* 多行注释* *//*** 文档注释 对方法对类 对属性做说明,养成良好的编码习惯!* @param key 标识* @return 用户名*/public String getName(String key){return "EasyA";}public static void main(String[] args) {new EasyA().getName("key");}}
2.2 关键字
关键字 java程序中赋予特殊的作用或含义的单词 public static new class void package 所有关键字的字母都是小写,main是方法不是关键字
2.3 变量(统称:标识符)
package com.easy; public class EasyB {public static void main(String[] args) {int a = 8;int b = 12;System.out.println(a+b);System.out.println(a-b);/*在程序运行过程中,定义一些名称来记录一些数据,在之后的代码中方便使用*//*这些名字:变量名 他们有一个统称 标识符* 类名 包名 变量名 常量名 参数名......(名字)** 命名规则:* 1、只能使用英文字母,数字,下划线和$,不能使用特殊字符(使用中文不会出现错误提示,但是强烈不建议)* 2、首字母不能使用数字* 3、标识符不能使用关键字* 行业内规范:* 1、类名:首字母大写,驼峰命名法 UserName(类名) userName(变量名)* 2、包名:全小写,多个单词使用.连接, com.easy.user.name* 3、常量名:全大写,多个单词使用下划线连接 USER_NAME* */int $a = 12;int _12 = 12;int intA = 12;/*java中的类型* 两种类型 基本数据类型和引用数据类型* 基本数据类型:八种数据类型* 整数类型:byte short int long* 浮点型:float double* 字符型:char* 布尔型:boolean* *//*整数类型:byte 1个字节 8个二进制位 -2^7~2^7-1 128~127short 2个字节 16个二进制位 -2^15-2^15-1int 4个字节 32个二进制位 -2^31-2^31-1 21亿左右 (整数类型的默认类型)long 8个字节 64个二进制位 -2^63-2^63-1所有整数的默认值是0**//** 浮点型:底数位 指数位 算出来的 不能十分精确保存数据的* float 4个字节 32个二进制位 6-7位小数 单精度* double 8个字节 64个二进制位 15-16位小数 双精度 (浮点型的默认类型)* 所有浮点数的默认值为0.0* *//** 字符型:* char 2个字节 16个二进制位 0~65535 0000-FFFF 默认值0* *//** 布尔型:* 1个字节/4个字节(数组中用int储存) 8个二进制位 true false*/System.out.println(12);System.out.println(12.0);double dd = 12.33;float ff = 0.0F;char cc = '你';boolean bb = true;} }
2.3.1** 基本数据类型
数值范围详情见源码:
byte: 1个字节,不考虑负数能表示范围是:0~255,考虑正负表示范围:-128~127
short:2个字节,16位 65536 0~65535
int: 4个字节,考虑正负:-21亿~+21亿
long:8个字节
float: 4个字节
double:8个字节
char字符型:2个字节,采用的是Unicode编码,可以存储汉字
每个字符在编码表里面都对应一个int整数
boolean: 只有true和false两种情况
2.3.2** 引用数据类型
在 Java 中,数据类型分为 基本数据类型(Primitive Types) 和 引用数据类型(Reference Types)。
引用数据类型 存储的是对象的 内存地址(引用),而不是实际的数据值
1. 引用数据类型分类
类型 | 说明 | 示例 |
---|---|---|
类(Class) | 用户自定义或 Java 内置的类(如 String , ArrayList ) | String str = "Hello"; |
接口(Interface) | 定义行为规范,由类实现 | List<Integer> list = new ArrayList<>(); |
数组(Array) | 固定大小的同类型数据集合 | int[] arr = new int[5]; |
枚举(Enum) | 固定的一组常量 | enum Color { RED, GREEN } |
2. 引用数据类型的特点
(1)存储的是对象的引用(内存地址)
String s1 = "Java"; // s1 存储的是字符串 "Java" 的内存地址 int[] arr = {1, 2}; // arr 存储的是数组对象的内存地址
基本数据类型(如
int
,char
)直接存储值。引用数据类型 存储的是 堆内存(Heap) 中对象的地址。
(2)默认值为 null
如果引用变量未初始化,其默认值是 null
(表示不指向任何对象):
大多数引用类型需要通过 new
分配内存:
String str = new String("Hello"); // 显式创建 String 对象 List<Integer> list = new ArrayList<>(); // 创建 ArrayList 对象
(3)使用 new
关键字创建对象
大多数引用类型需要通过 new
分配内存:
String str = new String("Hello"); // 显式创建 String 对象 List<Integer> list = new ArrayList<>(); // 创建 ArrayList 对象
(4)可以调用方法
引用类型可以调用类或接口定义的方法:
String s = "Java"; System.out.println(s.length()); // 调用 String 的 length() 方法
2.4、数据类型转换
/*基本数据类型的数据转换 * */ System.out.println(12); double ddd = 12; /*将整数类型转换成double类型*/ System.out.println(ddd); /*基本数据类型的类型转换 * 整数类型:在可赋值范围内,可任意转换 * 隐式转换:系统默许的,不需要代码强制声明的转换过程 * 取值范围小的向取值范围大的类型转换 double d = 12; * 强制数据类型转换:需要代码强制声明的转换过程,如果数据溢出,就是一刀切 * 取值范围大的类型向取值范围小的类型转换 int i = (int)12.0*/ byte bbb = 12; short sss = 12; sss = bbb; //bbb = sss 报错 bbb表示范围小 数据溢出 bbb = (byte) sss; sss = 128; bbb = (byte) sss; System.out.println(bbb);float fff = 12.0F; fff = (float)12.0; /*char和整数类型可以转换 仅限0~65535 char不分正负 * 默认值是0*/ char ccc = 'a'; int iii = '倪'; ccc = 0;/*boolean不能和其他类型发生转换*/ boolean bbbb = false;//false 0 true 1
2.5 进制转换
/*进制表示方式 */
int aaa=0b111;//二进制 0b 7
aaa=011;//八进制 0 9
aaa=0xFF;//十六进制 0x 17
//345 5*10^0 + 4*10^1 + 3*10^2
//FF 15*16^0+ 15*16^1
2.6 变量声明与初始化
//变量声明 int a; //赋值 a = 12; //声明变量并赋值 int b = 12; //初始化 第一给变量赋值 int c; c = 12; //使用变量之前一定要初始化,下面的条件判断全是变量,编译阶段可能会变化 /*if(a == b){c = 12; }*/System.out.println(c);//作用域{} //在同一个{}中变量不能重复声明 //java语言大小写敏感 int A; //声明八种基本数据类型的变量并赋值 int d = 0; byte e = 0; short f = 1; long g = 10000000000L; float h = 6.1f; double i = 2.0; char j = 'a'; boolean k = true; // !!! 标识符标准 见名知意 !!!char ch = '\uFFFF'; ch = '\''; ch = '\\'; ch = '\n';//换行符 ch = '\t';//缩进符 制表符 ch = '\r';//回车符 //引用类 默认值都是null
2.7、运算符
这里,首先我们应区分好运算符的优先级,如下图:
详细如源码所示:
public class EasyD {public static void main(String[] args) {//运算符//+- * / %int a = 12;int b = 5;//将a+b这个表达式的结果赋值给resultint result = a + b;result = a - b;result = a * b;result = a / b;result = a % b;//%正负值取决于a(被除数)System.out.println(result);//+ 1、数值运算 2、拼接字符串String name = "我喜欢" + "java";//java中字符串+任意类型的结果都是字符串//+优先级是相同的System.out.println(12+23+"你好");//35你好System.out.println("你好"+12+23);//你好1223//3、 一元运算 ++ --//作用 a++ 对a+1//a-- 对a-1a=12;a++;++a;System.out.println(a);a--;--a;System.out.println(a);//把前面的a看成result,是表达式的值a = a++; //a++ 12 a=13 a=a++;a = ++a; //a=13 ++a 13 a=++a;//a++表达式的取值//a++ 后加加 现将a的值付给a++表达式,然后a加1//++a 先加加 先将a的值+1,再将a的值赋给++a表达式//4、 赋值运算符// = += -= *= /= %=int aa = 12,bb = 23;int aaa,bbb = 12;aa += 12;//在aa变量基础上+12aa = aa + 12;byte ab = 12;/* ab += 12;ab = (byte)(ab+12);ab = ab+ab;*///***所有整数的运算结果都是int类型,有long参与结果就是long类型***//ab = ab + 1L;ab-=12;ab*=12;ab/=12;ab=5;ab%=12;System.out.println(ab);//5//5、关系型运算符//相等 == 不等于!=//大于 > 小于 <//大于等于 >= 小于等于 <=boolean result1 = a==b;//==在基本数据类型中 比较的是值是否相等 和类型无关System.out.println(12==12.0);System.out.println(12=='\u000C');System.out.println(12!=12);//6、逻辑运算符//&&与 ||或 !非a=12;b=23;boolean result2=a>b&&b>0; //A&&B 当A和B都为true,表达式的结果才是trueresult2=a>b||b>0; //A||B 当A或者B有一个true,表达式的结果才是trueresult2=!(a<b); //反转结果,有时是必要的result2=a>b;/*String str="";if(!str.isEmpty()){}*///7、短路现象(逻辑运算表达式)//A&&B 当A为false,整个表达式的结果就可以确定为false,B不再计算,B表达式就被短路了//A||B 当A为true,整个表达式的结果就可以确定为true,B不再计算,B表达式就被短路了a=12;b=23;result2=a++<0||b++>0;System.out.println(a);System.out.println(b);//13 24a=12;b=23;result2=a++>0||b++<0;System.out.println(a);System.out.println(b);//13 23a=12;b=23;result2=a++<0&&b++>0;System.out.println(a);System.out.println(b);//13 23a=12;b=23;result2=a++>0&&b++>0;System.out.println(a);System.out.println(b);//13 24//8、 位运算符(二进制)a=7;b=8;//& | ^ ~ << >> >>>//& 按位与运算 A&B 将A和B转成二进制,右侧对齐,上下比较,两个都为1,结果为1,否则为0result=a&b;System.out.println(result);//| 按位或运算 A|B 将A和B转成二进制,右侧对齐,上下比较,两个都为0结果为0,否则为1result=a|b;System.out.println(result);//^ 按位异或运算 A^B 将A和B转成二进制,右侧对齐,上下比较,两个不同则为1,否则为0result=a^b;System.out.println(result);//~ 按位取反运算 ~A 将A转成二进制,每个1变成0,每个0变成1result=~a;System.out.println(result);//负数取到正常值要用补码,按位取反加一//<< 位左移运算 A<<B A左移B位,空位补0,相当于A乘以2的B次方result=a<<2;System.out.println(result);//111变成11100//>> 位右移运算 A>>B A右移B位,相当于A除以2的B次方result=a>>1;System.out.println(result);//>> 带符号右移运算 A>>B A无符号右移B位,左侧空位补符号位result=-8>>2;System.out.println( result);//>>> 无符号右移运算 A>>>B A无符号右移B位,左侧空位补0result=-8>>>2;System.out.println( result);//9、 三元运算符 取值 A?B:C 问A(表达式)的结果 A为true时取B,否则取Ca=12;b=23;result=a>b?a:b;System.out.println(result);System.out.println(a<b?12:12.8); //12.0,取double 较大的取值范围} }
三、一些相关题目练习:
package com.easy1; import java.util.Scanner; public class exercise {public static void main(String[] args) {Scanner sc = new Scanner(System.in);//1、定义三个整数变量,使用三元运算符,求三个变量中最大的数int i=5;int j=6;int k=7;System.out.println(((i<j?j:i)<k)?k:(i<j?j:i));//2、定义基本数据类型的变量,分别转换成其他基本数据类型,如果转换不了就注释掉,说明原因int a = 0;byte b = 0;short c = 1;long d = 10L;float e = 6.1f;double f = 2.0;char g = 'a';boolean h = true;a=b;a=c;//a=d; 不行,long的数值范围比int大 容易数值溢出 要用强制类型转换a=(int)d;a=(int)e;//浮点数并不是整数,要用强制类型转换a=(int)f;//浮点数并不是整数,要用强制类型转换a=g;//a=h;//a=(int)h; 都不行,boolean不能数值转换//3、定义一个三位整数,编写程序获取该整数的个位,十位,百位,并打印出来int aa=0;//输入一个三位整数aa=sc.nextInt();int bb=aa%10;int cc=aa/10%10;int dd=aa/10/10;//下面三行代码分别打印个位,十位,百位System.out.println(bb);System.out.println(cc);System.out.println(dd);//4、将0XABC验算成八进制int hexNum = 0xABC; // 十六进制 0xABCString octalStr = Integer.toOctalString(hexNum); //使用java官方API换算成八进制System.out.println("0xABC 的八进制值: " + octalStr);//输出验算完成后的结果//5、写一下java的跨平台性/** 首先Java语言执行时是分三个过程,分别是编码、编译和执行过程。* 编码即源代码,是我们写代码时编译的.java文件* 到编译时javac生成.class的字节码文件,为什么此字节码文件能够跨平台运行呢?* 是因为编译后的字节码文件并没有直接在系统上运行,而是交由JVM(Java虚拟机)解析成系统指令* 我们在不同系统上安装指定版本的JVM就可以运行java程序。* 所以java程序才有跨平台性。,*///6、什么是短路现象?/** 短路现象由逻辑运算表达式来实现,分为短路与和短路或两种方式* 比如:* 在逻辑与运算中,A&&B 当A为false,整个表达式的结果就可以确定为false,B不再计算,B表达式就被短路了* 这种现象也被称为短路与* 在逻辑或运算中,A||B 当A为true,整个表达式的结果就可以确定为true,B不再计算,B表达式就被短路了* 这种现象也被称为短路或* 好处是:利用这种现象的机制可以提高效率,避免不必要的计算。* *///7.声明两个整数类型的变量,编写程序交换两个变量的值int m=10;int n=20;int temp=0;if (m!=n){temp=m;m=n;n=temp;}System.out.println(m);System.out.println(n);//输出结果可得,m为20n为10,成功交换了变量值} }