Java笔记(一)

时间:2023-03-09 19:23:33
Java笔记(一)

Java语言特征

Java之父:詹姆斯,格斯林

跨平台:
一次编译,到处运行
write once,run everywhere!

Java是一种面向对象的编程语言(OOP)
面向对象(OO -- Oriented Object)

内置了大量的类库!

Java版本:
JavaSE(Java Standard Edition) java标准版
专门开发桌面级应用
JDK:Java Development Kit java开发工具包
JRE:Java Runtime Environment java运行环境
JVM:Java Virtual Machine java虚拟机

JavaEE(Java Enterprise Edition) java企业版
它是一个体系,不是一门具体的技术
包含EJB,Servlet,JSP...等技术

API(Application Programming Interface) 应用程序接口
==> 面向程序员

SPI(Service Provider Interface) 服务供应商接口
==> 面向服务供应商

JavaME(Java Micro Edition) java微型版
==> 安卓
-------------------------------------------------------

编写第一个Java程序:

编译 运行
XXX.java -------> XXX.class -------> 结果

.java 源文件
.class 字节码文件

---------------------------------------------------------

JAVA类的定义:

package xxx.xxx.xxx;

import xxx.xxx.xxx;

public class 类名 {
//方法
public static void main(String[] args){
//方法体;
//...;
}
}

注意点:
1.建议采用驼峰法(Camel)命名规范
类名必须与文件名一致
2.类名的每个单词首字母都必须大写
3.方法名首字母小写,以后每个单词首字母大写

类名
1.类名必须由数字,字母,_,$,中文汉字所组成,并且不能以数字开头
中文命名不推荐,因为可能产生乱码问题
2.不能是JAVA关键字
public,class,void,package,interface,abstract
private,protected,byte,short,int,char,long
double,float,boolean,enum,static,final,
......
3.不能是java的保留字:goto,const
4.不能是以下3个字面量:true,false,null
5.尽量不要是内置对象类型

注意:String不是关键字!

-------------------------------------------------------

包的概念

作用:
1.做为一种命名空间,保证在不同包下的类可以重名
2.可以方便管理和维护,因为包就是对于操作系统的文件夹

如何定义:
使用关键字:package

注意:
1.package语句必须放在整个类的第一行
2.包名采用小写字母编辑,并且中间以.隔开
3.自定义的包名,不能是java或者javax
4.一般情况下,包名采用公司域名的倒置来命名

如:
com.baidu.xxx;
com.tencent.xxx;

有了包过后,类的名字为
包名.类名 ----> 类的全限定名

------------------------------------------------------

Scanner:用来获取用户键盘输入

第一步:导入Scanner
关键字:import
import java.util.Scanner;

第二步:创建Scanner对象
Scanner sc = new Scanner(System.in);

第三步:使用创建的对象名去调用Scanner内部的方法
. 是用来调用方法或者属性
sc.nextLine();//用来获取用户输入的一行信息
sc.nextInt();//用来获取用户输入的整数

同包 不需要import
跨包 需要import

注意:
1.java.lang.*所有类是不需要import的,可以直接引用
2.如果导入某一个包中相同的几个类,则可以用简写形式:
xxx.xxx.*;
不推荐,会降低程序性能,因为要去搜索
3.nextInt()和nextLine()方法不能混用,会导致nextLine()方法出现问题.

------------------------------------------------------

输出语句
System.out.println("XXX");
ln表示输出完括号里面的内容过后换行

例如:
System.out.println("好好学习");
System.out.print("天天向上");

----------------------------------------------------------
注释:

代码:注释 = 1 : 2+

单行注释,修饰某一行代码
//

多行注释,修饰一段代码
/*
*
*/

文档注释,修饰类和方法
/**
*
*/

可以通过javadoc指令来生成API文档
Project -> Generate Javadoc

常用的标记:
@author 作者
@since 从以下哪个版本开始
@see 另请参见
@param 参数
@return 返回
@deprecated 已过时

数据(Data)

是系统的核心,我们编程的目的就是为了操作数据(增,删,改,查)

在代码中如何定义和存储数据呢?需要通过变量或者常量以及数据类型

注意:Java是一种强类型的语言,也就是说任何数据都需要有类型.
JavaScript,弱类型的编程语言,定义变量时无需声明数据类型

