一.JAVA介绍
1.java跨平台原理
java程序通过jvm虚拟机可以在任意操作系统上运行,但是jvm虚拟机本身不允许跨平台,允许跨平台的是java程序。
2.java程序的开发和运行的步骤
1)编写代码:在编写代码的过程中,需要用到的java存放在JRE中,已经写好的java文件
2)编译代码:.java文件属于【源文件】,无法被jvm所识别执行的,需要通java提供在jdk中的翻译工具将其翻译成jvm可以直接识别的字节码并执行。
3)运行代码:将字节码文件.class使用jdk中的运行工具运行在jvm虚拟机中。
3.java的运行
一个java程序能正常运行,需要在.JAVA文件中编写源代码,通过javac命令编译生成.class字节码文件,最后通过java命令运行java程序
4,常用的DOS命令
学习DOS命令提示符的目的是为了能够使用JDK,bin目录中的(javac.exe)编译和(java.exe)运行工具
dir———-查看当前路径下的内容
cd目录—–进入单级目录
cd..———-回退到上一级目录
cd目录1/目录2/——进入多级目录
cd/———-回退到跟目录
cls———清屏
exit——–退出命令提示符窗口
二、JAVA变量
1.java注释
1)java注释是解释说明程序的文字,是给程序员看的,不是给JVM看的
2)java中的单行注释语法格式为://注释内容
3)java中的多行注释语法格式为: /* 注释内容 */
4)Java中的文档注释是 /*注释内容/
2.java关键字
特点:
1)关键字的字母全部小写
2)常用的代码编辑器,针对关键字有特殊的颜色标记,非常直观
3)main不是关键字,main是一个主方法
3.常量
常量的分类:
1)字符串常量:被双引号所包裹的内容
2)整数常量:所有整数
3)小数常量:所有小数
4)字符常量:被单引号所包裹的内容,里面只能放单个字符
5)布尔常量:只有true和false两值
6)空常量:null(null空常量不能输出打印)
4.数据类型内存占用和取值范围
1)整数类型
byte —- 内存占用1字节—–取值范围 -128~127
short—–内存占用2字节——取值范围-32768~32767
int ——内存占用4字节——取值范围-2的31次方到2的31次方-1
long ——内存占用8字节—–取值范围 -2的63次方到2的63次方-1
2)浮点类型
float(单精度)—-内存占用4字节—–取值范围1.401298e-45到3.402823e+38
double(双精度)—内存占用8字节—-取值范围4.9000000e-324到1.797693e+308
3)字符
char—–内存占用2字节———取值范围0~65535
4)布尔
boolean—内存查勇1字节——-取值范围true、false
5.变量的注意事项
1)变量名不允许重复定义
2)一条语句可以定义多个变量,但需要使用逗号进行分割
3)变量在使用之前一定要赋值
4)定义float类型变量的时候需要在数字后面加入F的标识,不区分大小写,定义long类型变量需要在数值后面加入L标识不区分大小写。
5)变量的作用域只在它所在的大括号中有效
6.标识符
1)概念:就是给类、方法、变量等取名的符号
2)定义规则
由数字、字符、下划线和$组成
不能以数字开头
不能是关键字
区分大小写
三、类型转换
1.数据类型中的转换
在基本数据类型变量运算中,会存在数据类型转换的问题,取值范围小的可以随意转换成取值范围大的,反之,则不可以
,因此要用到强制类型转换,但是这可以会造成部分数据丢失
1)转换的规则
byte—->short—->int—–>long—–>float—–>double
char——>int
2)btye、short、char三种数据在运算的时候,不管是否有更高的数据类型,都会提升为int类型,然后再进行运算
四、运算符
1.算术运算符
1)“+”、“-”、“*”:和小学数学运算方法一样
2)“/”:整数相除只能得到整数,如果想要得到带小数的结果,必须加入小数的运算
3)%:取余数
2.字符串+操作
当+操作出现在字符串时,这个+是字符串连接符,而不是算术运算
3.自增自减运算符
1)单独使用的时候,++和–无论是放在变量的前边还是后边,结果都是一样的
2)++或–在前,先对该变量做自增或自减,然后再拿变量参与操作
3)++–在后,先将变量原本的值,取出来参与操作,随后再进行++或–
4)–和++只能在变量中运用,不能在常量中运用
public static void main(String[] args){ int a=10; int b=++a; int c=12; int d=c++; System.out.println(a); //10 System.out.println(b);//11 System.out.println(c);//13 System.out.println(d);//12
4.&和&&的区别
1)&:无论符号左边还是右边是true和false,右边都要执行
2)&&:具有短路效果,符号左边为false的时候,右边就不执行
5.三元运算符
1).格式:关系表达式 ? 表达式1 :表达式2
2。执行流程:
首先计算关系表达式的值,如果为true,取表达式1的值,为false,取表达式2的值.
五、流程控制
1)流程控制包括if..else语句、switch..case语句进行流程控制,if…else语句通过遍历条件分支直到命中条件,而switch…case只需要访问对应索引号便可以到达定位分支,
switch..case是以空间换时间,在处理case常量的情况,switch语句的效率比if..else高,但是在非常量的情况中,if..else更加灵活,而且占用空间小。
2)switch语句的case穿透现象:在switch语句中,如果case控制的语句体后面不写break,将会出现穿透现象,
当开始case穿透,后续就不会具有匹配效果,内部的语句都会执行直到看见break,或者switch语句执行完毕才会结束
3)穿透现象的应用场景:当发现switch语句中,多个case给出的语句体出现重复的,可以使用case穿透来优惠代码
六、循环语句
1、三种循环的区别:
1)for循环和while循环先判断条件是否成立,然后决定执行循环体,即先判断再执行,do…while先执行后判断
2)for循环中,条件语句控制的变量,因为归属于for循环的语法结构中,因此在循环结束之后就不会再访问到,但是while语句中的条件语句控制的变量,
不属于循环语法结构,循环结束后还可以使用
2.死循环的格式
1)for的死循环格式:for(;;){}
2)while的死循环格式while(true){}
3)do…while的死循环格式 do{}while(true);
3.跳转控制语句
1)continue用在循环中,基于条件控制,跳过某次循环体内容的执行,继续洗一次的执行
2)break用在循环中,基于条件控制,终止循环体内容的执行。
七.Java中内存分配
栈内存:方法运行时,进入的内存,局部变量都存放放在这一块内存中
堆内存:new出来的内容都会进入堆内存,并且会存在地址值
方法区:字节码文件.class文件加载时进入的内存
八、数组
1.动态初始化数组和静态初始化数组的区别:
1)动态初始化:手动指定数组长度,由系统默认初始化值
2)静态初始化:手动指定数组元素,系统会根据元素个数,计算出数组的长度
2.使用场景
1)动态初始化:只明确元素个数,不明确具体数值,推荐使用动态初始化
2)需求中已经明确了要操作的具体数据
九、方法
1.概念:方法就是一段具有独立功能的代码块,不调用就不执行,可以提高代码的复用性
2.复用过程
1)方法没有被调用的时候,都在方法区中的字节码文件中存储
2)方法被调用的时候,需要进入到栈内存中运行,先调用的方法后运行,因为栈是先进后出的
3.形参和实参
1)形参:指的是方法定义中的参数
2)实参:方法调用中的参数
4.为什么要有带返回值的方法
1)我们经常会根据一个方法产出的结果,来去组织另外一段代码逻辑,为了拿到这个方法产生的结果,就需要定义带有返回值的方法
注意:方法定义时return后面的返回值与方法定义上的数据类型要匹配,否则会报错。
2)方法的返回值通常会使用变量接收,否则该返回值将无意义
3)方法不能嵌套定义
4)方法的返回值类型为void,表示该方法没有返回值,没有返回值的方法可以省略return,如果要写return(代表结束的标志),那就不能跟具体的数据
5)return语句下面,不能编写代码,因为永远执行不到
5.方法参数传递基本数据类型
/*
方法参数传递为基本数据类型
传入方法中,是具体的数值
*/
public static void main(String[] args) {
int number=100;
System.out.println("调用change方法前"+number);//100
change(number);
System.out.println("调用change方法后"+number);//100
}
public static void change(int number){
number=200;
}
最后输出结果为100 100,原因是第一个100是因为main方法先执行,第二个100是因为 change方法在栈中执行完毕之后就弹栈了,所以再次输出时依旧为100
6.方法参数传递引用类型
package com.study.method1;
public class YingyongDemo1 {
/**
* 方法参数传递引用数据类型
* 传入方法的是内存地址
* @param args
*/
public static void main(String[] args) {
int[] arr={10,20,30};
System.out.println("调用change方法前"+arr[1]);//20
change(arr);
System.out.println("调用change方法后"+arr[1]);//200
}
public static void change(int[] arr){
arr[1]=200;
}
}
最后打印输出为 20 200,原因是第一个20是因为main方法先执行,第二个200,是因为,在堆内存中会存放数组,然后栈内存的变量所要调用堆内存的数据,就如同一人牵着一条狗,
现在是两个人牵着同一条狗,所以调用方法change()后栈内存会将change的数值存放到堆内存中,然后change()执行完毕弹栈,但是数值依旧不会改变,所以就变成200
十、进制
1.
1)在java中,数值默认都是十进制,不需要添加任何标识
2)二进制,数值前面以0b开头b大小写都可以 0b10
3)八进制,数值前面以0开头
4)十六进制,数值前已0x开头
2.进制转换
十进制转换成其他进制就用除法,其他进制转换成十进制就用系数*基数的权次幂相加
3.位运算
&—-遇0为0,全1为1—-true
|—–遇1为1,全0为0—-true
^—–相同为false,不同为true
~—–取反,包括符号位
<<—-向左移,相当于*2 右边补0
>>—-向右移,相当于/2左边补0
十一、二维数组
1.二维数组动态初始化格式:
格式:
数据类型[][] 变量名=new 数据格式[m][n]
m 表示这个二维数组,可以存放多少个一维数组
n 表示每一个一维数组可以存放多少个元素
2问题:二维数组中存储的是一维数组,那能不能存入【提前创建好的一维数组】呢?
package com.study.Test;
public class DemoArray2 {
/**
* 问题:二维数组中存储的是一维数组,那能不能存入【提前创建好的一维数组】呢?
* @param args
*/
public static void main(String[] args) {
int[] arr1={11,22,33};
int[] arr2={44,55,66};
int[] arr3={77,88,99,23};
int[][] arr=new int[3][3];//动态初始化二维数组 3个一维数组3个元素
arr[2][3]=23;//不能存入
arr[0]=arr1;
arr[1]=arr2;
arr[2]=arr3;
System.out.println(arr[1][2]);//66
System.out.println(arr[2][3]);//23
}
}
arr[2] [3】=23;//不能存入:因为动态初始化数组已经限定了【3】【3】,所以从堆中的【2】去找数组中的【3】找不到,索引只有0.1.2,造成数组索引异常。
System.out.println(arr[2】[3]);//23 可以存入:因为数组是引用类型,传递的只是数据的地址,当arr[2]=arr3;时,就已经改变了动态初始化数组的限制,
就是相当于另外开辟一个数组空间,所以调用arr【2】就是调用arr3【】的全部空间,然后在arr3中添加“23”也就是arr3自己添加的空间地址,可以直接调用
十二、本周学习总结
经过本周的学习,java基础语法部分已经学完了,通过这一周的学习,提升了自己的代码编写能力,也提高自己的逻辑思维能力,对需求问题的思考的方向和做法都有所改变,
在这周的学习中,也学到了许多以前没有学到的东西如位运算、switch穿透现象等,虽然知识点不难,但是还是需要花费时间去消化。上面编写的是我在这周学习中遇到的一些问题,还有
一些没有很牢固的知识点,并不是很全面,因为有一些自己已经完成掌握了就没有记录下来,记录下来的需要花时间进行消化。总而言之,通过这周学习的摸索,在学习课程时,遇到问题要先记录下来,
然后通过查找解决问题的方法或者询问老师,将问题解决,然后学完一章马上做这一章的测试题,理清代码的思路,然后第二天在学习新课程时,先把昨天学到的知识点巩固一遍,然后在学习新的知识,
如此循环,定能学有所成,加油!
原创文章,作者:dweifng,如若转载,请注明出处:https://blog.ytso.com/273515.html