基础语法
类:类是一个模板,它可以描述一类对象的行为和状态
对象:对象是类的一个实例,有状态和行为
方法:方法就是行为,一个类中可以有多个方法
注释
单行注释: //
多行注释: /* /
文档注释: /* */
转义字符
\n 换行
\r 回车
\t 水平制表tab
\' 单引号
\" 多引号
\\ 斜杠
java标识符
Java 对各种变量、方法和类等要素命名时使用的字符序列称为标识符
标识符的命名规则:由26个英文字母(A-Z,a-z)大小写,0-9,_或$组成
数字不可以开头,不可以使用关键字和保留字,但可以包含关键字和保留字
java中严格区分大小写,长度无限制,标识符中不能包含空格,起名字时,尽量有意义,“见名知意”
java修饰符
java能用修饰符来修饰类中的方法和属性,通常分为两种:
访问控制修饰符:default,public,protected,private
非访问控制修饰符:final,abstract,static,synchronized
数据类型(Java是强类型语言)
基础类型
整数类型(byte,short,int,long)
浮点型(float,double)
字符型(char)
布尔型(boolean)
引用类型
类(class)
接口(interface)
数组( [ ] )
类型 | 占用存储空间 | 范围 |
---|---|---|
byte | 1字节 | -128~127 |
short | 2字节 | -215~215-1 |
int | 4字节 | -231~231-1 |
long | 8字节 | -263~263-1 |
long型变量在声明时,要加数值末尾+L或l,否则会默认定义成int类型
byte和short类型只要赋值不超出范围,不会默认int
float型变量在声明时,要在数值末尾+F或f,否则会默认认定成double
1byte=8bit
1bit–>0或1
类型转换
自动类型转换
byte–>short–>int–>long–>float–>double
char–>int–>long–>float–>double
强制类型转换
可能会造成数据精度的丢失
&&(逻辑与)和&(短路与)的区别
&&:可能不会判断所有条件
&:一定会判断所有条件
不使用第三方变量,完成对两个整数变量的值进行互换
同一变量跟另一变量异或两次等于自己本身
a = a^b;
b = a^b;
a = a^b;
短路与 && 与短路或 ||
运算式1 && 运算式2
若运算式1已经能够判断整个式子的布尔类型值,那么后面的运算式2将不会被执行
运算式1 || 运算式2
短路或 || 同上
三目运算符
X?Y:Z
判断X是true或false,若X为true,执行Y,若X为false,执行Z
三目运算符必须要有变量运算符接收结果
字符类型
char型数据用来表示通常意义上的“字符”
Java字符采用Unicode编码,每个字符占两个字节,可用Unicode的十六进制编码形式表示
分支结构
顺序结构:按照由上往下的顺序执行代码
选择结构:有选择性的执行或者跳过某段语句
循环结构:反复执行某段特定的代码
分支结构
if(str=='11'){
System.out.println():
}
if(str=='11'){
System.out.println():
}else{
System.out.println('222');
}
多分支结构
if(str=='11'){
System.out.println():
}else if(str=='22'){
System.out.println('111'):
}else{
System.out.println('222');
}
//若if()后不跟大括号,则默认认定后面的一条语句为if控制的语句,后面依旧是顺序结构
// switch 中 可以使 byte short int char String(jdk1.7) 枚举
switch(season){
case "春":
System.out.println("万物复苏");
break;
case "夏":
System.out.println("坐空调屋里吃火锅");
break;
case "秋":
System.out.println("秋天的蚊子比较大");
break;
case "冬":
System.out.println("坐在炕上吃老冰棍");
break;
default:
System.out.println("外星人");
break;
}
数组
数组的特点
1. 只能存储同一种数据类型的数据。
2. 一旦初始化,长度固定。
3. 数组中的元素与元素之间的内存地址是连续的。
二维数组
// 更加推荐第一种写法
int[][] arr ;
int[] arr2[];
int arr3[][];
// 数组在声明的时候 就必须 确定长度
arr = new int[2][3];// 2个一维数组 每个一维数组的长度为 3
arr[0][0] = 5;
arr[0][1] = 5;
arr[0][2] = 5;
arr[1][2] = 8;
arr[1][1] = 8;
arr[1][0] = 8;
可变参数
实质上就是一个长度可变的数组,默认长度为12,若长度大于12,会重新建立一个更大的来存储数据,适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理。
可变参数传值的个数 从0~n
可变参数必须位于最后一项
…跟后面的参数名之间有无空格都可
public void name(String...name) {
}
封装
一是用private把类的细节与外界隔离起来,从而实现数据项和方法的隐藏,而要访问这些数据项和方法唯一的途径就是通过类本身,类才有资格调用它所拥有的资源(方法,数据项属性等等)。所以第一个好处就是数据的安全性提高了。
二是通过隐藏隔离,只允许外部对类做有限的访问,开发者可以自由的改变类的内部实现,而无需修改使用该类的那些程序。只要那些在类外部就能被调用的方法保持其外部特征不变,内部代码就可以自由改变,各取所需,利于分工。
三就是提高了代码的重用性,封装成工具类以后能够减少很多繁琐的步骤。
方法
1.减少重复代码, 提高代码的复用性
2.提高阅读性
3.提高代码的可维护性
当声明的方法内部需要 需要变化的值, 则可以定义参数 , 由调用者给传递者
调用者, 传递的是 实际参数-->实参
方法内部 形式参数-->形参
返回 返回值 要修改3个地方
1. void 要替换成要返回的类型
2. 通过return 将返回值返回
3. 通过变量接受返回结果
要求必须执行到一个return 才可以,否则方法编译报错
结束方法 , 在方法的返回值是void的时候通过return结束方法
方法重载
在同一个类中,方法名相同,参数列表不同
方法重载
在同一个类中,方法名相同,参数列表不同, 与 修饰符 , 返回值类型无关
功能类似,但有细微差别则需要定义成重载关系 传递实际参数, 程序就会自动查找对应的形参列表的方法
参数不同: 形式参数的类型 , 顺序 , 个数 , 与参数名字无关
特殊情况: 如果必须要自动转型.但是可以出现多个同级别的 转换则编译报错. 级别有差异,则选择转换少的方法
面向对象
类和对象
对象是类的实例
类是对象的模板(抽象)
通过类 创建多个对象
类名 对象名 = new 类名();
成员变量 局部变量 区别:
-
声明位置:
成员变量: 类以内,方法以外
局部变量: 方法内部 -
作用域:
成员变量: 在类的内部都能用
局部变量: 方法内部 -
默认值:
成员变量: 有默认值, 即使没有初始化也可以使用
局部变量: 没有默认值, 在使用之前必须初始化 -
内存区域:
成员变量: 内存在堆中
局部变量: 栈中
面向过程:考虑问题时,以一个具体流程为单位,考虑他的实现办法,关心功能实现。
面向对象:考虑问题时,以具体的事物为单位,考虑特征和行为。
面向对象是基于面向过程的。
面向对象的特征:封装、继承、多态、抽象(不是普通意义上的抽象类,是将各类共有的多个方法属性抽离出来的叫抽象)
类:对一类事物的描述,是抽象的、概念上的定义。
对象:是实际存在的该类食物的每个个体,因而也称实例。(Java程序的核心,万事万物皆对象)
类描述了对象的属性和对象的行为,类是对象的模板
封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式
属性的封装: 作用:提高数据的安全性
类的封装:将属性和方法放到类中 方便统一进行管理
方法的封装:减少冗余代码,提高代码的复用性,便于维护,提高阅读性
抽象:将客观存在的事物特征用Java语言描述出来。抽象只关注一个主题中与当前目标有关目标,而忽略与当前目标无关的方面
成员变量(存放在堆里,线程共享,有默认值):
[访问修饰符] 数据类型 成员变量名 [= 初始值]
局部变量(存放在栈里,不共享,没有默认值)
方法的重载:
同一个类中可已定义有想听名字,单参数列表不同的多个方法。调用时会根据不同的参数(参数类型、个数、顺序)选择应对方法
构造方法、普通方法都可以重载
this关键字
this关键字表示本类对象
每个类中的每个静态方法(没有被static修饰)都会隐含一个this引用名称,它会指向这个方法的对象,this可以看作是一个变量,它的值就是当前对象的引用
- 成员变量名与参数名相同时,会产生一定问题: 最小作用域最强,利用this.属性 解决 成员变量和局部变量重名问题
- this可以调用方法, 但是一般不用, 具体调用哪个方法是由实际参数来决定的
- this()调用其他构造方法的是时候,必须放在构造方法的第一行 不能形成闭环
- this()存在的作用: 减少代码的重复, 提高代码的复用性
继承:
特点:子类继承了父类所有非私有属性和方法(不包括构造器),并且可以自己新增属性和方法
优点:提高代码复用,使用extends关键字实现继承,仅支持单继承
super关键字
super 指代的是父类的对象
super() 调用父类的构造方法, 创建子类对象的时候调用父类构造方法可以将父类的属性和方法加载到子类的堆内存, 子类对象就可以调用父类的属性和方法了
super() 如果自己不写,程序会自动的添加, 在子类构造方法的第一行
super.属性 调用的是父类的属性
super.方法 调用父类的方法
注意super和this无法同时出现(super和this都要求在方法的第一行)
构造方法
方法名与类名相同,无返回值
static 修饰符
1。能修饰哪些?
属性
方法
代码块
2. 静态属性方法调用方式
1> 类名。属性和方法
2> 对象名。属性和方法
类加载器将类模板加载到了方法区,并且将静态属性方法 加载到了静态域中
3. 静态域中的对属性和方法是供所有对象使用的 是共享的
只要有一个对象进行了修改, 所有对象都使用修改以后的值
4. 是否所有的属性方法都应该使用静态
1》使用了静态以后, 都是用最后一个修改以后的值, 所有人的值都一致
如果所有值都是相同的结果,则可以考虑用静态的, 减少内存开销
2》 内存方面:
静态属性方法 比对象存在内存时间都要长,所以适当使用静态
频繁使用的功能,可以定义成静态的 可以形成工具类
5.静态代码块
{
}
静态代码块无论创建几个对象 都只会执行一次
构造代码块,会随着对象创建的次数增加 而增加
都比 构造方法执行的早
局部代码块, 是在调用方法的时候才会执行
静态代码块 --》 构造代码块 --》 构造方法 --》 调用的时候才会执行局部代码块
静态代码块: 类似于 注册 数据库的驱动,则可以写到静态代码块中
static 修饰的方法可以被继承无法被重写
我们知道继承和重写是实现多态的途径,而static、final、private修饰的方法
或者属性都是只占有一块内存,而这些关键字修饰的方法都是在编译期绑定(前期绑定)的,还有运行时,编译器就知道调用的是哪个方法了,所以调用的只有父类的方法,因此并不能实现多态,而普通的方法的绑定是在运行时根据对象来决定调用哪个方法,这种重写所带来的的不确定性可以认为成多态。
这个问题的解释大家也可以看看这两位博主的文章,加深理解:
java中的static方法可以被重写吗?(从方法调用过程理解)
static方法不能被重写的原因
属性
private 私有 修饰符 私有属性只能在本类使用,其他类不能使用
方法
设定一个方法专门用来 设置属性 数据永远在想要的范围之内,提高了数据的安全性
set和get方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
final 修饰符: 最终的
1. 能修饰什么?
成员变量
局部变量
方法
类
2. 修饰了之后又什么样的特点
成员变量: 声明的时候必须赋值,只能赋值一次
局部变量: 声明的时候可以不赋值, 只能赋值一次
把final修饰的变量 叫做常量
方法: 最终方法, 只能被继承, 不能被重写
最终类: 只能自己正常使用, 不能被继承
3. 什么时候用
成员变量: 经常final 和 static 连用, 版本号 ,接口 public static final
方法 : 为了保证原有逻辑
最终类: 保证类的原始状态,不能让人修改的时候,类似于String Integer
正常情况下:
1 . 声明final修饰的成员变量的 时候就应该直接赋值
在特殊情况下:
1. 构造代码块 , 赋值一次, 构造方法理则不可以在赋值
2. 直接在构造方法里面赋值, 每一个构造方法里面都必须赋值
public final class Animal {
String name;
final int age ;
// 构造代码块中给 常亮赋值了
{
age = 5;
}
/*public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public Animal(int age) {
this.age = age;
}*/
}