Java语言分为基本类型和对象类型两大类数据类型(无数种)
1)基本类型(8种):
名称 容量 范围 默认值
byte 字节型 占1字节=8bit -128~127 0
short 短整型 占2字节=16bit -32768~32767 0
int 整型 占4字节=32bit -2147483648~2147483647 0
long 长整型 占8字节=64bit -2^63 ~ 2^63 - 1 0
float 单精度浮点数 占4字节=32bit -3.4E+38 ~ 3.4E+38 0.0
double 双精度浮点数 占8字节=64bit -1.797E+308 ~ 1.797E+308 0.0
char 字符型 占2字节=16bit 'a' , 'B', '您' \u0000
boolean 布尔类型 占1字节=8bit true/false false

注:1.JAVA中所有的数字都是带符号的
2.字符型和字符串是不同的,字符型用单引号,字符串用双引号
char c = '您';
String s = "好好学习,天天向上!"
3.java中,你写一个整数,默认是int类型的,写一个小数,默认是double类型的.
float f = 3.4;//编译错误,3.4默认是double类型的,不能赋值给float类型的变量

4.cmd命令行中查看中文字的unicode编码的方法
a.打开命令行
b.输入native2ascii回车
c.输入想查询的中文字回车即可得到对应的unicode

ctrl + c 关闭当前转换进程

2)对象类型
a. 内置对象类型(API)
Scanner,Math,Random,String...

b. 自定义对象类型
我们编程时写过的所有类都是自定义对象类型
-------------------------------------------------------------------
特殊符号:
\t 制表符 表示隔开一个tab的距离
\n 换行 到下一行的起始位置
\r 回车 到当前行的起始位置
\b 退格 相当于键盘上的BackSpace
\\ 反斜杠
\" 双引号
\' 单引号
-------------------------------------------------------------------

变量

语法
数据类型 变量名 [= 给变量的初始值];

注:
变量名和类名一样,都是由数字,字母,_,$组成并且不能是数字开头
变量名可以是中文汉字,但是不推荐,因为可能出现乱码问题
变量名尽量首字母小写,以后每个单词首字母大写(常量除外)
如: int num = 1;
int inputInt = sc.nextInt();

|.可以在声明的时候直接初始化(第一次给变量赋值)
如:int i = 100;
double d = 3.14;
String str = "你好!";

||.先声明变量,在使用前,初始化
如:int i;
.....
i = 100;

字面量:就是指代数据本身,它也属于变量
"你好!",'A',3.14,100

注意:所有程序都是由变量所组成的!

给变量赋值的方式:
a.字面量赋值
int i = 3;

b.方法赋值
public int add(int i,int j){
return i + j;
}

int i = add(3,4);

c.表达式赋值
表达式:由变量和运算符组成的合法的语句
int i = sc.nextInt();

int a = 1, b = 2;
int i = a + b;

----------------------------------------------------------
常量

在变量的基础上加一个关键字 -- final

常量一定要初始化,它的值是不能改变的

如:
final int ROW_EACH_PAGE = 10;//定义了一个常量

常量的命名规则:使用大写字母,并且中间用下划线隔开

注意:常量比字面量携带更多的信息,提高了代码的可读性
----------------------------------------------------------

数据类型转换:
1.自动类型转换(隐式类型转换)
由精度小的数据类型可以自动转换成精度大的数据类型

如:byte -> short -> int -> long
char -> int
boolean -> int //error

2.强制类型转换
由精度大的数据类型往精度小的数据类型转换时,可能损失精度,
编译器会报错,必须采用强制转换
如:
1)在所需转换的数值前面加(类型)
注:这里的类型,可以是基本类型,也可以是对象类型
int i = 220900;
char c = (char)i;

float f = (float)3.14;

2)只有long,double,float可以这样转换
在所需转换的数值后面加L/l,D/d,F/f
float f = 3.14F;

注意:
在JAVA中,两种数据类型进行运算时,结果都是偏向数据类型
更大的那一方

----------------------------------------------------------

1byte = 8bit
1K = 1024byte
1MB = 1024K
1GB = 1024MB
1TB = 1024GB
1PB = 1024TB
1EB = 1024PB
1ZB = 1024EB
1YB = 1024ZB
1BB = 1024YB
1NB = 1024BB
1DB = 1024NB

注:手机流量是以1000为计算界限的
----------------------------------------------------------

进制
二进制:只有0和1所组成,每遇到2进1

二进制 十进制
0101 1*2^2 + 0*2^1 + 1*2^0 = 5
1010 1*2^3 + 1*2^1 = 10;
1111 15

二进制转十进制
先从右往左标记,从0开始,然后累加相应位置数字乘以进制数的标记次方

十进制转二进制
连续除以2,然后倒取余数

小练习:
39 --> 0010 0111

110010 --> 50
-------------------------------------------------------------

0011 1000 ---> 56
0001 1100 ---> 28
0000 1110 ---> 14
0000 0111 ---> 7

