Java
开篇
第一章主要简单介绍了一下java
的基础知识
介绍
知道java
是一种可以跨平台面向对象的程序设计语言
组成
JRE=JVM+
类库
JDK=JRE+
工具类
Java
由四个方面组成:
- java编程语言
- java类文件格式
- java虚拟机(JVM)
- 程序接口(JAVA API)
体系
- JAVASE(java标准版)
- JAVAEE(企业版)
- JAVAME(微型版)
特点
- 一种面向对象的语言
- 一种与平台无关的语言,可以提供程序运行的解析环境
- 一种健壮的语言(主要舍弃了指针,内存的申请以及垃圾回收)
Java
虚拟机
- java虚拟机可以理解成为一个以字节码为机器指令的CPU
- 对于不同的平台有不同的虚拟机制
- JVM机制屏蔽底层不同运行平台的差别,实现了”一次编译,随处运行”.
垃圾回收机制
- 在java程序中不使用的内存空间当成垃圾回收
- 在C/C++语言中,垃圾回收是由程序员负责回收无用的内存
- Java程序中消除由程序员回收无用内存的责任.
- Java程序中垃圾回收程序员无法控制与干涉.
Java
运行过程
JavaSE
整理结构
项目开发命名规范
在eclipse
创建java
项目需要注意的命名规范
- 项目名首字母大写:StuAO
- 包名的命名规范:com.java(公司名/项目名).bean(包的具体含义),包名的所有构成部分必须要小写
- 类名的命名规范:首字母必须要大写Eg:Student
标识符的命名规范
- 标识符由26个大小写字母,0-9,_和$组成
- 数字不能出现在首位[不能以数字开头]
- 严格区分大小写
- 不能直接使用关键字或者保留字作为标识符
- 标识符中不能包含空格
注意
:
在起名字时,
为了提高阅读性,
要尽量”
见名知意”
数据类型
Java
是一种强类型语言,
对于每一种数据都定义了明确的数据类型,
数据类型分类
:
- 基本数据类型
- 整形[byte, short, int, long]
- 浮点型[float, double]
- 字符[char]
- Boolean(默认false)
注意
:
整数默认是
int
类型
浮点数默认是
double
类型
长整形后缀必须用
L
或
l
标记
,
建议使用
L
单精度
(float)
数必须用
F
或
f
标记
,
建议使用
F
- 引用数据类型(类,接口,数组)
数据类型的转换
默认数据类型转换
从小到大的转换
- byte, short, char--->int--->long--->float--->double
- byte,shoort,char相互之间不能转换,他们参与运算首先转换为int类型
强制类型转换
大的数据类型转换为小的数据类型
格式:
目标数据类型
变量 = (
目标数据类型) (
被转换的数据)
Eg:int intNum = (int)num;
面试题
:
byte b1=3,b2=5,b;
b =b1+b2;
b=3+5;
哪句是编译失败的
,
为什么失败
???
答
:b=b1+b2
这行代码有问题
,
因为变量相加
,
会首先看类型
,
也就是说
b=b1+b2
的数据类型会提升为
int
类型
,
也就是说
int
类型的
(b1+b2)
赋值给
byte
类型的
b,,
强制类型转换错误
,
所以有问题
.b=3+5.
首先把结果计算出来
,
然后看是否在
byte
数值范围内
,
如果在其范围就不报错
.
int charA ='0'+1;
//ASCII
码
:'a' 97 'A' 65 '0' 48
System.out.println(charA); // 49
System.out.println(‘a’+1); //98
System.out.println(‘a’+1+”Hello”); // 98Hello
成员变量
成员变量:
作为类的成员而存在,
直接存在于类中.
- 类变量:又叫静态(static)变量,它可以直接用类名调用,也可以对象调用.
- 实例变量:不用static修饰,它只能通过对象调用[实例化方式调用].
局部变量
局部变量:
作为方法或语句块的成员而存在,
主要存在于方法参数列表和方法定义中
面试题
:
Java
中成员变量与局部变量的区别
?
- 成员变量可以被public,protect,private,static等修饰符修饰,而局部变量不能被控制修饰符以及static修饰,但两者都可以定义成final类型.
- 成员变量存储在堆中,局部变量存储在栈中
- 成员变量有默认值(被final修饰并且没有static的必须要显式赋值),局部变量不会自动赋值
块
- 普通代码块
- 构造代码块
- 静态代码块
static
{
System.
out
.println(
"=====
静态代码块
====="
);
}
{
System.
out
.println(
"========
构造代码块
=========="
);
}
public
static
void
main(String[]
args
) {
//
实例化
StaticDemo
demo
=
new
StaticDemo();
System.
out
.println(
"=========
普通代码块
========"
);
}
静态代码块优先于构造代码块执行
Java
运算
算术运算
+, -, *, /, %,
++(
前置):
先运算后取值
++(
后置):
先取值后运算
--(
前置):
先运算后取值
--(
后置):
先取值后运行
Eg:
System.
out
.println(
"
相加运算
:"
+(
a
+
b
));
//12
System.
out
.println(
"
相减运算
:"
+(
a
-
b
));
//4
System.
out
.println(
"
相乘运算
:"
+(
a
*
b
));
//32
System.
out
.println(
"
相除运算
:"
+(
a
/
b
));
//2
System.
out
.println(
"
取模运算
:"
+(
a
%
b
));
//0
/*
* ++(
前置
):
先运算后取值
++(
后置
):
先取值后运算
--(
前置
):
先运算后取值
--(
后置
):
先取值后运行
*/
//c=9 ,a=9
System.
out
.println(
"
前置
++
运算
:"
+(
c
=++
a
)+
"
输出
a
的值
:"
+
a
);
//c=8, a=9
System.
out
.println(
"
后置
++
运算
:"
+(
c
=
a
++)+
"
输出
a
的值
:"
+
a
);
//d=3, b=3
System.
out
.println(
"
前置
--
运算
:"
+(
d
=--
b
)+
"
输出
b
的值
:"
+
b
);
//d=4, b=3
System.
out
.println(
"
后置
++
运算
:"
+(
d
=
b
--)+
"
输出
b
的值
:"
+
b
);
注意:
如果对负数取模”%”,
可以把模数负号忽略不记Eg:5%-2=1,
但是如果被模数是负数则不可以忽略.
练习题
:
从控制台输入一个
4
位数的整数
,
实现反转进行输出
?
//
从控制台输入一个
4
位数的整数
,
实现反转进行输出
?
System.
out
.println(
"
请输入一个四位数的整数
:"
);
Scanner
scanner
=
new
Scanner(System.
in
);
int
numSor
=
scanner
.nextInt();
//4321 ===>1234
/*
*
分析
:
*
int
g = 12%10 = 2
//
取模操作得到个位
==>
两位数得到个位上的数
*
int
sg
= 123%100 = 3
//
取模操作得到个位
==>
三位数得到个位上的数
*
int
s = 12/10=1 //
除法操作得到十位
*
int
ss
= 123/10%10 //
十位
*
*/
int
g
=
numSor
%10;
int
s
=
numSor
/10%10;
int
b
=
numSor
/100%10;
int
q
=
numSor
/1000;
System.
out
.print(
g
+
" "
+
s
+
" "
+
b
+
" "
+
q
);
System.
out
.println(
g
*1000+
s
*100+
b
*10+
q
);
逻辑运算符
&&:
短路逻辑与
||:
段路逻辑或
!:
逻辑非
位运算符
<<:
左移
>>:
右移
>>>:
无符号右移
& :
逻辑与
|:
逻辑或
^:
逻辑异或
~:
取反
注意:
位运算符是直接二进制进行运算[
只是针对int
类型的数据有效]
Integer.toBinaryString(n); //
将十进制转换为二进制
Eg:
public
static
void
main(String[]
args
) {
int
a
= 3;
int
b
= 2;
//1 ===>3/2=1
System.
out
.println(
"
右移运算
:"
+(
a
>>1));
//12 ===>3*2*2=12
System.
out
.println(
"
左移运算
:"
+(
a
<<
b
));
//1 ===>3/2=1
System.
out
.println(
"
无符号右移运算
:"
+(
a
>>>1)); System.
out
.println(
"
与运算
:"
+(6&3));
//2
System.
out
.println(
"
或运算
:"
+(6|3));
//7
System.
out
.println(
"
异或运算
:"
+(6^3));
//5
System.
out
.println(
"
取反运算
:"
+(~
b
));
//-3
int
x
=3;
int
y
=4;
System.
out
.println(
"
与运算
:"
+(3&4));
//0
System.
out
.println(
"
或运算
:"
+(3|4));
//7
System.
out
.println(
"
异或运算
:"
+(3^4));
//7
System.
out
.println(
"
取反运算
:"
+(~3));
//-4
//3
的二进制
: 00000011
//
左移
:[3<<2]===>00001100 //
//
右移
:[3>>2]===>00000000 00000000 00000000
//
右移
:[-3>>2]==>11111111 11111111 11111111 -3/2=-1
//
无符号位右移
[3>>>2]===>0
// 4
的二进制
: 00000100
//
&
与运算规则
:
有
0
则
0
//
|
或运算符规则
:
有
1
则
1
//
^
异或运算规则
:
相同则
0,
异同则
1
^[
异或面试题
]:
//^[
异或
]
的特点
:
//
一个数据位异或两次
,
该数本身不变
System.
out
.println(5^6^5);
//6
System.
out
.println(5^6^6);
//5
//
面试题
:
实现对两个整数进行交换
int
mun1
=20;
int
mun2
= 30;
//
第一种实现思路
[
开发过程中经常用到
]:
通过一个中间变量来交换
int
temp
=0;
temp
=
mun1
;
// ===>20
mun1
=
mun2
;
// ===30
mun2
=
temp
;
// ===>20
//
第二种实现思路
[
用位异或实现
]
mun1
=
mun1
^
mun2
;
mun2
=
mun1
^
mun2
;
//mun1^mum2^mun2 ===>mun1
mun1
=
mun1
^
mun2
;
//mun1^mun2^mun1 ===>mun2
//第三种
num2=num1+num2;
num1=num2-num1;
num2=num2-num1;
//
取反规则
:
数值
(
正数
,
负数
)
加
1
取反
//
左移规则
:m<<n:
整数
m
表示的二进制数左移
n
位
[3<<2],
高位移出
n
为都舍弃
,
低位补
0(
此种情况会出现整数变负数
)
//
左移计算方式
:
把
<<
左边的数据乘以
2
的的移动次幂
System.
out
.println(3<<2);
//==>3*2*2
//
右移规则
:m>>n:
整数
m
表示的二进制右移
n
位
,m
为正数
,
则高位全部补
0,m
为负数
,
则高位全部补
1
//
右移计算方式
:
把
>>
左边的数据除以
2
的的移动次幂
System.
out
.println(24>>2);
//==>24/2/2=6
System.
out
.println(24>>>2);
//==>24/2/2=6
}
练习题:
System.
out
.println(8>>1);
//4
System.
out
.println(8<<2);
//8*2*2=32
System.
out
.println(3+5>>1);
//4
System.
out
.println(3+(5>>1));
//3+5/2=5
比较运算符
==, !=, <, >, <=, >=
比较运算符返回的是boolean
类型的结果
注意:
- <, >,<=, >= 只支持左右两边操作数是数值类型[byte, short, int, long, ffloat, double ]
- ==, !=两边的操作数既可以是数值类型也可以是引用类型
三元运算符
格式
:
A(
条件表达式
)?
表达式
1:
表达式
2
运算规则:
- 当A(条件表达式)为true,运算后的结果是:表达式1
- 当A(条件表达式)为false,运算后的结果是:表达式2
System.out.println((8>6)?”8
大于
6”:”8
不大于
6”);