1、Java注释
-
单行注释 //
-
多行注释
/* 这是注释 这是注释 */
-
文档注释
/** 注释 /*
/** * 这是一个HelloWorld类 * @author 14664 * */ public class HelloWorld { /* * 程序执行入口 */ public static void main(String[] args) { // 打印,在控制台输出内容 System.out.println("Hello World!!"); } }
2、Java变量
变量是内存中的一个存储区域,是程序中最基本的存储单元,包括:变量类型、变量名和存储的值
作用:用于在内存中保存数据
注意:
- java变量必须先声明再使用
- 变量只有在作用域中有效
- 使用变量名来访问这块区域的数据
- 在同一个作用域中,不能定义重名的变量
String str = "字符串";
System.out.println(str);
public static void main(String[] args) {
}
public void test() {
// str1只能在当前的函数使用,上面的main函数是使用不了的
String str1 = "另外一个字符串";
System.out.println(str1);
}
3、八种数据类型
数值型:byte、short、int、long、float、double
字符型:char
布尔型:boolean
java各整数类型有固定的表数范围和字段长度,不受操作系统影响,以保证java程序的可移植性
java整型变量默认为int,long类型的变量后面需要加“l”或者“L”
java浮点型默认为double,声明float的常量后面要加’f’或者’F’
整型:
类型 | 占用存储空间 | 表数范围 |
---|---|---|
byte | 1字节=8bit | -128 — 127 |
short | 2字节 | -2^15 — 2^15 - 1 |
int | 4字节 | -2^31 — 2^31 - 1 |
long | 8字节 | -2^63 — 2^63 - 1 |
bit是计算机中最小的存储单位。1MB = 1024K 1GB = 1024M 1T = 1024GB
计算机中,所有的数据都是二进制数据
浮点型:
浮点型默认为double,声明float的常量后面要加’f’或者’F’
类型 | 占用的存储空间 | 表数范围 |
---|---|---|
单精度float(只能精确到7位有效数字) | 4字节 | -3.403E38 — 3.403E38 |
双精度double(精确度是float的两倍) | 8字节 | -1.798E308 — 1.798E308 |
字符类型:
使用英文单引号’’
类型 | 占用的存储空间 | |
---|---|---|
char | 2个字节(1个字符) |
布尔类型:
true或者false
占用空间取决于java虚拟机,1个字节,4个字节都有可能
补充:
ASCII码
ASCII 是用来表示英文字符的一种编码规范。每个ASCII字符占用1 个字节,ASCII 编码可以表示的最大字符数是255。
UNICODE码
对于中文等比较复杂的语言,255个字符显然不够用。UNICODE作为一个全新的编码系统应运而生,它可以将中文、法文、德文……等等所有的文字统一起来考虑,为每一个文字都分配一个单独的编码。
UTF-8
使用UNICODE码,一些小数据可以使用一个字节表示的,却得用多个字节表示,浪费资源
utf-8为了节省资源,采用变长编码,编码长度从1个字节到6个字节不等
4、基本数据类型变量间的运算
-
自动类型提升
当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型
char、byte、short -> int -> long -> float -> double
-
强制类型转换
需要强制转换符(),并且精度会有损失
float f = 1.9f;
int a = (int)f; 得到 1
-
String可以和八种数据类型变量做运算,做连接运算
5、运算符
(1)四则运算符
+、-、*、/
++、–
% 取余
(2)赋值运算符
=、+=、-=、*=、/=、%=
(3)比较运算符
==、!=、>、>=、<、<=
(4)逻辑运算符
&(与): 多个表达式进行计算时,每一个表达式为true的时候,整体的结果是true。即使第一个为false,还是会继续判断后面的表达式
&&(短路与):与&效果一样,不同在于前面的表达式为false,就不会判断后面的表达式了
|(或):每一个表达式做判断,只要有一个为true,最后的结果就为true
||(短路或):与|效果一样
!(取反):!true为false,!flase为true
6、流程控制
(1)if
条件表达式的结构一定是true或者false。为true则执行大括号里面的语句
语法:
if(条件表达式) {
// 代码块
}
(2)if…else…
条件表达式为true时,执行代码块1,为false时,执行代码块2
语法:
if(条件表达式) {
// 代码块1
} else {
// 代码块2
}
(3)if…else if … else…
从上往下做判断,只要条件表达式为true,则进入分支执行对应的代码块
语法:
if(条件表达式1) {
// 代码块1
} else if(条件表达式2) {
// 代码块2
} else if(条件表达式3) {
// 代码块3
} else {
// 代码块4
}
(4)switch
switch只能做等值判断,表达式只能是byte、short、char、int、String
语法:
switch(表达式) {
case 常量1:
// 代码块1
break;
case 常量2:
// 代码块2
break;
default:
// 代码块3
break;
}
(5)三元运算符
语法:表达式 ? 表达式1 : 表达式2 (表达式1 和 表达式2 的类型要一致)
机制:表达式为true,则整个结果就是表达式1
表达式为false,则整个结果就是表达式2
(6)循环结构
-
for循环
语法:
for(初始变化量;条件表达式;操作表达式) { // 循环体 }
1执行初始变化量
2判断条件表达式,如果为true,则执行3,如果为false则执行5
3执行循环体,执行4
4执行操作表达式,执行3
5结束循环
-
while 循环
语法:
while(条件表达式) { // 循环体 }
-
do…while循环
先执行循环体再判断条件表达式
语法:
do { // 循环体 } while (条件表达式)
7、函数(方法)
方法是一段能独立完成功能模块的代码块。可以被多次调用,提高代码的复用性。
语法:
public static 返回值类型[void] 方法名称(数据类型: 变量名) {
// 方法体
[return 结构值];
}
8、面向对象
把大象装进冰箱
面向过程:1打开冰箱、2大象放入冰箱、3关上冰箱
面向对象:
1大象
属性:体重、身高、性别等
方法:吃饭、走路等
2冰箱
属性:尺寸、品牌、颜色等
方法:开门、关门、制冷等
执行过程:创建一个冰箱,创建一只大象,让冰箱自己开门,让大象走进冰箱,让冰箱关门
OOP(object oriented programming)面向对象。java认为万物皆对象。
- 类:某些具有相同属性和行为的事物抽象成一类。
比如:狗是一个类,那么阿拉斯加、哈士奇、萨摩耶就是这个类的对象。类似模板和样本的关系,通过一个模板可以创建多个样例。(类是抽象的概念,对象才是真正的实例)
- 定义类:(类名称:首字母要大写,驼峰式,见名知意)
class 类名称 {
属性
方法
}
-
创建对象:类名 变量名 = new 类名(); 通过对象可以访问其属性和方法
-
类的属性:八个基本数据类型,引用数据类型:类、接口、数组
数据类型 | 默认值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0 |
double | 0.0 |
boolean | false |
char | ‘’ |
引用数据类型 | null |
- 类的方法:
public static 返回值类型[void] 方法名称(数据类型: 变量名) {
// 方法体
[return 结构值];
}
-
创建对象的内存结构
栈:用于存储基本数据的值或者局部变量。先进后出,存取的容量小,存取速度快。
堆:用于存储引用数据类型。存取的容量大,速度慢一些。
数据共享区(方法区):存储引用数据类型,存储一些共享的数据(比如方法)
对象存储在堆中,引用存储在栈中,堆中的每一个数据都是隔离的;
每一个class加载到数据共享区,jvm会解析这个类的内容。
-
局部变量
定义:局部变量是定义在方法中或者语句块中属性特点
作用范围:只限于所定义的大括号中(以及自括号内)
存储位置:栈内存中
默认值:无,使用时一定要初始化
生命周期:所属的大括号范围,大括号结束了,局部变量消失,对象引用也消失了
-
成员变量
定义在类中,也可以叫类的属性
除了成员变量其他都是局部变量
属性特点
作用范围:根据权限的修饰符(public private protected default)
存储的位置:堆内存中或者数据共享区(在static中会提到)
默认值:有
生命周期:由jvm垃圾回收机制回收
-
匿名对象
匿名对象没有栈中的变量来引用,所有会被回收,所以匿名对象是没有意义的
new Person();
-
封装
目的:提高数据的安全性,通过封装,可以实现对属性访问权限的控制,同时增加程序的可维护性
封装:将属性私有化,使用private关键字修饰属性,这种属性只有当前类才能访问到
一般每一个私有属性提供公共public的get和set方法供外界访问我们的私有属性
public、private、protected 、default作用范围(子类涉及到继承,后面再说)
同一个类 | 同一个包 | 不同包非子类 | 不同包子类 | |
---|---|---|---|---|
private | 可以访问 | 不可以访问 | 不可以访问 | 不可以访问 |
public | 可以访问 | 可以访问 | 可以访问 | 可以访问 |
protected | 可以访问 | 可以访问 | 不可以访问 | 可以访问 |
default | 可以访问 | 可以访问 | 不可以访问 | 不可以访问 |