今日战果:面向对象编程概念

一、面向对象概念

面向对象编程: OOP(Object Oriented Programming)

C语言: 面向过程编程语言

C++语言: 半面向过程半面向对象

Java语言: 完全面向对象编程

什么是面向

是指针对,关于的意思

什么面向过程

针对过程设计代码

  • 举例: 玩五子棋游戏,吃饭
  • 设计棋盘,设计规则,设计棋手,判断胜负
  • 面粉,和面,做面条,做羊肉,下锅,放料,吃
什么是面向对象

针对对象设计代码

  • 设计棋盘对象, 设计棋手对象
  • 设计厨师对象

总结

面向对象编程:针对对象设计代码,不去过多的考虑细节

面向对象最后,肯定是有面向过程的

二、如何面向对象编程

用类

类的概念

class

  • 类是一个统称,是一系列具有相同特征和行为的对象的集合
  • 人类,手机类
类的特征: 即属性
  • 属性就是描述类的
  • 人类的特征(属性)
    • 姓名 性别 身高 体重 年龄 国籍 肤色
  • 手机类的特征(属性)
    • 品牌 价格 颜色 内存 电池容量
类的行为: 即动作
  • 动作就是功能,即函数.方法
  • 人类的方法(功能,动作)
    • 吃饭,睡觉,工作,学习
  • 手机类的方法(功能,动作)
    • 打电话,发短信,玩游戏,砸核头

对象:

  • 是类的具体体现
  • 人类的对象
    • 现在的同桌
  • 手机类的对象
    • 手里的手机
类,属性,方法,对象 之间的关系
  • 类里面有属性和方法
  • 对象是类创建出来的
  • 对象中拥有具体的属性,能执行的方法

三、创建一个类: 人类

创建一个空类
  • 类名 见名知意
  • 首字母大写,不要特殊符号,数字不要放开头
public class People{
    //空类
}
创建类中的属性和方法
  • 属性,就是变量,使用 数据类型 属性名;
  • 位置: 放在类中,方法外
  • 方法,就是之前的方法(返回值,方法名,参数)
public class People{
    int age;// 年龄属性
    String name;// 姓名属性
    
    // 吃饭的方法
    public void eat(String food){
        System.out.println("吃"+food);
    }
}

四、如何创建对象并使用

有了类如何创建对象呢?

创建一个对象

语法

  • 类名 对象名 = new 类名();
public class Test1OOP {

    // 执行代码
    public static void main(String[] args) {
        // 创建对象的语法
        // 类名 对象名 = new 类名();
        People people = new People( );
    }
}
为什么创建对象?
  • 因为类是模板,无法使用,需要创建出对象,才能具体体现出属性,以及执行方法
  • 即创建对象的目的是为了使用属性和方法
如何使用对象中的属性和方法

使用属性

		/**
         * 对象属性操作,
         * 1) 取出属性值
         *    对象名.属性
         * 2) 给属性赋值
         *    对象名.属性 = 值;
         * -------------------
         * 刚刚新建的对象,属性也是有值的,是默认值
         */
        // 属性取值
        String name = people.name;
        int age = people.age;
        String sex = people.sex;
        System.out.println("name = " + name);
        System.out.println("age = " + age);
        System.out.println("sex = " + sex);

        // 属性赋值
        people.name = "刘备";
        people.age = 38;
        people.sex = "男";

        // 再次取值查看属性
        System.out.println(people.name);
        System.out.println(people.age);
        System.out.println(people.sex);

使用方法

		/**
         * 对象可以使用方法,即调用方法
         *  数据类型 变量 = 对象名.方法(参数);
         */
        people.eat("烩面");

        String result = people.sleep( );
        System.out.println("睡得如何? " + result );

完整代码

public class Test1OOP {

    // 执行代码
    public static void main(String[] args) {
        // 创建对象的语法
        // 类名 对象名 = new 类名();
        People people = new People( );

        /**
         * 创建出对象,就可以使用属性和方法
         */
        //==============================================
        /**
         * 对象属性操作,
         * 1) 取出属性值
         *    对象名.属性
         * 2) 给属性赋值
         *    对象名.属性 = 值;
         * -------------------
         * 刚刚新建的对象,属性也是有值的,是默认值
         */
        // 属性取值
        String name = people.name;
        int age = people.age;
        String sex = people.sex;
        System.out.println("name = " + name);
        System.out.println("age = " + age);
        System.out.println("sex = " + sex);

        // 属性赋值
        people.name = "刘备";
        people.age = 38;
        people.sex = "男";

        // 再次取值查看属性
        System.out.println(people.name);
        System.out.println(people.age);
        System.out.println(people.sex);

        //==============================================
        /**
         * 对象可以使用方法,即调用方法
         *  数据类型 变量 = 对象名.方法(参数);
         */
        people.eat("烩面");

        String result = people.sleep( );
        System.out.println("睡得如何? " + result );
    }
}
类可以创建多个对象
  • 一个类是可以创建多个对象
  • 由类创建出的每个对象中都有属于自己的属性和方法
  • 对象和对象之间的属性和方法互不影响
    public static void main(String[] args) {
        People p1 = new People( );
        p1.name = "刘备";
        System.out.println(p1.name );// 刘备

        People p2 = new People( );
        System.out.println(p2.name );// null
		p2.age = 40;
        
        People p3 = new People( );
        System.out.println(p3.name );// null
        System.out.println(p3.age );// 0
    }
