1、昨日复习
1.使用冒泡排序,实现如下的数组从小到大排序。
int[] arr = new int[]{34,5,22,-98,6,-76,0,-3};
for(int i = 0;i < arr.length - 1;i++){
for(int j = 0;j < arr.length - 1 - i;j++){
if(arr[j] > arr[j + 1]){
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
快排时间复杂度:O(nlogn)
冒泡时间复杂度:O(n^2)
堆排序、归并排序
2.如何反转上面的数组。请代码实现
略
- 复制上述数组,得到一个新的数组
vs 赋值操作
array2 = array1;
int[] arr1 = new int[arr.length];
for(;;)…
- 使用线性查找,从上述数组中查找22是否存在。存在,返回所在位置的索引。不存在,输出提示信息。
int dest = 22;
boolean isFlag = true;
for(int i = 0;i < arr.length;i++){
if(dest == arr[i]){
sysout(i);
isFlag = false;
break;
}
}
if(isFlag){
sysout(“未找到”);
}
或
int dest = 22;
for(int i = 0;i < arr.length;i++){
if(dest == arr[i]){
sysout(i);
break;
}
}
if(i == arr.length){
sysout(“未找到”);
}
- 数组中常见的异常有哪些?请举例说明
ArrayIndexOutOfBoundsException:数组角标越界异常:
合理范围:[0,arr.length -1]
越界:arr[-1],arr[arr.length]
NullPointerException:空指针异常
int[] arr = null;
arr[0];
2、面向过程与面向对象
学习面向对象内容的三条主线
1.Java类及类的成员 :属性、方法、构造器;代码块、内部类
2.面向对象的三大特征 :封装性、继承性、多态性、(抽象性)
3.其它关键字:this、super、static、final、abstract、interface、package、import
面向过程(POP) 与 面向对象(OOP)
二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。
2.1 Java语言基本元素:类和对象
类(Class)和对象(Object)是面向对象的核心概念。
类是对一类事物的描述,是抽象的、概念上的定义 。
对象是实际存在的该类事物的每个个体,因而也称为实例(instance)。
属 性:对应类中的成员变量
行 为:对应类中的成员方法
java类的实例化,即创建类的对象
创建对象语法: 类名 对象名 = new 类名();
使用“对象名.对象成员”的方式访问对象成员(包括属性和方法)
2.2 内存解析
2.3 类中属性的使用
属性(成员变量) VS 局部变量
1、相同点:
1.1 定义变量的格式:数据类型 变量名 = 变量值
1.2 先声明,后使用
1.3 变量都有其对应的作用域
2、不同点:
2.1 在类中声明的位置不同
属性:直接定义在类的一对{}内
局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量
2.2 关于权限修饰符
属性:可以在声明属性时,指明其权限,使用权限修饰符
常用的权限修饰符:public、private、缺省、protected
局部变量:不可以使用权限修饰符
2.3 默认初始化值的情况
属性:类的属性,根据其类型,都有默认初始化值。
局部变量:没有默认初始化值意味着我们在调用局部变量之前,一定要显示赋值
特别的:形式参数在调用时,我们赋值即可。
2.4在内存中加载的位置:
属性:加载到堆空间(非static修饰)
局部变量:加载到栈空间
2.4 类中方法的使用
关于权限修饰符:private、public、缺省、protected———封装性细说
返回值类型:有返回值 没有返回值
如果方法有返回值,必须在方法声明时,指定返回值的类型,同时,方法中,需要使用return关键字来返回指定类型的变量或常量。
如果方法没有返回值,则方法声明时,使用void来表示;通常,没有返回值的方法中,就不使用return,但是如果使用的话,只能“return;”表示结束此方法的意思。
我们定义方法该不该有返回值?
题目要求
凭经验,具体问题具体分析
方法名:属于标识符,遵循标识符对的规则和规范,见名知意
形参列表:方法可以声明0个、1个、或多个形参。
格式:数据类型1 形参1,数据类型2 形参2,。。。。
我们定义方法时,该不该定义形参?
题目要求
凭经验,具体问题具体分析
return关键字的作用:
适用范围:使用在方法体中
作用:结束方法
针对于有返回值的方法,使用“return 数据”方法返回所要的数据
注意点:return关键字后面不可以声明执行语句
方法的使用中,可以调用当前类的属性或方法;特殊的:方法1中又调用了方法1,这称为方法的递归;方法中不可以再定义别的方法。
package com.atguigu.text;
/*
* 4. 对象数组题目:
定义类Student,包含三个属性:学号number(int),年级state(int),成绩
score(int)。 创建20个学生对象,学号为1到20,年级和成绩都由随机数确定。
问题一:打印出3年级(state值为3)的学生信息。
问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息
提示:
1) 生成随机数:Math.random(),返回值类型double;
2) 四舍五入取整:Math.round(double d),返回值类型long。
*/
public class Exer4 {
public static void main(String[] args) {
// 创建20个学生对象
Student[] arr = new Student[20];
// 学号为1到20,年级和成绩都由随机数确定。
for (int i = 0; i < arr.length; i++) {
arr[i] = new Student();
arr[i].number = i + 1;
arr[i].state = (int) (Math.random() * 12 + 1);
arr[i].score = (int) (Math.random() * 100);
}
// 打印出3年级(state值为3)的学生信息。
System.out.println("打印出3年级(state值为3)的学生信息。");
for (int i = 0; i < arr.length; i++) {
if (arr[i].state == 3) {
System.out.print("学号:" + arr[i].number + " ");
System.out.println("分数:" + arr[i].score);
}
}
// 使用冒泡排序按学生成绩排序,并遍历所有学生信息
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j].score > arr[j + 1].score) {
Student temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.print("学号:" + arr[i].number + " ");
System.out.print("年级:" + arr[i].state + " ");
System.out.println("成绩:" + arr[i].number);
}
}
}
class Student {
/**
* 学号
*/
int number;
/**
* 年级
*/
int state;
/**
* 成绩
*/
int score;
}