day09_面向对象入门

零、今日内容

一、作业
二、面向对象

一、作业

设计方法,在一个数组中,返回所有的 指定数据的下标
例如, 这个数组[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) 返回

二、面向对象

2.1 介绍

java的基本语法

  • 数据类型 , 变量
  • 各种运算
  • 各种控制(if,循环)
  • 数组

java的核心语法,核心特点,与其他语言不一样的地方,就是: 面向对象编程


什么叫面向过程编程? 代表 C语言

  • 面向过程,即做任何一个功能,要考虑中间的所有细节
  • 例如: 早饭吃一个包子, 以面向过程的话,
    • 考虑面粉怎么揉成面
    • 面又怎么成包子皮
    • 买菜,菜怎么成馅
    • 如何包包子
    • 如何蒸熟
    • 最后吃

什么叫面向对象编程?代表,Java语言

  • 面向对象,即做任何一个功能,要考虑找到一个对象来完成这个功能
  • 例如: 早饭吃一个包子, 以面向对象的话,
    • 找到一个卖包子的老板对象,返回一个包子
    • 老板找到厨师对象,返回一个包子
    • 厨师找到和面工人对象,拌馅工人对象,包包子工人对象
    • 最终总得有人包包子,所以: 面向对象是包含面向过程.

只不过什么区别?

  • 有了面向对象,就可以复用
  • 例如: 换了个饺子店
    • 以前的厨师对象,和面工人对象,拌馅工人对象,包包子工人对象拿来直接使用而不是重新定义

总结:

面向对象就是"专人专职",一个对象完成一个功能,需要完成某个功能,就找到对应的对象,调用他的方法即可

2.2 面向对象编程中的一些概念

面向对象编程 Object-oriented programming,简称OOP

面向对象编程中的一些概念:

  • 属性
  • 方法
  • 对象

什么叫类?

  • 具有相同特征和行为一些列东西的统称,也可以理解为模板,模型
  • 人类,动物类,手机类

什么是属性?

  • 属性就是类的特征
  • 人的姓名,身高,年龄,性别
  • 动物的姓名,年龄,品种
  • 手机的款型,品牌,价格

什么是方法?

  • 方法就是行为,就是完成一件事情的功能.
  • 人的行为: 吃饭,学习,工作
  • 动物的行为: 觅食,迁徙
  • 手机的行为: 打电话,拍照,打游戏

什么叫对象?

  • 对象就是类的具体化,也叫实例化,即是类属性,行为的具体体现
  • 人类的对象: 名字是董宇辉,年龄是35岁,籍贯陕西,能教英语
  • 手机的对象: 品牌是小米,价格是3999,颜色黑色,功能是发烧,打电话,玩游戏

它们之间什么关系?

  • 类中包含属性和方法
  • 对象是由类创建出来的
  • 对象可以使用属性和方法

具体到如何编程?

  • 第一,先定义类
  • 第二,类中定义属性和方法
  • 第三,通过类创建对象
  • 第四,通过对象展现对象的属性和方法

2.3 编程

创建类

  • 类名,要见名知意
  • 创建一个代表人的类,命名 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中也行
    • 只是建议,测试代码单独抽出来执行,因为类 只做定义用,是一个模型
  • 要用对象的属性,方法必须先创建对象

2.4 练习

需求: 目的要指挥一个 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();
    }
}

2.5 类和对象内存关系

  • 编写的是java文件
  • 先编译成class文件
  • 再执行
    • 将class加载到jvm内存

  • 加载到内存的class,不能直接使用,理解为class就像原材料
  • new 就会通过class在堆中真正创建出对象
  • 创建对象的同时: 1) 开辟空间2)分配地址 3)对象的属性会初始化
  • 后续通过对象p,其实是对象的引用,是个地址,来找到对象的属性和方法去使用

day09_面向对象入门_第1张图片

2.6 类可以创建多个对象

类 是一个模板,模型,可以通过类创建出多个对象

  • 每个对象都有属于自己的属性和方法
  • 多个对象之间互不影响
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();
        /**
         * 一个类可以创建多个对象
         * 每个对象都有属于自己的属性和方法
         * 多个对象之间互不影响
         */
    }
}

day09_面向对象入门_第2张图片

2.7 多个引用指向同一个对象

  • 通过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 );
    }

day09_面向对象入门_第3张图片

应用场景: 类当做方法的参数

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 类名();
  • 类创建多个对象,对象和对象之间互不影响,每个对象都有自己的属性和方法

如何使用对象?

  • 属性取值赋值
  • 方法调用

了解创建的内存关系

  • 凡是都会在堆创建对象,开辟空间,有地址值,属性会初始化

了解对象引用传递问题

  • 类是引用类型,引用类型是引用传递,即赋值时赋值的是地址值

知道成员变量和局部变量的写法

你可能感兴趣的:(#,java2401,java,算法,开发语言)