day10_oop
今日内容
零、 复习昨日
一、面向对象的概念
二、面向对象编程
三、内存图
零、 复习昨日
晨考复习…
一、作业
package com.qf.homework;import java.util.Arrays;/* --- 天道酬勤 --- @author QiuShiju* @desc* ----------------* 引用数据类型的默认初始值null*/
public class Homework2 {public static void main(String[] args) {// {1,2,5,8,9}{1,3,0}---->{1,2,5,8,9,1,3,0}int[] arr1 = {1,2,5,2,8,9};int[] arr2= {1,3,1,3,6,7};//int[] arr3 = arrayConcat(arr1, arr2);set(arr1,arr2);}// {1,2,5,8,9}{1,3,0}---->{0,1,2,3,5,8,9}public static void set(int[] arr1,int[] arr2) {int[] arr3 = arrayConcat(arr1, arr2);Arrays.sort(arr3);System.out.println(Arrays.toString(arr3) );// [0, 1, 1, 2, 2, 5, 6, 7, 8, 9]// [0, 1, 2, 5, 6, 7, 8, 9]/* 去重的整体思路* 1 新建一个与原数组一样长度的数组,用来存储去重后的数组* 为什么一样长?* 2 从原数组取值向新数组放,但是如果新数组中有该元素,则不放* 需要记录存入多少个元素* 3 需要再创建一个数组,数组长度是上一步记录的元素个数* 然后从去重数组中拷贝元素到最后的这个数组*/// [0, 1, 1, 2, 2, 5, 6, 7, 8, 9]// arr4用来存储去重后的数组int[] arr4 = new int[arr3.length];int index = 0;// 取原数组中每一个for (int i = 0; i < arr3.length; i++) {boolean flag = false;// 取去重后的数组的每一个for (int j = 0; j < arr4.length; j++) {if (arr3[i] == arr4[j]) {flag = true;}}if (!flag) {arr4[index] = arr3[i];index++;}}System.out.println(Arrays.toString(arr4) );// 创建一个数组,存储去重后,长度合适的数组int[] arr5 = new int[index];System.arraycopy(arr4,0,arr5,0,index);System.out.println(Arrays.toString(arr5) );}// 数组合并// {1,2,5,8,9}{1,3,0}---->{1,2,5,8,9,1,3,0}public static int[] arrayConcat(int[] arr1,int[] arr2) {// 新创建一个数组int[] arr3 = new int[arr1.length + arr2.length];//System.out.println("复制前"+Arrays.toString(arr3) );// 方案1// // 数组拷贝// System.arraycopy(arr1,0,arr3,0,arr1.length);// System.out.println("复制第1个"+Arrays.toString(arr3) );//// System.arraycopy(arr2,0,arr3,arr1.length,arr2.length);// System.out.println("复制第2个"+Arrays.toString(arr3) );// 方案2// for (int i = 0; i < arr1.length; i++) {// arr3[i] = arr1[i];// }// System.out.println("复制第1个"+Arrays.toString(arr3) );//// for (int i = 0; i < arr2.length; i++) {// arr3[arr1.length + i] = arr2[i];// }// System.out.println("复制第2个"+Arrays.toString(arr3) );// 方案3for (int i = 0; i < arr3.length; i++) {if (i < arr1.length){arr3[i] = arr1[i];} else {arr3[i] = arr2[i-arr1.length];}}//System.out.println("复制第2个"+Arrays.toString(arr3) );return arr3;}
}
二、面向对象的概念
2.1 面向对象介绍
C语言 面向过程编程
C++ 半面向过程半面向对象
Java 面向对象编程
面向过程?
把大象装进冰箱,吃烩面
- 面向过程编程,事情每一步骤都要考虑到
举例: 盖房子
面向对象?
- 面向对象编程,只关注事情中的对象,事情由对象去做
- 面向对象编程是在面向过程编程的基础上进行的
举例: 盖别墅:
2.2 面向对象编程的特点
面向对象编程(oop - Object-oriented programming),有三大特点
- 封装
- 继承
- 多态
什么是对象?
对象就是一个实实在在的东西.比如说: 正在使用的电脑,手里的拿的手机,正在讲课老师
对象包含什么?
- 属性, 即特征,描述性的东西,一般名词
- 颜色,价格,款型
- 行为,即动作,对象能做的事情,一般动词
- 电脑能打字,能运行
- 手机能打电话,发短信,玩游戏
对象从哪来的? --> 类
对象是从"模型"中来的,模型即Java中的类.
类是什么?
种类,人以类聚,一类人,…
类: 具体相同的特性和能力对象的集合,相当于是一个模板
总结:
- 类是一个模板,类中定义了属性和方法
- 由类创建出对象
- 对象就是类的具体体现,属性会有具体值,方法能执行
类是模板,类创建出对象
类中有属性有方法, 对象也有属性和方法且会具体体现
三、面向对象编程开发
面向对象编程,主要就是对类 属性 方法和对象的设计和使用
3.1 编写类
以 手机类为例
package com.qf.oop;/* --- 天道酬勤 --- @author QiuShiju* @desc 类中有属性方法* 这些属性和方法也称为成员属性(成员变量)和成员方法*/
public class Phone {/* 属性即变量* 属性定义: [访问修饰符] 数据类型 变量名;* 访问修饰符可写可不写*/String color; // 颜色double price; // 价钱String type; // 型号String brand; // 品牌/* 行为,即方法* 访问修饰符 返回值类型 方法名([参数]){* // return 值;* }*/// 打电话,参数是手机号public void call(String num) {System.out.println("给"+num+"打电话" );}// 玩游戏public void playGame() {System.out.println("玩游戏" );}
}
汽车类
package com.qf.oop;/* --- 天道酬勤 --- @author QiuShiju* @desc 汽车类*/
public class Car {// 成员属性double price;String color;String type;// 成员方法public void run(){System.out.println("开动" );}public void takePeople() {System.out.println("带人" );}public void didi() {System.out.println("didi~~" );}
}
学生类
package com.qf.oop;/* --- 天道酬勤 --- @author QiuShiju* @desc*/
public class Student {String name;int age;char sex;String stuNum;public void study(){System.out.println("学习" );}public void eat() {System.out.println("吃饭" );}
}
3.2 创建&使用对象
对象是由类创建出来的.
语法: 类名 对象名 = new 类名();
// 创建对象// 数据类型 变量 = 值;// int[] 数组名 = new int[3];// 类名 对象名 = new 类名();Phone p1 = new Phone();
创建完对象,使用对象
- 调用属性
- 对象名.属性
- 调用方法
- 对象名.方法名();
/* 使用对象,无非就是使用对象内部的属性和方法* -------------------------------------* 属性就是变量,使用属性就是变量的取值赋值*--------------------------------------* 取出属性值:* 数据类型 变量名 = 对象名.属性名;* 属性赋值:* 对象名.属性名 = 值;*/// 属性取值double price = p1.price;System.out.println(price );// 0.0String brand = p1.brand;System.out.println(brand );// nullString color = p1.color;System.out.println(color );// nullString type = p1.type;System.out.println(type ); // null// 属性赋值p1.brand = "HUAWEI";p1.type = "META50";p1.color = "曜石黑";p1.price = 3980.0;// 再次取值System.out.println(p1.brand);System.out.println(p1.type);System.out.println(p1.color);System.out.println(p1.price);/* 对象使用另外一个操作,就是使用对象的方法* 使用方法就是调用方法让其执行* 语法:* [数据类型 变量名 = ]对象名.方法名([实参]);*/p1.call("110");p1.playGame();
3.3 对象内存图
new 类名();
- 这是在堆内存开辟空间创建对象
- 对象分配地址值
- 对象内部属性和方法进行初始化
- 属性初始化赋值,按照数据类型默认值赋值
- 创建对象完毕,将地址值赋值给对象名
使用对象
- 对象名.属性
使用方法
- 对象.方法();
3.4 类和对象的关系
对象是由类创建出的.
类是模板,通过模板做出无数个对象…
对象和对象之间是独立的,每个对象都会拥有属于自己的属性和方法
public static void main(String[] args) {/* 类是模板,可以创建出多个对象/Phone p1 = new Phone( );System.out.println(p1 );p1.brand = "HUAWEI";p1.type = "P30";p1.color = "翡翠绿";p1.price = 2980.0;System.out.println(p1.brand);System.out.println(p1.type);System.out.println(p1.color);System.out.println(p1.price);Phone p2 = new Phone( );System.out.println(p2 );System.out.println(p2.brand);System.out.println(p2.type);System.out.println(p2.color);System.out.println(p2.price);}
多个引用指向同一个对象
Phone p2 = new Phone( ); // p2指向对象Phone p3 = p2; // 将p2赋值给p3,其实是将地址值赋值p3// p2和p3是同一个地址,指向的是内存的同一个对象p3.price = 3980.0; // p3将对象属性修改System.out.println(p3.price );System.out.println(p2.price );// p2也可以看到属性被修改
四、总结
今天只是面向对象入门,主要在于理解类 属性 方法 对象
类是模板,由类创建出对象
类有两个成员: 成员属性和成员变量
类可以创建出多个对象,每个对象都有属于自己的属性和方法
----------
今天要掌握:
1 根据需求创建类
2 通过类创建对象
3 理解内存关系
附录
concat 合并,拼接
null 空
remove 移除
set 设置,数学/计算机 都要set来代表集合,且其中数据不重复
object 对象
call 打电话,调用
play 玩
game 游戏
brand 品牌
test 测试
text 文本