一、作业
二、面向对象
设计方法,在一个数组中,返回所有的 指定数据的下标
例如, 这个数组[1,2,8,4,5,7,8,7,8,9],找到其中元素8的下标[2,6,8]
public static int[] findAllIndexByElement(int[] arr,int e){
// TODO
retrun null;
}
思路:
1) 以结果为目标,即需要再来一个数组装下标
2) 这个装下标的数组多大? 最大就是原数组长度
3) 遍历原数组,判断是否与指定元素相等
4) 如果相等,记录该元素下标,存到新数组
5) 注意存储到新元素的下标位置
6) 等遍历完,找到所有该元素下标,且存储到新数组中
7) 要根据存储的个数,重新创建更小的数组,拷贝
8) 返回
java的基本语法
- 数据类型 , 变量
- 各种运算
- 各种控制(if,循环)
- 数组
java的核心语法,核心特点,与其他语言不一样的地方,就是: 面向对象编程
什么叫面向过程编程? 代表 C语言
- 面向过程,即做任何一个功能,要考虑中间的所有细节
- 例如: 早饭吃一个包子, 以面向过程的话,
- 考虑面粉怎么揉成面
- 面又怎么成包子皮
- 买菜,菜怎么成馅
- 如何包包子
- 如何蒸熟
- 最后吃
什么叫面向对象编程?代表,Java语言
- 面向对象,即做任何一个功能,要考虑找到一个对象来完成这个功能
- 例如: 早饭吃一个包子, 以面向对象的话,
- 找到一个卖包子的老板对象,返回一个包子
- 老板找到厨师对象,返回一个包子
- 厨师找到和面工人对象,拌馅工人对象,包包子工人对象
- 最终总得有人包包子,所以: 面向对象是包含面向过程.
只不过什么区别?
- 有了面向对象,就可以复用
- 例如: 换了个饺子店
- 以前的厨师对象,和面工人对象,拌馅工人对象,包包子工人对象拿来直接使用而不是重新定义
总结:
面向对象就是"专人专职",一个对象完成一个功能,需要完成某个功能,就找到对应的对象,调用他的方法即可
面向对象编程 Object-oriented programming,简称OOP
面向对象编程中的一些概念:
- 类
- 属性
- 方法
- 对象
什么叫类?
- 具有相同特征和行为一些列东西的统称,也可以理解为模板,模型
- 人类,动物类,手机类
什么是属性?
- 属性就是类的特征
- 人的姓名,身高,年龄,性别
- 动物的姓名,年龄,品种
- 手机的款型,品牌,价格
什么是方法?
- 方法就是行为,就是完成一件事情的功能.
- 人的行为: 吃饭,学习,工作
- 动物的行为: 觅食,迁徙
- 手机的行为: 打电话,拍照,打游戏
什么叫对象?
- 对象就是类的具体化,也叫实例化,即是类属性,行为的具体体现
- 人类的对象: 名字是董宇辉,年龄是35岁,籍贯陕西,能教英语
- 手机的对象: 品牌是小米,价格是3999,颜色黑色,功能是发烧,打电话,玩游戏
它们之间什么关系?
- 类中包含属性和方法
- 对象是由类创建出来的
- 对象可以使用属性和方法
具体到如何编程?
- 第一,先定义类
- 第二,类中定义属性和方法
- 第三,通过类创建对象
- 第四,通过对象展现对象的属性和方法
创建类
- 类名,要见名知意
- 创建一个代表人的类,命名 People
public class People {
}
类中定义属性和方法
public class People {
/**
* 属性就是变量,写法
* 访问修饰符 数据类型 属性名;
* ps: 访问修饰符,可写可不写,如果写暂时先写public
* 位置: 写在类中方法外
*/
public String name;// 姓名
int age; // 年龄
double height; // 身高
// ...还可以定义多个属性
/**
* 行为就是方法,写法与之前基本一样,
* 但是现在不定义static
*/
// 吃饭
public void eat(){
System.out.println("吃饭" );
}
// 工作
public String work(int hour){
System.out.println("工作"+hour+"小时" );
return "完成";
}
}
创建对象
- 通过类创建对象
- 类名 对象名 = new 类名();
- 对象名,其实就是变量
public class Test1_oop {
public static void main(String[] args) {
// 创建对象
// 类名 对象名 = new 类名();
People people = new People();
}
}
创建完对象,就可以使用对象
- 使用对象的属性
- 属性取值
- 数据类型 变量 = 对象名.属性;
- 属性赋值
- 对象名.属性 = 值;
- 使用对象的方法
- 对象.方法名();
public static void main(String[] args) {
// 创建对象
// 类名 对象名 = new 类名();
People people = new People();
/**
* 调用对象的属性:
* 对象名.属性;
* ---------------------
* 1) 取出属性值
* 数据类型 变量 = 对象名.属性;
* 2) 属性赋值
* 对象名.属性 = 值;
*/
String name = people.name;
int age = people.age;
double height = people.height;
System.out.println("name = " + name);// null
System.out.println("age = " + age);// 0
System.out.println("height = " + height);//0.0
people.name = "小张";
people.age = 85;
people.height = 180.1;
// String name1 = people.name;
System.out.println("name = " + people.name);// 小张
System.out.println("age = " + people.age);// 85
System.out.println("height = " + people.height);//180.1
/**
* 调用对象的方法
* 对象.方法名();
* ps: 方法有参数就传入实参,有返回值就接收
*/
people.eat();
String result = people.work(8);
System.out.println("工作结果: " + result );
}
练习时发现的问题:
注意事项
属性定义是数据类型 属性名;后面是可以给值的,比如
public class People { public String name;// 可以 public int age = 18;// 也可以 // 区别是,属性不定义值,创建出的对象属性有默认值 0.0,0,null这些 // 属性定义值,创建出对象,属性就是指定的默认值 }
代表一个实体的类,定义方法时建议是不加static,后续再解释
测试创建对象的代码,必须创建测试类? 并不是
- 也可以将main方法定义在People中也行
- 只是建议,测试代码单独抽出来执行,因为类 只做定义用,是一个模型
要用对象的属性,方法必须先创建对象
需求: 目的要指挥一个 LOL中英雄人物做事情
即需要 定义英雄类,类中定义英雄属性(血量hp,等级lv,名称name) 定义英雄的行为(攻击,偷塔,送人头)
// 先定义类
public class Hero {
int hp;// 血量
int lv;// 等级 level
String name;
public void attack(){
System.out.println("在攻击...");
}
public void breakTower(){
System.out.println("在拆塔...");
}
}
// 再创建对象
public class Test2{
public static void main(String[] args){
Hero hero = new Hero();// 创建对象
}
}
// 使用属性,调用方法
public class Test2{
public static void main(String[] args){
Hero hero = new Hero();
hero.name = "托儿索";
hero.hp = 100;
hero.lv = 6;
hero.attack();
hero.breakTower();
}
}
- 编写的是java文件
- 先编译成class文件
- 再执行
- 将class加载到jvm内存
- 加载到内存的class,不能直接使用,理解为class就像原材料
- new 就会通过class在堆中真正创建出对象
- 创建对象的同时: 1) 开辟空间2)分配地址 3)对象的属性会初始化
- 后续通过对象p,其实是对象的引用,是个地址,来找到对象的属性和方法去使用
类 是一个模板,模型,可以通过类创建出多个对象
- 每个对象都有属于自己的属性和方法
- 多个对象之间互不影响
package com.qf.oop;
/**
* --- 天道酬勤 ---
*
* @author QiuShiju
* @date 2024/1/25
* @desc 测试创建多个对象
*/
public class Test2_oop {
public static void main(String[] args) {
// 创建一个对象
People p1 = new People( );
p1.name = "李龙";
p1.age = 18;
p1.height = 190.0;
System.out.println(p1.name);
System.out.println(p1.age);
System.out.println(p1.height);
p1.work(996);
System.out.println("--------------" );
People p2 = new People( );
p2.name = "振龙";
p2.height = 191.2;
p2.age = 18;
System.out.println(p2.name);
System.out.println(p2.age);
System.out.println(p2.height);
p2.eat();
/**
* 一个类可以创建多个对象
* 每个对象都有属于自己的属性和方法
* 多个对象之间互不影响
*/
}
}
- 通过new创建出来的真正的对象,在哪? 在堆中
- 在代码中使用的那个对象名或者变量名,其实是引用,引用的堆中的对象
public static void main(String[] args) {
People p1 = new People( );
People p2 = p1;// 引用传递,是将地址值赋值给p2
// p1和p2指向同一个对象
p1.name = "凌霄";
System.out.println(p1.name );
p2.name = "小宋";
System.out.println(p2.name);
System.out.println("---------------" );
System.out.println(p1.name );
}
应用场景: 类当做方法的参数
package com.qf.oop;
/**
* --- 天道酬勤 ---
*
* @author QiuShiju
* @date 2024/1/25
* @desc 多个引用指向同一个对象
*/
public class Test3_oop {
public static void main(String[] args) {
People p3 = new People( );
p3.name = "振龙";
changePeople(p3);
System.out.println(p3.name );// 帅气的振龙
}
/**
* 方法的参数列表是类名,调用时传入该类的对象
* 其实就是 引用传递
*/
public static void changePeople(People p){// People p = p3
p.name = "帅气的" + p.name;
}
}
成员变量(属性) | 局部变量 | |
---|---|---|
位置 | 类中方法外 | 方法内 |
使用范围 | 类中所有方法都能用 | 当前一个方法用 |
初始值 | 在创建对象时会有默认赋值 | 必须我们主动赋值 |
内存位置 | 随着创建对象,进堆,在堆中出现 | 随着方法进栈,栈中出现 |
public class Phone {
/**
* 成员变量,即属性
* 类中定义成员变量,类中所有方法可以直接使用
*/
double price;// 价钱
String color;// 颜色
String brand;// 品牌
/**
* 方法中定义的变量,称为局部变量
* 局部变量只能当前方法内部使用
*
* num是局部变量
*/
public void call(String num){
int a = 1;
System.out.println(a );
System.out.println("一个"+brand+",颜色:"+color+",价钱:"+price+"的手机,给"+num+"打电话" );
}
public void play(String game){
// game是局部变量
// brand是成员变量
System.out.println(brand+"玩"+game+"游戏" );
}
}
掌握如何定义类
- 类中有成员变量
- 类中有成员方法
掌握创建对象
- 类名 对象名 = new 类名();
- 类创建多个对象,对象和对象之间互不影响,每个对象都有自己的属性和方法
如何使用对象?
- 属性取值赋值
- 方法调用
了解创建的内存关系
- 凡是都会在堆创建对象,开辟空间,有地址值,属性会初始化
了解对象引用传递问题
- 类是引用类型,引用类型是引用传递,即赋值时赋值的是地址值
知道成员变量和局部变量的写法