day11_面向对象

今日内容

零、 复习昨日
一、作业
二、局部变量&成员变量
三、this关键字
四、构造方法
五、重载

零、 复习昨日

晨考


public class Phone {
    // 成员属性/成员变量
    // 数据类型 变量名;
    double price;
    String brand;
    
    // 成员方法
    public void call(String num) {
        System.out.println("给xxx打电话");
    }
}
public static void main(String[] args) {
    // 创建对象
    // 类名 对象名 = new 类名();
    Phone p = new Phone();
    p.price = 100.0;
}

对象创建时,内存过程

  • 一旦执行new Phone();
  • 会在堆中开辟空间
  • 属性初始化,方法初始化
  • 对象分配地址,地址赋值给对象引用

一、作业

二、成员变量&局部变量

以学生类为例演示: 属性 年龄和姓名 方法 学习和睡觉

package com.qf.oop;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc
 */
public class Student {

    /**
     * 成员变量
     * 1 类中方法外
     * 2 声明完,可以在方法内直接使用
     * 3 在创建对象时成员变量被初始化
     * 4 生命周期: 创建对象时出现,当对象失去引用后被GC机制回收
     * 5 成员变量在堆
     */
    String name;
    int age;

    /**
     * 局部变量
     * 1 方法签名中,和方法体内
     * 2 声明完局部变量,必须手动赋初始值
     * 3 局部变量是方法进栈时完成初始化
     * 4 局部变量生命周期: 随着方法进栈而出现,方法执行完弹栈而消失
     * 5 局部变量在栈
     */
    public void study(int hours) {
        System.out.println(name );// 使用成员变量
        // 定义局部变量
        int a = 1;
        System.out.println(a ); // 使用局部变量
        System.out.println("学生学习,学了"+hours+"小时" );
    }

    public void sleep() {
        System.out.println("学生睡觉" );
    }
}
不同点成员变量局部变量
位置不一样
使用前初始值不一样
初始化时机
生命周期
内存位置

image-20230410103554173

为什么成员变量使用前,没见到赋值动作,还能使用呢?

  • 答案: 任何变量使用前都要有初始值
    • 在new 对象时,堆内存空间会给属性初始化
    • 此时属性已经被赋值
    • 等到对象调用方法执行时,成员变量已经被赋值了

总结:(掌握的程度)

  • 分清楚哪是成员变量哪是局部变量
  • 搞清楚变量初始值使用上的不同
  • 其余: 内存位置,初始值时机,生命周期等熟悉即可

三、this关键字

this

  • 单词是 这个
  • 代表当前对象
  • 代表的是调用这个方法的当前对象
  • 即谁调用这个方法,this就是谁

image-20230410111817606

image-20230410112724707

package com.qf.oop;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc this关键词
 */
public class Phone {

    String color;
    double price;

    public void call(String num) {
        /**
         * 当成员变量和局部变量重名时:
         * 1 就近原则,自己方法内有就用自己的
         * 2 即如果不重名,那就只能使用成员变量
         * ----------------------------------
         * this 是这个的意思,即这个当前对象
         */
        String color = "黑色";// 局部变量
        System.out.println("this --> "+this );
        System.out.println("这个手机什么颜色? " + color );
        /**
         * 当前成员变量和局部变量重名时,但是还要使用成员变量
         * 此时就必须使用this来说明,调用的就是对象的成员变量
         */
        System.out.println("这个手机什么颜色? " + this.color );
        // this就是当前对象,可以调用属性和方法
        this.play();
        System.out.println("给"+num+"打电话" );
    }

    public void play(){
    }
}

总结:

  • this就是当前对象
  • this可以调用对象的属性和方法
  • 什么时候用到this呢? 只有当局部变量和成名变量重名时使用!!!
    • 即使用this来区别一下

四、构造方法[重要]

4.1 构造方法/构造函数/构造器/constructor

是什么? 是个方法,但是有点特殊…(后续解密)

干什么的? 构造方法: 用来创建对象的方法,即构造是构造出一个对象

怎么干的? 类名 对象名 = new 类名(); --> 类名 对象名 = new 构造方法();

在哪? 每个类中都有,默认是隐藏的,也可以显式写出

构造方法语法:

public 类名([参数]){}

构造方法的特点

  • 构造方法是方法,但是没有返回值类型,也没有void
  • 方法名也很特殊,当前类的类名,首字母大写的
  • 构造方法参数列表可以添加参数的
  • 只能通过new 来调用

image-20230410151912924

4.2 对象创建过程

构造方法用来创建对象.那么调用构造方法创建对象的过程是怎么样?

Car car = new Car();

  • 调用Car(),即调用Car类的无参构造方法
  • 内存中开辟空间,属性初始化
  • 再执行构造方法内的代码
  • 地址值赋值给引用

