数据类型
- java的数据类型只有两大类:8大基本数据类型与引用数据类型。其中基本数据类型又被称为值类型
- 基本数据类型:6种数字类型(byte/short/int/long/float/double)、1种字符型(char)、1种布尔型(boolean)
- 引用数据类型:类(Class)、接口(Interface)、数组(Array)
- 除了以上的基本数据类型和引用数据类型,还有一些其他相关的数据类型,例如字符串类型String、枚举类型Enum,它们都是基于引用数据类型来实现的
- 基本数据类型只能存自己类型的值,无其他额外功能,具体介绍如下第2小节
- 引用类型:参数传递时,以拷贝引用地址的方式传递给接收变量,而非复制整个数据本体。除八大基本数据类型之外的所有数据类型,都为引用数据类型。所有引用数据类型的默认值都为null。
- 为了基本数据类型可以与引用数据类型互相转换、以利用彼此的特性,java为每一种基本数据类型提供了相应的包装类。包装类对基本数据类型进行了封装,提供了丰富的功能,包装类是基本类型的拓展
- 包装类是引用类型的一种,包装类与基本数据类型一一对应,也有8种,分别为:Byte、Short、Integer、Long、Float、Double、Character、Boolean
运算符
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言内置了丰富的运算符,并提供了以下类型的运算符:
流程控制
控制流程(也称为流程控制)是计算机运算领域的用语,意指在程序运行时,个别的指令(或是陈述、子程序)运行或求值的顺序。不论是在声明式编程语言或是函数编程语言中,都有类似的概念。流程控制主要通过选择结构(if、else if、else)、循环结构(for、while、do-while)、以及关键字(break、continue、return)来实现。
if-else:
if (条件表达式1) {
代码块1;
} else if (条件表达式2) {
代码块2;
}
...
}else if (条件表达式n) {
代码块n;
} else {
代码块n+1;
}
swith-case:
switch(变量){
case 值1:
代码块1;
break;
case 值2:
代码块2;
break;
...
default:
代码块n+1;
break;
}
for循环:
for (循环初始化表达式; 循环条件表达式; 循环后的操作表达式){
循环体;
}
while循环:
while(条件表达式){
循环体;
}
do-while循环:
do{
循环体;
}while(条件表达式);
在任何循环的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。而continue只能终止某次循环,继续下次循环。
数组
数组创建方式:
//法一 int[] arr1 = new int[]{1,2,3,4,5}; System.out.println(arr1.length + " " + arr1[2]);
//Arrays.toString(Object[]) 将数组的元素生成字符串,数组的各个元素使用方括号括着 [ ] System.out.println(Arrays.toString(arr1));
//法二 声明、分配空间并赋值 int[] arr2 = {1,2,3,4}; System.out.println(arr2.length + " " + arr2[2]);
//法三 声明数组时指定元素个数,然后赋值。此时所有的元素值均为0 int[] arr3 = new int[4]; System.out.println(arr3.length + " " + arr3[3]);
//法四 声明数组名、开辟空间、赋值 int[] arr4; arr4 = new int[]{0,1,2,3}; System.out.println(arr4.length + " " + arr4[2]);
//创建多维数组 int[][] doubleArr1 = {{1,2,3},{4,5,6},{7,8,9}}; int m = 3, n = 4, q = 5;
int[][] doubleArr2 = new int[m][n]; //其中n可以省略
int[][][] tArr = new int[m][n][q]; //其中n、q可以省略 }
数组排序算法:
冒泡排序:
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
算法描述:
- 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
- 针对所有的元素重复以上的步骤,除了最后一个;
- 重复步骤1~3,直到排序完成。
选择排序:
选择排序是一种简单直观的排序算法,它也是一种交换排序算法,和冒泡排序有一定的相似度,可以认为选择排序是冒泡排序的一种改进。
算法描述:
- 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
- 从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
- 重复第二步,直到所有元素均排序完毕。
插入排序:
插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
算法描述:
- 把待排序的数组分成已排序和未排序两部分,初始的时候把第一个元素认为是已排好序的。
- 从第二个元素开始,在已排好序的子数组中寻找到该元素合适的位置并插入该位置。
- 重复上述过程直到最后一个元素被插入有序子数组中。
Arrays工具类:
static string toString(Type[ ] arr) 按照特定格式将数组转换成字符串;
static boolean equals(Type[ ] arr1,Type[ ] arr2) 比较两个数组的所有内容是否相同;
static void sort (Type[ ] arr) 对数组元素进行排序;
static int binarySearch(Type[ ] arr,Type value)二分法查找某个值在数组中的索引位置。
面向对象的程序设计(基础)
面向对象程序设计
面向对象顾名思义就是把现实中的事务都抽象成为程序设计中的“对象”,其基本思想是一切皆对象,是一种“自下而上”的设计语言,计组件,再完成拼装。
对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
类:类是一个模板,它描述一类对象的行为和状态。
特点:封装、继承、多态。
面向对象三大主要特征
①封装
两层含义:一层含义是把对象的属性和行为看成一个密不可分的整体,将这两者“封装”在一个不可分割的独立单元(即对象)中;另一层含义指“信息隐藏”,把不需要让外界知道的信息隐藏起来,有些对象的属性及行为允许外界用户知道或使用,但不允许更改,而另一些属性或行为,则不允许外界知晓,或只允许使用对象的功能,而尽可能隐藏对象的功能实现细节。
封装的优点
a.良好的封装能够减少耦合,符合程序设计追求“高内聚,低耦合”。
b.类内部的结构可以自由修改。
c.可以对成员变量进行更精确的控制。
d.隐藏信息实现细节。
e.实现Java封装的步骤
1. 修改属性的可见性来限制对属性的访问(一般限制为private),例如:
这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。
2. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:
采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。
封装同时可以提高代码的安全性,例如普通的类属性不是private修饰就直接可以通过“对象名.属性 = xxx”对其赋值,但当我们用private修饰该属性后就不能这样对其做任意的修改了,而且我们还可以在其对外的访问方法中进行合法值校验。比如上例中的setAge()就可以更改为:
②继承
继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
类的继承格式:
class 父类 { }
class 子类 extends 父类 { }
继承的类型:需要注意的是 Java 不支持多继承,但支持多重继承。
static关键字(静态):
static表示静态的意思,既可以修饰成员变量,又可以修饰成员方法,还有一种特殊用法修饰类
(1)、修饰成员变量表示静态变量:static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。static成员变量的初始化顺序按照定义的顺序进行初始化。static不能修饰局部变量。
(2)、修饰成员方法:static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
(3)static代码块:static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
③多态
多态是同一个行为具有多个不同表现形式或形态的能力。
Java语言中含有方法重载与对象多态两种形式的多态:
方法重载:在一个类中,允许多个方法使用同一个名字,但方法的参数不同,完成的功能也不同。
对象多态:子类对象可以与父类对象进行转换,而且根据其使用的子类不同完成的功能也不同(重写父类的方法)。
包
一般来说,定义的类都在包下,当要使用一个类时,需要导入对应的包。
导包代码如下:
import 包名.类名;