Java 基础知识大全(一)
以下是(博主)基础时 做的一些总结,希望能够对各位看官提供帮助,如有哪里整理思路不够明确又或者有错误,烦请指出,(博主)定当及时改正。谢谢大家
Java学习方法
- 先理解
- 记忆是重点
1、抄笔记 2、多看书
- 学习英语单词
计算机组成
硬件
Cpu 、硬盘、内存、显卡、网卡、主板、电源
存取速度:
寄存器>高速缓存>内存>硬盘
只有硬盘可以永久存放数据,前三个断电后数据消失
Cpu 运算包括算术运算和逻辑运算
Cpu的工作就是 取数,计算,存数
Cpu做什么操作是由指令来指示的
而且cpu只能理解有限的一些指令,这些指令的集合叫做机器语言
1+1用机器语言如下:1001000 1101110
汇编语言,是在机器语言基础上发展而来的
1+1用汇编语言如下:mov H10, H101 mov H11, H111 mov H01, H011
高级语言(js,java,c++)
1+1
编译原理
把高级语言翻译成机器语言的过程,叫做编译
编译
高级语言分为两类:
解释型语言:不需要手动编译,直接运行,js是解释型语言
编译型语言:需要手动编译,再运行,java,c++是编译型语言
解释型的语言也需要编译,但是是由执行程序自动编译的。
每次执行都会编译一遍
编译型语言,只需要编译一次就行了
Java概念
Javase java standard(标准) edition(版本) 是java基础
javaee java enterprise(企业) edition(版本) 做网站系统开发
Javame java mobile(移动) edition 做移动开发
现在的移动软件是 Android(java语言开发)(Android操作系统) 和ios(object-c语言开发)(苹果操作系统)
Jdk java development(开发) kit(工具包) 使用这个写java代码和编译java代码
Jre java runtime(运行) environment(环境) 使用这个运行java字节码
Jvm java virtual(虚拟的) machine(机器)Java虚拟机,在这个软件上运行java字节码
源代码,就是程序猿写的代码,程序猿能看懂
字节码,是由java编译器编译后的代码,是java虚拟机能看懂
Jdk中包含了java编译器
Jvm中包含了jre
java运行机制1
Jdk下载
Java现在是由oracle公司来管理的。Oracle公司(甲骨文)最出名的产品是oracle数据库。
Java最初是由sun公司开发的。
Java是开源的,免费的,跨平台的。
下载以后文件为:jdk-7u45-windows-i586.exe
7u代表jdk1.7,windows是windows版本,86代表32位操作系统
现在主流的三种操作系统:windows linux 苹果系统
Jdk安装
打开安装包,使用默认配置,直接下一步到底。
下面是jdk安装后的目录:
环境变量
如果要运行一个可执行文件,就必须要知道它的具体位置
Cmd搜索文件机制
在cmd中,执行一个可执行文件,它会在当前目录搜索这个文件,如果找不见就去path中搜索这个文件,如果再找不到就报错。
Cmd中,cd 命令是打开一个文件夹
Cd .. 是打开上一级的文件夹
使用tab键可以让系统提示
Path和classpath
因为每次都要进入可执行程序所在的目录比较麻烦,所以可以将可执行程序所在的目录加入到path中。
Java配置环境变量:
第一种方式:打开环境变量,找到path,在path的末尾加上分号,然后加上C:\Program Files (x86)\Java\jdk1.7.0_45\bin
第二种方式:打开环境变量,先新建一个变量JAVA_HOME值是C:\Program Files (x86)\Java\jdk1.7.0_45。然后,找到path,在path的末尾加上分号,然后再加上%JAVA_HOME%\bin。
配置完成后,打开cmd,输入java -version,如果显示正常,说明配置成功。
Java -version是显示java的版本,version是版本
第一个java程序
- 新建一个文本文件Hello,后缀名改为java
- 在文件中写上以下内容
3、修改文件编码为ANSI(就是GBK编码)
编译
使用javac来编译java源文件,编译成功后,产生一个.class文件,这个.class文件,叫做字节码文件
编译命令:javac Hello.java
运行命令:java Hello
Java程序解读
Java程序执行原理
Java程序结构
Source 资源 file 文件 method 方法 statement 语句
一个源文件中可以有多个类。
一个类中可以有多个方法。
一个方法中可以有多条语句。
剖析类
System.out.print("你好");输出字符串
System.out.println("你好");//输出字符串,然后换行
System.out.print("你好\n");输出字符串,然后换行
System 系统 out 输出 print 打印 line 行
变量
int x = 5;声明一个整型变量x,赋值为5
整数-1,1,2,23
整型变量是保存整数的变量,并且只能保存整数。
//js是弱类型的语言
//js中变量声明后,其类型可以再改变
//js的变量声明后,可以保持任何类型的值
Java是强类型的语言,java中的变量声明后,其类型不能再改变
Java的变量声明时就必须指定它的类型
变量声明
int x;声明一个整型变量x。
Java中,变量必须先声明再使用,声明时必须要指定其类型。
声明变量时,系统会分出一块存储空间。
赋值
x = 5;将整数5赋值给x,也就是将5保存在变量x中。
赋值时,系统会将数值存放到相应的存储空间中。
变量初始化
声明变量时立即赋值,叫做初始化
声明变量,只有一次,初始化也只有一次,赋值可以有多次。
进制
十进制
逢十进一 0123456789
二进制
逢二进一 01
二进制转十进制
01=1; 10=2; 11=3; 100=4; 101=5; 110=6; 111=7
1101= 1 + 0*2 + 1*4 + 1*8
=1*20 + 0*21 + 1 * 22 + 1*23 (从后往前算)
1101= 1 + 0*10 + 1*100 + 1*1000
=1*100 + 0*101 + 1 * 102 + 1 *103 (从后往前算)
101010 =2+8+32
16进制
逢16进一 0123456789ABCDEF
01=1;02=2;03=3;04=4;.....09=9;0A=10;0B=11;0C=12;0D=13;0E=14;0F=15
10=16;11=17......19=25;1A=26
0D5E9F=15*160 + 9*161 + 14*162 + 5*163 + 13*164
比特 bit
字节
1byte = 8bit 也就是说1个字节是8位 10010010
KB
1kb = 1024byte 1kb是1024个字节
MB
1mb=1024kb
GB
1gb=1024mb=1024*1024kb=1024*1024*1024byte=1024*1024*1024*8bit
基本数据类型
byte(-128---127)
整型的,一般不用来表示整数,而是用来表示数据
char
字符,2个字节,它可以表示一个英文字母,或者汉字
char c = ‘a’; char b = ‘中’;
short
短整型 2个字节
int
整型是4个字节是32位
long
长整型是8个字节是64位
float
单精度浮点数(小数),4个字节
double
双精度浮点数 8个字节
boolean
4个整数,两个小数,一个字符、一个布尔
八种基本数据类型都是哪八种?
类型转换
把范围小的数字赋值给范围大的变量是可以的。
把范围小的数字赋值给范围大的变量会自动进行类型转换。
将范围大的数字赋值给范围小的变量,可能会损失精度。
如果我们分析后认为数据不会丢失,那么可以进行强制类型转换。
int i = (int)100L;
类型转换,转换的是数据的类型,而不是变量的类型。
整数的默认类型是int,小数的默认类型是double.
给一个变量赋值,那么这个数据的类型必须和变量的类型一样
命名规范
类名首字母大写,使用驼峰命名法。
可以使用_ 、$、字母开头,但是不能用数字开头
变量名和方法名是首字母小写,使用驼峰命名法。
运算符
算术运算符
+ - * / %
int类型的数字,+ - * / %的结果都是int
4/5结果是0 5/4结果是1
同种类型的数字进行算术运算,结果仍是同一种类型
不同类型的数字进行算术运算,结果是范围更大的那种类型
逻辑运算符
逻辑运算符两边是比较运算符的结果.
与&& 两边同时为真结果才是真,只要有一边为假,结果就是假
或|| 两边同时为假结果才是假,只要有一边为真,结果就是真
非!
短路 如果逻辑与左边为假,右边的逻辑就不会运行
如果逻辑或左边为真,右边的逻辑就不会运行
比较运算符
> < == >= <= !=
比较运算符的结果是true或者false
位与 &
位或 |
递增和递减
int j = i++;//是先赋值再自增
j = ++i;//是先自增再赋值
看++在前面还是在后面,在后面就是后自增,在前面是先自增
条件运算符(三目运算符)
int i = 1<2? 3:4; //3
int j = 1<2? (2>3? 4:5) : (4>5? 7: 8);//5
Classpath
条件语句
If语句
if(条件表达式){
//如果条件表达式为真,就执行这块的代码
}else{
//如果条件表达式为假,就执行这块的代码
}
Switch语句
循环
while循环
do while
for循环
函数
一个函数是一系列语句的集合,它是可重用的。通常情况下,你的程序会停下正在做的事情,转而去做其他事情。比如,你正在读一本书,突然想起来需要打一个电话,然后就放一个书签,记录当前读到哪个位置了,接着去打电话。打完电话回来,继续从书签位置开始读书。
在程序中,执行的顺序是从上往下,直到遇到一个函数调用。一个函数调用是一个表达式,这个表达式告诉cpu打断当前函数(函数1),去执行其他函数(函数2)。Cpu在当前的执行点(在函数1中)上放置一个书签,然后调用另外一个函数(函数2),当这个函数(函数2)执行完毕,cpu回到之前函数(函数1)的执行点上,继续向下执行。
函数1叫做调用者,函数2叫做被调用者。
返回值
在被调用者中,我们可以使用一条返回语句,指定一个返回值给调用者。当被调用者执行完毕后,返回值会给调用者。准确来讲,返回值会替代函数调用。
Js的函数声明中,不需要声明返回值的类型。
本地变量,作用域,生命周期
当我们讨论变量时,经常涉及到两个概念:作用域和生命周期。
变量的作用域决定了变量可以被访问的范围。变量的生命周期决定了变量什么时候创建,什么时候销毁。
被定义在块内的变量,称为本地变量。本地变量的作用域是块级的。就是说出了块的右括号就不起作用了。
作用域指的是范围,从哪开始可以用,到哪以后不能用。
生命周期指的是时间,什么时候开始可以用,什么时候以后不能用。
在一个作用域中不能有同名的变量。
本地变量的作用域是从声明时开始,到块(声明时所在的块)的右括号结束。
内嵌的块被认为是外部块的一部分,在外部块定义的变量,可以在内嵌的块中被访问。
在一个块中定义的变量,只能在这个块中被访问,因为每个函数都有自己的块,所以在一个函数中定义的变量不能被另一个函数看见。
这就意味着不用担心两个函数之间有命名冲突。
本地变量的生命周期:本地变量在变量声明时创建,出了块(声明时所在的块)右括号后销毁。
函数调用和变量创建
函数参数
函数的返回值是由被调用者返回给调用者。
函数的参数是由调用者传递给被调用者。
在许多情况下,将信息传递给被调用的函数是非常有用的。比如说:当我们想写个函数去将两个数相加,当我们调用这个函数时,需要告诉他,这个两个数都是什么。这是通过函数参数来实现的。
参数分为实际参数和形式参数。
形式参数是在被调用者中声明的参数。
实际参数是调用者传递给被调用者的数据。
printValue(6); // 6 是实际参数
public static void printValue(int a){//a是形式参数
}
实际参数的数量和类型必须和形式参数匹配。
当函数被调用时,所有的形式参数被创建为变量。实际参数的值被拷贝到相对应的形式参数中。这个过程叫做传值。
当同时使用参数和返回值时,我们创建函数,它接受数据输入,然后进行一些计算,然后将结果返回给调用者。
函数的主要作用:接受输入,进行计算,返回结果。
函数能够被重用的关键在于形式参数。因为形式参数允许函数在不必事先知道具体数据的情况下进行处理。
数组
数组是一种数据类型,它能让我们使用同一个标识符去访问同种类型的许多变量。
int[] a = new int[10];
a是整型数组,这个整型数组中有十个元素,每一个元素都是int类型的变量。
a是变量,a是整型数组类型的变量。
数组的下标从0开始。
int b = a[2];//将数组的第三个元素赋值给b
fun1(a[3] +3);//将数组的第四个元素的值+3传递给fun1
a.length//数组的长度,是数组可以放几个元素
数组的下标范围 0 - (length-1)
超出数组下标范围会出现数组下标越界异常ArrayIndexOutOfBoundsException
数组初始化
//数组初始化方式1
int[] a = new int[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
//数组初始化方式2
int[] b = new int[]{1,2,3};
遍历数组
for循环 foreach循环
//foreach,增强的for循环
for(char cc : c){
System.out.println(cc);
}
//c是要遍历的数组,char是元素的类型
//cc是代表当前元素
//遍历的过程:先声明一个char类型变量cc
//第一次循环取c中的第一个元素,赋值给cc
//第二次循环取c中的第二个元素,赋值给cc
//....
//直到将c的所有元素遍历完毕
数组作为参数
public static void fun1(int[] a){
}
int[] arr = new int[]{1,3,5};
fun1(arr);//将数组arr作为参数传递给fun1
基本类型数据传参
int b = 2;
int c = b;
c = 3;
System.out.println(b);//b = 2,变量的值不会变化
public static void fun1(int a){
a = 3;
}
int a = 1;
fun1(a);
System.out.println(a);//a的值不会变化
基本类型的变量作为参数传递给一个函数,它的值永远不会发生变化。
数组类型传参
public static void main(String[] args){
int[] arr1 = new int[]{1,2,3};
fun1(arr1);
System.out.println(arr1[0]);
fun2(arr1);
System.out.println(arr1[0]);
}
public static void fun1(int[] a){
a[0] = 10;
}
public static void fun2(int[] a){
a = new int[]{4,5,6};
}
数组类型变量传参
Java的类型有两种:基本类型,引用类型。
数组是属于引用类型。
命令行参数
public static void main(String[] a){}//a是命令行参数
在命令行中使用 java 类名 参数1 参数2 ....可以向main方法传递参数。
数组相关算法
最大值
最小值
求和
求平均值
反转数组
多维数组