4.3 有参构造

为什么要有有参构造?

因为无参构造创建出的对象属性都是默认值(null,0,0.0)这些,使用时还需再单独赋值,比较麻烦. 所以才有了有参构造,可以创建出对象,属性就有指定值;

package com.qf.oop;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc 构造方法
 */
public class Car {

    String brand;
    double price;

    // 无参构造
    public Car(){
        System.out.println("Car()执行了" );
    }
    
    // 有参数的构造方法
    public Car(String brand,double price) {
        this.brand = brand;// 局部变量给成员变量赋值
        this.price = price;
    }

    public void run(){
        System.out.println("跑到" );
    }
}
public static void main(String[] args){
    // 类名 对象名 = new 构造方法();
        Car car = new Car();
        System.out.println(car.brand);
        System.out.println(car.price);
        /**
         * 无参构造创建出的对象中属性值: 默认值
         * 使用时还需再赋值?
         * 有没有创建出对象就有指定的属性值? --> 有参构造
         */

        Car  car2 = new Car("东风",280000);
        System.out.println(car2.brand );
        System.out.println(car2.price );

        Car  car3 = new Car("解放",180000);
        System.out.println(car3.brand );
        System.out.println(car3.price );
        /**
         * 有参构造创建出的对象属性都是指定值
         * 作用是什么? 为了方便创建对象
         */
}

总结: 无论是有参构造还是无参构造,都是用来创建对象. 用哪个创建对象都可以,只不过无参创建出的对象属性都是默认值,有参构造创建出的对象属性都是指定值

image-20230410161311122

4.4 语法总结

  • 构造方法写在类中
  • 没有返回值类型,也没有void
  • 方法名一定是类名
  • 可以有参数,可以无参数
  • 构造方法只能通过new来调用
  • 每个类都默认隐藏一个无参构造
  • 但是类中显式写出任何一种构造方法,隐式不再提供
  • 因此我们建议,有参无参构造要同时给出
学完构造方法,你要会什么?
1 理解什么是构造方法,用来干什么,怎么写的,写在哪里
2 对比有参无参构造的区别
3 [重要] 熟练的使用有参无参构造创建对象
4 [熟知] 有参无参创建出的对象有什么不一样

五、重载

重载(Overload)

  • 重载是指一个类中多个方法之间的关系叫重载
  • 具体点: 这些方法 方法名一样,参数列表不一样的关系叫做重载
  • 参数列表不一样
    • 参数的个数,类型,顺序任何不一样都是不一样
package com.qf.oop;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc
 */
public class Dog {
    public String name;
    public int age;

    // 这些构造方法是重载关系
    public Dog() {
    }
    public Dog(String name) {
        this.name = name;
    }

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

    public Dog(String name,int age) {
        this.name = name;
        this.age = age;
    }

    public Dog(int age,String name) {
        this.name = name;
        this.age = age;
    }
}
        new Dog();
        new Dog(2,"");
        new Dog(2);
       /**
         * 这些方法都是重载,主要目的就是方便调用.
         * 根据传入的参数类型,来确定执行哪个方法
         */
        System.out.println( );
        System.out.println(1);
        System.out.println(1.1);
        System.out.println("zzzz");

六、复习

由类创建对象: Car car = new Car(); Dog dog = new Dog(); Tiger tiger = new Tiger();

创建出的对象,对象内部有什么

  • 属性
  • 方法

使用对象,使用对象的什么东西?

  • 使用属性
    • 取值 数据类型 变量名 = 对象.属性;
    • 赋值 对象.属性 = 值;
  • 使用方法
    • 对象.方法();

七、作业

工人类

package com.qf.oop;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc 引用数据类型: 数组,类,接口
 */
public class Worker {
    String name;// 姓名
    int age;// 年龄
    double salary;// 薪水
    Address addr;

    // 无参构造
    public Worker(){}

    // 有参构造
    public Worker(String name,int age,double salary) {
        this.salary = salary;
        this.age = age;
        this.name = name;
    }

    // 工作的方法
    public void work() {
        System.out.println("工作" );
    }

    public void work(int hours) {
        System.out.println("工作"+hours+"小时" );
    }

    public static void main(String[] args) {
        Worker w1 = new Worker( );
        w1.salary = 1000;
        w1.name = "张三";
        w1.age = 19;

        System.out.println(w1.salary );
        System.out.println(w1.name );
        System.out.println(w1.age );

        w1.work();
        w1.work(10);

        Worker w2 = new Worker("李四", 20, 2000);
        System.out.println(w2.salary );
        System.out.println(w2.name );
        System.out.println(w2.age );
        w2.work();
        w2.work(8);
        // --------------------
        Worker w3 = new Worker();
        w3.name = "王五";
        w3.age = 25;
        w3.salary = 2500.1;

        // 因为addr的数据类型是Address类型
        w3.addr = new Address();
        // System.out.println(w3.addr );
        w3.addr.zipCode = "100086";
        w3.addr.address = "郑州航海路60号";

        System.out.println(w3.name );
        System.out.println(w3.age );
        System.out.println(w3.salary );
        System.out.println(w3.addr.address );
        System.out.println(w3.addr.zipCode );
    }
}

