笔记
课时1 面向对象简介
20180101
面向对象,模块化设计,具备可通用性,可重用
1. 封装性:内部的操作对外部不可见
2. 继承性:继续发展,可以重用设计
3. 多态性:利用这个特性得到良好的设计,可控范围内的状态改变
OOA面向对象分析
OOD面向对象设计
OOP面向对象编程
核心所在--考虑内存分配问题
面向过程,函数式过程,解决问题
20180102
课时2 类和对象(基本定义)
类:引用数据类型,内存分配问题
描述的群体共性特征(比如:人)
对象是一个具体的可以使用概念(比如具体的某个人)
类 ---> 对象
类的组成:方法(操作的行为),属性(变量,描述对象的基本特点)
课时3 类和对象(定义)
class ThisIsAClass {
属性1;
属性2;
方法1() {
方法内容
}
方法2() {
方法内容
}
}
属性可以无限定义,注意每一个方法中的代码不要太长,否则就要考虑重构;
声明并实例化对象
类名称 对象名称 = new 类名称();
分部进行
1. 声明:类名称 对象名称 = null;
2. 实例化: 对象名称 = new 类名称();
引用数据类型,new用于开辟新的堆内存;
性能调优:内存问题
对象只有实例化之后才能使用:
调用类中的属性 对象名称.属性;
调用类中的方法 对象名称.方法名();
课时4 类和对象(对象内存分析)
引用类型
堆内存:保存真正的数据,对象的属性信息
栈内存:保存的堆内存的地址,也就是堆内存的操作权
如果在定义类的时候没有给属性声明默认值,那么属性会采用类型的默认值,比如int是0,String是null
1个栈只能存储1个地址
声明并实例化对象方式:
分步方式:
如果只是声明对象,而不实例化,编译的时候不会报错,运行的时候会报错:NullPointerException
数组,类,接口会出现此类报错
课时5 类和对象(引用传递初次分析)
引用的本质是别名,别名存在栈内存中,1个堆内存可以被多个栈内存所指向(比如同一个人有多个外号,但是其实是指向同一个人)
内存分析(地址一样)
垃圾内存:(没有栈内存指向的堆内存空间,会被GC定期回收) Garbage Collection
课时6 private实现封装处理
面向对象编程有三大特性:封装、继承、多态
对象不能直接 . 操作类的属性
封装可以使用private实现(有其他实现方式,不唯一),只允许本类访问
方法一般不使用private
语法格式:
private 属性;
配置属性使用setter方法(可以对变量做合理判断),获取属性使用getter方法
public class Person {
private String name;
public void setName(String a) {
name = a;
}
public void getName() {
return name;
}
}
public static void main (String[] args) {
Person per = new Person();
per.setName("test");
per.getName();'
}
规范:
类中的所有属性定义都是用private封装,如果需要被外部使用,就定义setter()和getter()方法
课时7 构造方法和匿名函数
实例化对象方式:
类名称 对象名称 = new 类名称();
类名称:任何对象都有其对应的类
对象名称:对象的唯一标记
new:开辟新的堆内存空间
类名称():构造方法
构造方法和类名称一样,无返回值,声明一个类之后就会自动生成一个无参数无返回值的默认构造函数(编译后)
new的时候才调用构造方法
类的组成,属性+普通方法+构造方法
public class Person {
private String name;
public Person() { //默认的构造方法格式
}
public void setName(String a) {
name = a;
}
public void getName() {
return name;
}
}
public static void main (String[] args) {
Person per = new Person();
per.setName("test");
per.getName();'
}
构造方法不能带void修饰符,带有void的命令不标准,
public void Person()
public Person()
对于内中可以自动生成默认构造方法,前提是类中没有定义同名的构造方法
构造方法可以把类中的属性初始化(传入参数的构造方法)
构造方法可以重载(不同参数类型,不同参数个数),注意定义结构,按照参数个数采用升序或者降序排列
定义类的步骤:
1. 写属性
2. 写构造方法
3. 写普通方法
匿名对象:
只有这样定义: new Person();
没有栈空间,使用一次之后就成为垃圾内存
课时8 【第01个代码模型】综合案例:简单Java类
简单java类的开发要求
1. 类的名称有意义,可以明确的描述某一类事物
2. 类中所有的属性使用private封装,并提供setter()/getter()方法
3. 类中必须保留一个无参数的构造方法
4. 类中的所有方法不允许使用System.out方法,输出要在调用处完成
5. 类中应该提供一个返回类完整信息的方法,getInfo()
开发中最多是简单java类
开发原则
课时9 数组的定义和使用(基本概念)
一组相关类型的变量集合,可以按照统一的方式进行操作,是引用类型
数组动态初始化(声明之后,每个数据都为默认值,比如int为0)
1. 声明并开辟空间
数据类型[] 数组名称 = new 数据类型[长度]
或者
数据类型 数组名称[] = new 数据类型[长度]
2. 分部进行(先声明,再实例化)
数据类型[] 数组名称 = null
数组名称 = new 数据类型[长度]
操作方式:
数组的访问通过索引完成,索引从0开始,到数组长度-1
比如int[] data = new int[3],索引为0,1,2
- 数组初始化之后,每个数据都为默认值,比如int为0
- 是一个有序的集合操作,采用循环模式操作
- 数组长度 data.length
课时10 数组的定义与使用(数组引用传递)
int[] data = new int[3];
int[] temp = null;
temp = data;
//temp 和 data指向同一块堆内存
//data的栈内存存的是地址
课时11 数组的定义与使用(数组静态初始化)
数组定义的时候设定内容
语法:
1. 简化格式
数据类型数组名称[] = {value,value,...,value};
2. 建议使用,完整格式,可以使用匿名数组
数据类型 数组名称[] =new 数据类型[] {value,value,...,value};
int data[] = new int[] {1,2,3,4,5,6};
缺陷:长度固定
课时12 数组的定义与使用(二维数组)
行列集合
数组[行索引][列索引]
语法模式和一维一样
int data[][] = new int[][] { {1,2,3},{4,5},{6,7,8,9} };
遍历数组使用2重循环,外部行,内部列
for (int x=0; x < data.length; x++) {
for (int y=0; y < data[x].length; y++) {
System.out.print(data[x][y]);
}
}
//开发过程中出现二维数组的概率不高
课时13 数组的定义与使用(数组与方法的操作)
方法接收数组(参数为数组)
public static void printArray(int temp[]) {
//
}
方法返回数组
public static int[] init() {
return new int[] {1,2,3,4,5};
}
传入数组,返回数组
public static void inc(int arr[]) {
for (int x = 0; x < arr.length; x++) {
arr[x] *= 2;
}
}
课时14 数组的定义与使用(Java对数组的支持)
1. 数组排序(基本数据类型数组),升序
java.util.Arrays.sort(数组名称);
2. 数组拷贝(一个数组的部分内容替换另外一个数组的部分内容),连续替换
System.arraycopy(原数组名称,原数组起点,目标数组名称,目标数组起点);
//逻辑训练,开发用不上
课时15 数组的定义与使用(数组案例:数组数据统计)
数组的线性操作
最大,最小,平均,总和
循环操作模式完成
方法优化
课时16 数组的定义与使用(数组案例:数组排序)
1. 基础排序操作:
冒泡排序:
public class ArrayDemo {
public static void main(String[] args){
int score[] = {67, 69, 75, 87, 89, 90, 99, 100};
for (int i = 0; i < score.length -1; i++){ //最多做n-1趟排序
for(int j = 0 ;j < score.length - i - 1; j++){ //对当前无序区间score[0......length-i-1]进行排序(j的范围很关键,这个范围是在逐步缩小的)
if(score[j] < score[j + 1]){ //把小的值交换到后面
int temp = score[j];
score[j] = score[j + 1];
score[j + 1] = temp;
}
}
System.out.print("第" + (i + 1) + "次排序结果:");
for(int a = 0; a < score.length; a++){
System.out.print(score[a] + "\t");
}
System.out.println("");
}
System.out.print("最终排序结果:");
for(int a = 0; a < score.length; a++){
System.out.print(score[a] + "\t");
}
}
}
课时17 数组的定义与使用
课时18 数组的定义与使用
课时19 数组的定义与使用