位移运算 -- 所有运算中效率最高的
二进制中,向右移动一位,相当于除以2,向左移动一位,相当于乘以2

八进制:由0~7组成,每逢8进1
032 0*8^2 + 3*8^1 + 2*8^0 = 26

十六进制:由0~9和A~F组成,以0x开头
int i = 0x0029;
2*16^1 + 9*16^0 = 41

小练习:
求出0x0419的二进制?
0x0419
求十进制:4*16^2 + 1*16^1 + 9*16^0 = 1049
求二进制:0100 0001 1001

系统内置的转换方法(十进制转换成相应字符串):
toBinaryString(int i) 转换二进制字符串表示

toHexString(int i) 转换十六进制字符串表示

toOctalString(int i) 转换八进制字符串表示
------------------------------------------------------------------

运算符

|.算术运算符
+ 1.数学运算 2.字符串的连接
- 减法(负号)
* 乘法
/ 除法 100/3 = 33 100/3.0 = 33.33333333
% 取余 100%3 = 1

= 表示赋值 int i = 3; 把3赋值给int类型的变量i
== 表示等于 返回类型:boolean

+= -= *= /= %=
如:
b = b + 1; --> b += 1;//后面这种写法可以避免类型转换问题

++ 自增
-- 自减
前++ 表示++写在变量的前面,表达式和变量的值本身都加1(先自增,后赋值)
后++ 表示++写在变量的后面,表达式的值不变,变量加1(先赋值,后自增)

位移运算:性能是最高的
<< 带符号左移位
>> 带符号右移位
>>> 不带符号右移位

注意:没有不带符号左移位(<<<)

<<= >>= >>>=

面试题:
请你用最快并且性能最高的方式得到4的3次方? 4<<3

算术运算符是一种二元运算符,需要两个参数来参与
对算术运算符来说,操作数只能是数字类型(整型,浮点型)
特殊例外:字符串可以用+运算(拼接)

低精度和高精度做运算时,结果是高精度
相同精度数据进行运算,结果是它本身的数据类型

||.比较运算符(返回布尔类型)
< 小于
> 大于
<= 小于等于
>= 大于等于
!= 不等于

|||.逻辑运算符

&& 短路逻辑与 同真为真,同假为假,只要有一个为假,结果为假

|| 逻辑或 同真为真,同假为假,只要有一个为真,结果为真

! 逻辑非 表示取反

如:
boolean b1 = true;
boolean b2 = false;
boolean b = b1 && b2;//false
b = b1 || b2;//true
b = !b1;//false

注意:
& 1.非短路的逻辑与(一般不用)
2.按位与

| 1.非短路的逻辑或(一般不用)
2.按位或

短路型和非短路型逻辑运算符的区别:

短路型运算符,如果运算符左边的结果可以决定整个式子的结果,
那么右边部分就不会执行了
所以,我们在编写代码的时候,需要考虑一下,把哪个条件放在运
算符前面
用逻辑与时,把两个条件中可能为false几率更大的一个放前面
用逻辑或时,把两个条件中可能为true几率更大的一个放前面
这样可以提升整个软件的性能.

||||.按位运算符
& 按位与(非短路逻辑与) 同0为0,同1为1,不同为0
| 按位或(非短路逻辑或) 同0为0,同1为1,不同为1
^ 按位异或 相同为0,不同为1
公式:
一个数连续异或同一个数两次,结果是它本身
5 ^ 7 ^ 7 = 5

如:
5的二进制:0101
7的二进制:0111

0101
& 0111
------
0101 -- 5 & 7 = 5

0101
| 0111
------
0111 -- 5 | 7 = 7

0101
^ 0111
------
0010 -- 5 ^ 7 = 2
^ 0111
------
0101

~ 按位取反
0变1,1变0

负数,在计算机中是以补码的形式存储的

补码 = 原码取反 + 1
~x = -(x + 1)

负数的二进制如何得到?
2的二进制 00000000 00000000 00000000 00000010
按位取反 11111111 11111111 11111111 11111101
再+1 11111111 11111111 11111111 11111110
-2的二进制 11111111 11111111 11111111 11111110

-9的二进制:
00000000 00000000 00000000 00001001
11111111 11111111 11111111 11110110
11111111 11111111 11111111 11110111

~9 = -10
11111111 11111111 11111111 11110110

00000000 00000000 00000000 00001010
11111111 11111111 11111111 11110110

--------------------------------------------------------------

三目运算符 ? :
作用:条件判断

condition ? expression_1 : expression_2;
条件?表达式1:表达式2;

当条件成立时,执行表达式1,当条件不成立是,执行表达式2

相当于
if(条件){
//表达式1;
}else{
//表达式2;
}