地址类

public class Address {
    String address;// 地址
    String zipCode;// 邮编

    public Address(){}
    public Address(String address,String zipCode){
        this.address = address;
        this.zipCode = zipCode;
    }
}

附录

student 学生
sleep 睡觉
eat 吃
study 学习
method signature 方法签名
方法签名主要是方法的定义,即不包含方法体的那一部分
public void study(int hours)
might 可能
salary 薪水
NullPointerException 空指针异常,空指针就是空引用就是空
public class Address {
    String address;// 地址
    String zipCode;// 邮编

    public Address(){}
    public Address(String address,String zipCode){
        this.address = address;
        this.zipCode = zipCode;
    }
}

[外链图片转存中…(img-vJnyYmni-1681206567135)]

附录

student 学生
sleep 睡觉
eat 吃
study 学习
method signature 方法签名
方法签名主要是方法的定义,即不包含方法体的那一部分
public void study(int hours)
might 可能
salary 薪水
NullPointerException 空指针异常,空指针就是空引用就是空

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/12094.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

流程引擎基础知识

流程引擎基础知识 流程部署流程取消部署流程发起流程取回流程作废流程委托流程流转常用流程表介绍备注 流程部署 1.后台直接导入bpmn /**流程部署源代码*/public void deploy() {ProcessEngine processEngine ProcessEngines.getDefaultProcessEngine();RepositoryService re…

UML与代码的对应关系

五种关系的耦合强弱比较&#xff1a;依赖<关联<聚合<组合<继承 依赖 虚线箭头 可描述为&#xff1a;Uses a 依赖是类的五种关系中耦合最小的一种关系。 因为在生成代码的时候&#xff0c;这两个关系类都不会增加属性。 注意1&#xff1a; Water类的生命期&…

1676_MIT 6.828 xv6中的CPU alarm_资料翻译整理

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 我觉得看了几个MIT的课程之后让我觉得我的大学四年有点浪费时光&#xff0c;看起来MIT的课程的确是很有饱满度。 这里&#xff0c;再整理一份课程中的作业要求。 …

JavaWeb03 Cookie和Session

一个网站怎么证明你来过&#xff1f; 1.首次访问时服务器给客户端一个cookie&#xff0c;下次客户端再次访问会自动携带cookie&#xff0c;注意cookie可以是多个 2.首次访问时服务器登记了客户端一系列信息&#xff0c;下次客户端再进行访问时服务器自动匹配此客户端是否访问…

【架构设计】如何设计一个几十万在线用户弹幕系统

文章目录 一、前言二、项目介绍客户端轮询WebSocket主动推送 三、弹幕初始架构四、弹幕架构演进五、弹幕存储六、弹幕查询七、总结 一、前言 现在无论是直播还是电视剧&#xff0c;我们都可以看到上面慢慢的弹幕&#xff0c;满足十几万用户在线的弹幕系统&#xff0c;我们该如…

vue3插槽的使用

插槽就是子组件中的提供给父组件使用的一个占位符&#xff0c;用 表示&#xff0c;父组件可以在这个占位符中填充任何模板代码&#xff0c;如 HTML、组件等&#xff0c;填充的内容会替换子组件的标签。 1.插槽基本使用 子组件SlotComponent.vue <template><div cla…

逐一解释一下四个 “内存屏障” 是什么

什么是内存屏障&#xff1f;硬件层⾯&#xff0c;内存屏障分两种&#xff1a;读屏障&#xff08;Load Barrier&#xff09;和写屏障&#xff08;Store Barrier&#xff09;。内存屏障有两个作⽤&#xff1a; 阻⽌屏障两侧的指令重排序&#xff1b;强制把写缓冲区/⾼速缓存中的…

【软考备战·希赛网每日一练】2023年4月18日

文章目录 一、今日成绩二、错题总结第一题第二题第三题 三、知识查缺 题目及解析来源&#xff1a;2023年04月18日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析&#xff1a; MTTF&#xff1a;平均无故障时间 MTTR&#xff1a;平均故障修复时间 可用性/可靠性MTTF…

一觉醒后ChatGPT 被淘汰了

OpenAI 的 Andrej Karpathy 都大力宣传&#xff0c;认为 AutoGPT 是 prompt 工程的下一个前沿。 近日&#xff0c;AI 界貌似出现了一种新的趋势&#xff1a;自主人工智能。 这不是空穴来风&#xff0c;最近一个名为 AutoGPT 的研究开始走进大众视野。特斯拉前 AI 总监、刚刚回归…

zookeeper + kafka集群搭建详解

目录 1.消息队列介绍 1.为什么需要消息队列 &#xff08;MO&#xff09; 2.使用消息队列的好处 3.消息队列的两种模式 2.Kafka相关介绍 1.Kafka定义 2.Kafka简介 3. Kafka的特性 3.Kafka系统架构 1. Broker&#xff08;服务器&#xff09; 2. Topic&#xff08;一个队…

SAR ADC系列25:作业和上机实践

作业&#xff1a; 异步SAR逻辑中VALID信号如何产生&#xff1f;答&#xff1a;OUTP和OUTN与非。单纯通过减小“比较器环路”的延时(t1t22*t32*t4)的方式来提升ADC的转换速率可行吗&#xff1f;为什么&#xff1f;答&#xff1a;不可行&#xff0c;还要考虑CDAC建立的速度&…

人工智能大模型多场景应用原理解析

前言 在上篇文章《人工智能大模型之ChatGPT原理解析》中分享了一些大模型之ChatGPT的核心原理后&#xff0c;收到大量读者的反馈&#xff0c;诸如:在了解了核心原理后想进一步了解未来的发展趋势(比如生成式人工智能和元宇宙能擦出什么样的火花&#xff1f;)&#xff0c;大模型…

抢鲜发布:Flutter 3.7更新详解

本文首发自「慕课网」(imooc.com)&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 作者&#xff1a;CrazyCodeBoy|慕课网讲师 新年伊始&#xff0c;由 Flutter 3.7 正式版来「打头阵」&#xff01;我们与整个…

Parallels Desktop for Mac 适用于苹果 macOS 的 PD 虚拟机(安装使用详细教程)

简介 Parallels Desktop for Mac 是一款适用于苹果 macOS 操作系统的虚拟机软件&#xff0c;可以让用户在 Mac 上运行 Windows、Linux 等其他操作系统&#xff0c;同时也可以在虚拟机中安装其他软件和应用程序。Parallels Desktop for Mac 还提供了许多实用的功能&#xff0c;…

【蓝桥杯】数组中存在K倍区间的子数组个数

文章目录 前言题目分析算法难度实战1、创建算法2、创建测试用例3、运行测试用例4、测试结果 总结 前言 蓝桥杯全国软件和信息技术专业人才大赛由工业和信息化部人才交流中心主办,每年参赛人数超过30000人。蓝桥杯大赛作为国内领先的全国性 IT 学习赛事&#xff0c;持续有力支撑…

软件测试员----面试,你准备好了么?

最近有机会做一些面试工作&#xff0c;主要负责面试软件测试人员招聘的技术面试。 之前一直是应聘者的角色&#xff0c;经历了不少次的面试之后&#xff0c;多少也积累一点面试的经验&#xff0c;现在发生了角色转变。初次的面试就碰到个工作年限比我长的&#xff0c;也没有时间…

【jvm系列-04】精通运行时数据区共享区域---堆

JVM系列整体栏目 内容链接地址【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963【三】运行时私有区域之虚拟机栈…

罗丹明-聚乙二醇-生物素RB-PEG-Biotin;Biotin-PEG-Rhodamine,PEG2000

RB-PEG-Biotin 罗丹明-聚乙二醇-生物素 中文名称&#xff1a;罗丹明-聚乙二醇-生物素 英文名称&#xff1a;RB-PEG-Biotin 分子量&#xff08;PEG &#xff09;&#xff1a;2000、3400、5000&#xff0c;其他分子量可以定制。 用 途&#xff1a;仅供科研实验使用。 性状&…

不会注册ChatGPT?4个国内网站让你尽情体验

最近火出圈的科技新词非“ChatGPT”莫属了。 但是由于ChatGPT注册起来比较困难&#xff0c;我到现在都还学不会如何注册.... 但是&#xff01;世上无难事&#xff01;只要有心人&#xff01; 我千辛万苦终于找到几个ChatGPT平替的网站了。 AI中文智能对话 地址&#xff1a;…

DPDK入门(环境搭建以及小demo)

文章目录零、从0开始配置dpdk环境的虚拟机一、dpdk的编译usertool/dpdk-setup.sh二、dpdk需要什么配置来支持1.多队列网卡2.巨页三、解析接收网络数据的过程经历了什么1.物理网卡2.NIC3.内核协议栈4.标准接口层Posix API5. 应用层上述过程发生的拷贝四、DPDK介绍基于上述接收网…
最新文章