java基础
- 1、 标识符
- 2、关键字
- 3、字面值
- 4、变量
- 5、 数据类型:
- 6、 字符编码
- 7、 数据类型
- 8、运算符
- 9、控制语句
- 10、递归
- 11、面向过程和面向对象的区别
- 12、面向对象的软件的生命周期【整个生命周期中贯穿采用oo面向对象方式】
- 13、面向对象与内存
- 14、关于java类中的构造方法
1、 标识符
1.1、什么是标识符
在java源程序当中凡是程序员有权利自己命名的单词都是标识符
标识符可以标识什么元素?
*类名
*方法名
*变量名
*接口名
*常量名
…
1.2、标识符的命名规则【不按照这个规则来,编译器会报错,这是语法】
*一个合法的标识符,只能由 数字,字母,下划线_,美元符号$组成
*不能以数字开头
*严格区分大小写
*关键字不能做标识符
*理论上无长度限制,最好不要太长
1.3、标识符的命名规范【只是一种规范,不属于语法,不遵守规范编译器不会报错】
*最好见名知意,就是要有意义
*遵守驼峰命名方式
SystemService
UserService
CustomerService
*类名、接口名:首字母大写,后面每个单词首字母大写
*变量名、方法名:首字母小写,后面每个单词首字母大写
*常量名:全部大写
2、关键字
3、字面值
*字面值:
-10
-100
-“abc”
-'a'
-true、false
*字面值就是数据。
*字面值是java源程序的组成部分之一,包括标识符和关键字他们都是java源程序的组成部分
*数据在现实世界中是分门别类的,所以数据在计算机编程语言中页是有类型的:
【数据类型】
-10、100 属于整数型字面值
-3.14 属于浮点型字面值
-true、false 属于布尔型字面值
-“abc”、“中国人” 属于字符串型字面值
-'A'、'人' 属于字符型字面值
*注意:
java语言当中所有的字符串型字面值必须使用双引号括起来,双引号是半角
java语言当中所有的字符型字面值必须使用单引号括起来,单引号是半角,比如 'a','A'
4、变量
1.1、什么是变量?
*变量本质上来说是内存中的一块空间,这块空间"有数据类型"、"有名字"、"有字面值"。
*变量包含三部分:数据类型,名称,字面值【数据】
*变量是内存中存储数据的最基本的单元。
1.2、数据类型的作用?
*不同的数据有不同的类型,不同的数据类型底层会分配不同大小的空间
*数据类型是指导程序在运行阶段应该分配多大的内存空间
1.3、变量要求:
变量中存储的具体的"数据"必须和变量的"数据类型"一致,当不一致的时候编译报错
1.4、声明/定义变量的语法格式:
数据类型 变量名;
*数据类型:如int
*变量名:只要是合法的标识符就行。规范中要求:首字母小写,后面每个单词首字母大写
例如:int i;
int age;
等等
1.5、变量声明之后怎么赋值?
语法格式:
变量名=字面值;
要求:字面值的数据类型必须和变量的数据类型一致
=是一个运算符,叫做赋值运算符,赋值运算符先运算等号右边的表达式,表达式执行结束后的
结果赋值给左边的变量。
1.6、声明和赋值可以一起进行
1.7、变量父子之后可以重新赋值,变量的值可以变化;
1.8、有了变量以后,内存空间可以得到重复的使用
1.9、通常访问一个变量包括两种访问方式:
*第一种:读取变量中保存的具体数据 get/获取
*第二种:修改变量中保存的具体数据 set/设置
1.10、
变量在一行可以声明多个
给变量声明再赋值以后才能访问
int i;
System.out.println(i);
这样的话并没有真正开辟出内存空间,必须初始化。
*例如:
int a,b,c=100;
这样的操作以后a和b并没有初始化,只有c完成了初始化。会编译错误
*在方法体中的java代码是逐行执行的,只有在第一行的代码正确执行完结束,才会执行下一行代码;
1.11、变量的分类:
根据变量声明的位置来分类:
*局部变量
-在方法体当中声明的变量叫局部变量
*成员变量
-在方法体外声明的【类体之内】声明的变量叫成员变量
*java遵循就近原则
*类体中不能直接编写java语句,除声明变量之外
5、 数据类型:
5.1、 基本数据类型:
*四大类八小种:
第一类:整数型 byte,short,int,long
第二类:浮点型 float,double
第三类:布尔型 boolean
第四类:字符型 char
引用数据类型:
-类
-接口
-数组
。。。。
基本数据类型 占同空间大小【单位:字节】
--------------------------------------------------
byte 1
short 2
int 4
long 8
float 4
double 8
boolean 1
char 2
5.2、字节(byte)
1 byte=8 bit【一个字节=8个比特位】一个比特位表示一个二进制位:1/0
1KB = 1024 Byte
1MB = 1024 KB
1GB = 1024 MB
1TB = 1024 GB
*"符号位":符号位在所有二进制位的最左边,0表示正数,1表示负数
byte类型的最大值是0111 1111 2的7次方-1,结果是127
byte类型的最小值是-128
6、 字符编码
6.1、
'a'-->97
'A'-->65
'0'-->48
'a'--(按照ASCII编码)-->01100001
01100001---按照ASCII编码-->'a'
编码和解码的时候采用同一套字典/对照表,不会出现乱码。
当编码和解码的时候采用的不是同一对照表,会出现乱码问题。
6.2、简体中文的编码方式
* GB2312<GBK<GB18030
* 统一全球的编码
unicode编码
-utf-8
-utf-16
-utf-32
......
*java采用unicode编码 支持中文
*实际开发中用utf-8多一点
7、 数据类型
7.1、八种数据类型的默认值
*成员变量如果没有手动赋值,则系统会默认赋值【局部变量不会】
数据类型 默认值
----------------------------------
*byte,short,int,long 0
*float,double 0.0
*boolean false【在c语言中false是0,true是1】
*char \u0000
7.2、char类型
*一个中文占两个字节,java中的char类型可以存储一个中文字符
*转义字符 \ 反斜杠在java中具有转义功能,出现在特殊字符之前,会将特殊字符转换为普通字符
\n 换行符
\t 制表符
\' 普通单引号
\\ 普通反斜杠
\" 普通双引号
char c1='n'; 普通n字符
char c2='\n'; \n为换行符
println输出之后换行
print输出但是不换行
‘\t’是制表符,
*输出一个\
char y='\';编译报错
【\'】表示不带有任何特殊含义的单引号字符
char k='\\' 代表一个普通\字符 第一个\具有转义功能,将后面的反斜杠转义为普通的反斜杠字符
输出一个单引号
char a='';编译错误、
char a= '\''; 表示普通单引号
System.out.println("\"Helloworld\"");
*jdk中自带的native2ascii.exe命令可以将文字转换成unicode编码形式
7.3、java语言中的整数型
数据类型 | 占用空间大小 | 默认值 | 取值范围 |
---|---|---|---|
byte | 1 | 0 | [-128~127] |
short | 2 | 0 | [-32768~32767] |
int | 4 | 0 | [-2147483648~2147483647] |
long | 8 | 0L |
java语言当中的“整数类型字面值” 被默认当做int类型的来处理。
要让这个“整数类型的字面值”被当做long类型来处的话,
需要在“整数型字面值”后面加l/L,建议用大写的L.
①java语言中的"整数类型的字面值"有三种表示方式:
*十进制【是一种缺省默认的方式】
*八进制【在编写八进制整数型字面值的时候需要以0开始】
*十六进制【在编写十六进制整数型字面值的时候需要以0x开始】
int a=6;占用4个字节
long b=456;占用8个字节
int类型转为long类型可以自动转换
在java中出现数字时,默认为int类型
long aa=2147483648; 报错 2147483648超出int类型范围
long aa=2147483648L;
long类型转为int类型需要加强制类型转换符,可能损失精度
long y=123;
int x=(int)y;
强转原理:long-->int 将long左边的二进制砍掉,剩下右边的4个字节
*!特殊:对于byte,只要没有超过byte的范围,就可以
byte b=50;
byte c=127;
以上是没有问题的
但是对于byte b1=128;是报错的
②计算机二进制有三种表示形式
原码
反码
补码
计算机在任何情况下底层表示和存储数据的时候采用了补码的形式。
这正数的补码:和原码相同
负数的补码:负数的绝对值对应的二进制码所有的二进制位取反再加1
补码:10000000
原码计算过程:
*10000000 -1 -->01111111
*10000000 -->128
*-128
7.4、浮点型数据类型
double和float在计算机内部二进制存储的时候都是近似值
float单精度【4个字节】
double【8个字节,精度较高】
double的精度太低【相对来说】,不适合做财务软件。
财务涉及到钱的问题,要求精度较高。所以sun公司在基础se类库中为程序员准备了精度更高的类型,
不属于基本数据类型,它是:java.math.BigDecimal
例如 String.java 和String.class
在java语言中,所有的浮点型字面值【3.0】,默认被当做double来处理;
float f=5.1; !大容量转小容量,报编译错误
float f=(float)5.1;
float f=5.1f
7.5、布尔数据类型boolean
在java中boolean只有true和false;
主要用在逻辑运算和条件控制语句中
7.6、数据类型转换
1、八种数据类型中除布尔类型之外,剩下的7种类型都能互相转换
2、小容量向大容量转换,成为自动类型转换,容量从小到大排序:
byte< short < int < long < float < double
char <
注意:
任何浮点类型不管占用多少个字节,都比整数型容量大。
char和short可表示的种类数量相同,但是char可以取更大的正整数
3、大容量转换成小容量,叫做强制类型转换,需要加强制类型转换符,程序才能编译通过,但是在运行阶段可能会损失精度,所以要谨慎使用
4、当整数字面值没有超过byte,short,char的取值范围时,可以直接赋值给byte,short,char类型的变量。
5、 byte ,short ,char混合运算的时候,各自先转换成int类型在做运算。
6、多种数据类型混合运算,先转换成容量最大的那种类型在做运算。
8、运算符
8.1、算数运算符
+
-
*
/
% 求余数【取模】
++ 自加1【单目运算符】
int k=10;
k++,先做赋值运算
++k,先自加运算,在赋值运算
-- 自减1
不确定优先级的话加括号就行
8.2、关系运算符
>
>=
<
<=
==
!=
==是关系运算符
关系运算符的运算结果一定是布尔类型:true/false
8.3、逻辑运算符
& 逻辑与
| 逻辑或
!逻辑非
^ 逻辑异或(两边的算子只要不一样就是真true)
&& 短路与
|| 短路或
逻辑运算符要求两边的算子都是布尔类型,而且整体运算完以后结果也是boolean类型
*什么时候出现短路现象?
System.out.println(5>6 && 4>1);输出为false,短路与,在5>6 已经为假的情况下,不会再进行 4>1的运算
8.4、赋值类运算符
byte i=10;
*基本赋值运算符
=
*扩展的赋值运算符
+= i+=5; 等同于i=(byte)(i+5)
-=
*=
/=
%=
赋值类运算符的优先级:先执行等号右边的表达式,将执行结果赋值给左边的变量
扩展类的赋值运算符不改变运算结果的类型,但是可能会损失精度
8.5、字符串连接运算符
“+”在java中有两个作用
*加法运算,求和
*字符串的链接运算
*加法两边只要有一个是字符串,一定会进行字符串链接运算,链接之后的运算结果还是一个字符串类型
8.6、三元运算符
三元运算符/三目运算符/条件运算符
1、语法规则:
布尔表达式 ? 表达式1:表达式2
2、三元运算符的执行原理
当布尔表达式的结果是true的时候,将表达式1作为整个表达式的执行结果;
当布尔表达式的结果是false时候,将表达式2作为整个表达式的执行结果;
9、控制语句
9.1、选择结构
- if,if else
-switch
只能判断int或String类型的变量
也可以使用byte,short,char,因为可以自动类型转换
9.2、控制循环结构
- for
- while
- do..while()
9.3、改变控制语句顺序
- break
- continue
10、递归
//以下代码片段只有一份,但是可以被重复调用,
//并且只要调用doSome方法就会在栈内存中新分配一块所属的内存空间。
public static void doSome(){
System.out.println("doSomebegin");
doSome();//这行代码不结束,下一行程序是不能执行的
System.out.println("doSomeover");
}
*递归是很占内存的,能不用就不用
*递归必须有结束条件
*递归即使有了结束条件,也可能发生溢出的错误,因为递归的太深了
11、面向过程和面向对象的区别
*面向过程:
主要关注点是实现的具体过程,因果关系【集成显卡的开发思路】
-优点:
对于业务逻辑比较简单的程序,可以达到快速开发,前期投入成本较低
-缺点:
采用面向过程的方式开发很难解决非常复杂的业务逻辑,另外面向过程的方式导致软件元素之间的耦合度非常高,只要其中一环出问题,整个系统受到影响,导致最终的软件扩展能力差,由于没有独立体的概念,所以无法达到组件复用
*面向对象:
主要关注点是:
主要关注对象【独立体】能完成哪些功能。【独立显卡的开发思路】
-优点:
耦合度第扩展力强,更容易解决现实世界中更复杂的业务逻辑,组件复用性强
-缺点:
前期投入成本较高,需要完成独立体的抽取,大量的系统分析与设计
12、面向对象的软件的生命周期【整个生命周期中贯穿采用oo面向对象方式】
OOA:面向对象的分析
OOD:面向对象的设计
OOP:面向对象的编程------java就是一个纯面向对象的语言
12.1、类—实例化—>对象,对象又被称为对象
12.3、java中包括两种数据类型
*基本数据类型
*引用数据类型
13、面向对象与内存
1、jvm(java虚拟机)主要包括三块内存空间,分别是:栈内存,堆内存,方法区内存。
2、堆内存和方法区内存各有1个,一个线程一个栈内存。
3、方法调用的时候,该方法所需要的内存空间在栈内存中进行分配,称为压栈,方法执行结束后,该方法所属的内存空间释放,称为弹栈
4、栈中主要存储的是方法体中的局部变量。
5、方法的代码片段以及整个类的代码片段都被存储到方法区内存当中,在类加载的时候这些代码片段会载入
6、在程序执行过程中使用new运算符创建的java对象,存储在堆内存当中。对象内部有实例变量,所以实例变量存储在堆内存中。
7、变量分类:
*局部变量【方法体中声明】
*成员变量【方法体外声明】
-实例变量【前边修饰符没有static】
-静态变量【前边修饰符中有static】
8、静态变量存储在方法区内存当中
9、三块内存当中变化最频繁的是栈内存,最先有数据的是方法区内存,垃圾回收器主要针对的是堆内存
10、垃圾回收器【自动垃圾回收机制、GC机制】什么时候会考虑将某个java对象的内存回收?
*当堆内存中的java对象成为垃圾数据的时候,会被垃圾回收器回收
*什么时候堆内存中的java对象会变成垃圾?
没有更多的引用指向他的时候。
这个对象无法被访问,因为访问对象只能通过引用的方式进行访问
14、关于java类中的构造方法
14.1、构造方法又称为构造函数/构造器/Constructor
14.2、构造方法语法结构:
【修饰符列表】 构造方法名(形式参数列表){
方法体
}
14.3、回顾普通方法语法结构:
【修饰符列表】返回值类型 方法名(形式参数列表){
方法体
}
14.4、对于构造方法,“返回值类型”不需要指定,也不能写void,只要写上void就是普通方法了。
14.5、对于构造方法来说,方法名必须和当前类的类名保持一致。
14.6、构造方法的作用?
构造方法存在的意义是,通过构造方法的调用,可以创建对象。
14.7、构造方法怎么调用?
-普通方法调用:
方法修饰符中有static的时候:类名。方法名(实参列表)、
方法修饰符列表中没有static的时候:
引用.方法名(实参列表)
-new 构造方法名(实参列表)
14.8、构造方法调用结束之后,有返回值吗?(方法名前没有返回值类型不一定没有返回值)
每一个构造方法实际上执行结束之后都有返回值,但是这个“return 值;” 这样的语句不需要写。构造方法结束的时候java程序自动返回值
并且返回值类型是构造方法所在类的类型。由于构造方法的返回值类型就是类本身,所以返回值类型不需要填写。
14.9、当一个类中没有定义任何构造方法的时候,系统会默认给该类提供一个五参数的构造方法,这个构造方法被称为缺省构造器
14.10、
当一个类显示的构造方法定义出来的时候,系统就不在默认为这个类提供缺省构造器了,建议开发中为当前类提供无参数构造方法,因为无参构造方法太常用了
14.12、
构造方法是可以重载的,在一个类中编写多个构造方法,这多个构造方法显然已经构成了方法重载机制
14.13、
调用带有static的方法 类名.
ConstructorTest01.doSome();
doSome();
调用没有static的方法 引用.
ConstructorTest01 t=new ConstructorTest01 ();
t.doOther();