内存图

image-20240523145453225

多个引用指向同一对象

引用其实就是地址值

通过地址值引用内存中的对象

通过引用传递,将引用地址值赋值给了另外一个变量p2

即p1和p2指向同一个对象

    public static void main(String[] args) {
        People p1 = new People( );
        p1.name = "刘皇叔";

        People p2 = p1;

        System.out.println(p2.name);// 皇叔
        p2.age = 40;

        System.out.println(p1.age );// 40
    }

五、内存图

创建一个对象的内存图
  • 方法执行进栈
  • 每次new都会进堆,开辟空间,分配地址值

创建对象时,属性会初始化

image-20240523144445469

创建多个对象图
  • 一个类是可以创建多个对象
  • 由类创建出的每个对象中都有属于自己的属性和方法
  • 对象和对象之间的属性和方法互不影响

image-20240523145543513

多个引用指向同一个对象

image-20240523150448477

六、成员变量和局部变量

成员变量局部变量
位置类中方法外方法内
使用范围类中所有方法都可使用只能在当前方法内使用
初始值在new的时候自动赋默认值手动主动赋值
内存位置在堆中在栈中的方法栈帧中
生命周期随着创建对象出现在堆中
随着使用引用被垃圾回收而消失
随着方法被调用而进栈出现
随着方法执行完弹栈而消失
特殊情况: 成员变量和局部变量会重名
  • 允许成员变量和局部变量重名
  • 重名时默认使用局部变量, (就近原则)
    • 因为成员变量在堆中,局部变量在方法栈帧,方便调用
  • 当重名时,可以使用this.属性来特指调用成员变量

七、构造方法

什么是构造方法?

构造方法,又称构造函数,又称构造器(constructor)

作用:
  • 用来构造/创建对象
  • 属性赋初始值
    • 无参构造属性初始化默认值
    • 有参构造属性初始化指定值
怎么写?

构造方法,虽然是方法,但是与之前的方法有些区别

  • 构造方法没有返回值,连void也没有

  • 方法名必须是当前类的类名

    public class People{
        // 构造方法
        public People(){
    
        }
        // 普通方法
        public void eat(){
    
        }
    }
    
如何用?

构造方法的作用是创建对象,当然要在创建对象时使用

语法
  • 类名 对象名 = new 类名();
  • 类名 对象名 = new 构造方法();
  • 类名 对象名 = new 构造方法(参数1,参数2);

构造方法特点

  • 每个类默认都有一个无参构造方法,默认是隐藏的
  • 也可以显式的写出
  • 但是,显式的写出任何一个构造方法,默认的构造方法不再提供

有参构造

但是现在有个问题,通过构造方法创建出的对象的属性都是默认初始值,后续还要自己再单独给属性赋上指定值; 那么能不能像创建数组一样,在创建对象时,直接指定属性,即创建出来的对象属性就有指定值

—> 当然可以,那就是 有参构造方法

有参构造就是有参数的构造方法,目的就是在创建对象时可以指定属性

语法

public People(int age){
 this.age = age;
}

有参无参构造的区别

有参构造,无参构造都是为了创建对象

  • 无参构造创建出的对象,属性值是默认值
  • 有参构造创建出的对象,属性值是指定的

八、重载

重载,overload

什么是重载

重载就是在同一类内,方法名一样,参数列表不一样的多个方法

参数列表一样是指,参数的个数,类型,顺序任意不一样都是

重载和返回值没有关系


public class Test2OOP {

    public static void main(String[] args) {

        /**
         * 以下这几个方法就是重载
         *   方法名一样,参数列表不一样
         * 好处/作用:
         *  同一方法名,传入不同的参数,都能执行
         *  使用方便
         *根据传入的参数类型,自动找到对应的方法执行
         */
        System.out.println( );
        System.out.println(1);
        System.out.println(1.1);
        System.out.println("A");
        System.out.println(new People( ));
        System.out.println(new int[3]);

        // =========多个构造方法也是重载关系============
        new People( );
        new People(19, "关羽");
        new People(19);
        new People("黄盖");
        new People("黄盖",50);
    }

    /**
     * 以下几个都是重载
     * 他们的方法名一样,参数的个数,类型,顺序任意不一样都是重载
     * 与返回值类没有关系
     */
    public static void test() {
    }

    public static void test(int a) {
    }

    public static void test(String a) {
    }

    public static void test(int b, String a) {
    }

    public static void test(String a, int b) {
    }
}

最后

如果感觉有收获的话,点个赞 👍🏻 吧。
❤️❤️❤️本人菜鸟修行期,如有错误,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍在这里插入图片描述

  • 27
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值