今日内容
零、 复习昨日
一、面向对象的概念
二、面向对象编程
三、内存图
零、 复习昨日
晨考复习…
一、作业
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) );
// 方案3
for (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.0
String brand = p1.brand;
System.out.println(brand );// null
String color = p1.color;
System.out.println(color );// null
String 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 文本