day07_oop

news2025/7/10 11:01:57

今日内存

1.作业
2.成员变量局部变量
3.构造方法
4.对象创建过程
5.重载

零、复习

昨天

  • 介绍面向对象编程
  • 类,属性,方法,对象
  • 定义类,设置属性,设置方法,创建对象
  • 使用对象,调用属性,调用方法
  • 内存图(创建对象,创建多个对象,多个引用指向一个对象)

类和属性,方法的关系

  • 类是模板,其中包含属性和方法

类和对象的关系

  • 类是模板,是一个模糊统称
  • 对象是具体的实例(instance)
  • 由类创建出对象

创建对象的语法

  • 类名 对象名 = new 类名();

一个类创建的多个对象之间的关系

  • 一个类可以创建多个对象(无数个)
  • 它们多个对象直接没有关系,互不影响

什么叫引用?

  • 引用就是地址
  • 引用就是在使用堆中的对象
  • 使用的对象名其实就是在引用堆中的对象

一、作业

详见代码


解决关于引用类型的题目或者读懂代码,前提知识

  • 方法执行进栈,方法执行完出栈/弹栈消失
  • 每次new都会在堆中创建对象
  • 使用的对象其实是在通过地址找到堆中的对象
  • 基本数据类型,赋值动作,是将数据本身复制一份传递给另一个变量
  • 引用数据类型,赋值动作,是将对象的地址值复制一份传递给一个变量

T5

class MyClass {
    int value;
}

public class TestRef {
    public static void main(String args[]) {
        int a = 10;
        int b = a;// b=10,基本数据类型是直接将数据赋值出去
        b++;// b=11
        System.out.println(a);// 10
        System.out.println("-----------" );


        MyClass mc1 = new MyClass( );
        mc1.value = 10;

        MyClass mc2 = mc1;// 引用类型,是将地址值赋值出去
        // 即mc1和mc2是指向同一个对象

        mc2.value++; // mc2通过地址操作对象的属性
        System.out.println(mc1.value);// 11
    }
}

T7

class ClassA {
    // 属性有初始值
    // 当创建对象时,value就等于10
    int value = 10;
}

public class TestReturnRef {
    public static void main(String args[]) {
        ClassA ca = new ClassA( );
        ca = getObject( );
        ca = getObject( );
        ca = getObject( );
        System.out.println(ca.value);
    }

    // 方法的返回值是写数据类型的
    // 数据类型分为基本和引用
    // 引用包含(类,数组,接口)
    // 返回值类型是可以写一个类
    public static ClassA getObject() {
        ClassA newObject = new ClassA( );
        newObject.value += 10;

        // 当方法返回值类型是类的时候
        // 要返回该类对象
        return newObject;
    }
}

T9

class ClassAA{
    // 创建出对象后属性值value默认是0
    int value;
}

public class TestClassAA {
    public static void main(String args[]){
        int value = 10;
        /**
         * 1)调用方法传参数,等于给方法的参数赋值
         * 2)基本类型传参数,将数据直接赋值出去
         * 3)变量有作用域
         */
        changeInt(value);
        System.out.println(value);// 10
        System.out.println("------" );

        ClassAA ca = new ClassAA();
        ca.value = 10;
        /**
         * ClassAA是类,是引用类型
         * 引用类型赋值,其实是将地址值赋值
         */
        changeObject(ca);
        System.out.println(ca.value);// 11
    }
    public static void changeInt(int value){// value=10
        value++;// 11
    }

    public static void changeObject(ClassAA ca){
        // ca操作还是内存中那个对象
        ca.value++;
    }
}

二、成员变量&局部变量

2.1 介绍

成员变量局部变量
解释类的属性,例如int age;局部是指方法,
即该变量只能在方法这一局部范围内使用
位置类中方法外方法内以及方法的参数
初始值在创建对象时会赋初始值主动赋初始值
内存位置不一样随着对象创建在堆中出现随着方法执行进栈
public class Dog {

    /**
     * 类中有属性和方法,那么属性和方法就是类的成员
     * 即属性又叫成员属性/成员变量
     *   方法又叫成员方法
     *
     * age 就是成员变量
     */
    int age;

    public void eat(String food){
        /**
         * num就是局部变量
         */
        int num = 1;
    }

    // 看门
    public void seeDoor() {
        int num = 2;
    }

}

2.2 使用成员变量

在类中的方法里面可以直接使用成员变量

public class Cat {
    // 成员变量
    String name;
    int age;

    // 方法内可以直接使用成员变量
    public void play() {
        System.out.println("小猫"+name+"在玩,今年"+age+"岁" );
    }
}
class TestCat {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.name = "Tom";
        cat.age = 2;
        cat.play();
    }
}

image-20231017111815778

2.3 成员变量和局部变量重名

  • 首先成员变量和局部变量可以重名
  • 如果重名,那么方法内优先自己内部局部变量 --> 就近原则
  • 如果就只想要用对象的成员变量,需要使用this来单独调用属性
    • this代表当前对象

使用局部变量(就近)

image-20231017112339440

使用this调用成员变量

image-20231017112912839

public class Cat {
    // 成员变量
    String name;
    int age;

    // 方法内可以直接使用成员变量
    public void play() {
        System.out.println("小猫"+name+"在玩,今年"+age+"岁" );
    }

    public void catchMouse() {
        String name = "加菲";
        // 默认就近原则,使用自己的name属性
        System.out.println(name+"猫抓老鼠 " );
        // 只用成员变量,使用this来调用
        // 因为this是代表当前对象
        // this.属性就是对象调用属性
        System.out.println(this.name+"猫抓老鼠 " );
        System.out.println("this--->"+this );
    }
}
class TestCat {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.name = "Tom";
        cat.age = 2;
        //cat.play();
        System.out.println("cat -->" + cat );
        cat.catchMouse();
    }
}

三、构造方法【重点】

3.1 构造方法

构造方法,又叫构造器或者构造函数

是什么? 它就是方法,不过有点特殊

  • 方法名是当前类,类名
  • 没有返回值,连void都没有

干什么? 用来构造 ,也就是创建对象的,以及会将属性初始化

  • 类名 对象名 = new 类名();
  • 类名 对象名 = new 构造方法();
  • 即通过调用构造方法来创建对象的

怎么写的?

public 类名(){
    
}

写在哪?

  • 在类中,与方法一样,与其他方法平级定义即可
  • 每个类都有,默认是隐藏的
 /*
 * @desc 演示构造方法的使用
 */
public class Pig {

    // 属性
    int age;
    String name;

    // 构造方法
    // 创建对象,并会将属性初始化
    public Pig(){
        System.out.println("Pig类构造方法执行" );
        age = 1;
        name = "GGBand";
    }

    // 方法
    public void eat(){
        System.out.println("猪拱白菜" );
    }
}
class TestPig{
    public static void main(String[] args) {
        // new 后面调用类的构造方法来创建对象的
        Pig pig = new Pig();
        System.out.println(pig.age );
        System.out.println(pig.name );
    }
}

3.2 有参构造

刚才的构造方法是无参构造,创建出的对象属性值都是默认值

可以使用有参数的构造方法,这样创建出的对象属性值是指定的值

写法

public 类名(数据类型 变量){
    this.属性 = 变量;
}
 /* @desc 演示构造方法的使用
 */
public class Pig {
    // 属性
    int age;
    String name;

    // 构造方法
    // 创建对象,并会将属性初始化
    public Pig(){
        System.out.println("Pig类构造方法执行" );
        age = 1;
        name = "GGBand";
    }

    /**
     * 有参构造,通过指定变量,让创建出对象的
     * 属性是指定值
     */
    public Pig(int age,String name){
       this.age = age;
       this.name = name;
    }


    // 方法
    public void eat(){
        System.out.println("猪拱白菜" );
    }
}
class TestPig{
    public static void main(String[] args) {
        // new 后面调用类的构造方法来创建对象的
        Pig pig = new Pig();// 无参构造
        System.out.println(pig.age );
        System.out.println(pig.name );

        System.out.println("-------------" );
        // 调用有参构造创建对象
        Pig pig2 = new Pig(2,"猪大强");
        // 输出后直接就是指定数据
        System.out.println(pig2.age );
        System.out.println(pig2.name );

        Pig pig3 = new Pig(3,"猪博士");
        System.out.println(pig3.age );
        System.out.println(pig3.name );
    }
}

image-20231017145349200

总结无参和有参构造的异同

  • 相同点: 都是可以创建对象,都可以将属性初始化
  • 不同点:
    • 无参构造方法创建出的对象属性值是默认值(0,null,0.0等)
    • 有参构造方法创建出的对象属性值是调用方法时指定的

3.3 注意事项

  1. 每个类都隐藏提供一个无参构造方法
  2. 但是当你显式写出任何一个构造方法,上面隐藏的构造方法不再提供
  3. 所以建议 自己主动将有参无参构造同时给出

四、对象创建过程

  1. 调用构造方法创建对象
  2. 先初始化类的属性
  3. 再执行构造方法
class ClassA { // 类A
    public ClassA() {// 无参构造
        System.out.println("ClassA()");
    }
}
class ClassB {// 类B
    public ClassB() {// 无参构造
        System.out.println("ClassB()");
    }
}
class ClassC {// 类C
    // 成员变量(属性)
    // 属性a有值,且值是new出来的,初始值是地址值
    ClassA a = new ClassA( );
    // 属性b,没有值,初始值是null
    ClassB b;

    public ClassC() {// 无参构造
        System.out.println("ClassC()");
        b = new ClassB( );// 创建对象给属性b赋值
    }
}

public class TestConstructor {
    public static void main(String[] args) {
        /**
         * -------------------------
         *  构造方法目的是: 创建对象,属性初始化
         * 创建对象过程: 
         *  先属性初始化,再执行构造方法内部代码
         * -------------------------
         * 1 调用ClassC()构造方法,但是先初始化ClassC类中的属性
         * 2 为了给属性ClassA a赋值,会执行new ClassA(),调用ClassA()构造方法
         * 3 属性ClassB b初始化为null
         * 4 属性初始化完后,再执行构造方法里边代码
         */
        ClassC cc = new ClassC( );
    }
}
// 结果如下
ClassA()
ClassC()
ClassB()

五、方法的重载

重载(Overload)

public class TestOverload {

    public static void main(String[] args) {
        /**
         * 输出语句就是非常经典的重载
         * -----
         * 重载就是,同一个类中方法名一样,参数列表不一样
         *      参数的个数,数据类型,顺序不一样即可
         *      与返回值没有关系
         * -----
         * 好处就是: 方便使用
         * -----
         * 程序运行会根据参数,找到对应的方法执行
         */
        System.out.println( );
        System.out.println(1 );
        System.out.println(1.1 );
        System.out.println(true );
        System.out.println("哈哈" );
        System.out.println(new Dog() );

        test( 1);

    }

    public static void test(){
        System.out.println("test()" );
    }

    public static void test(int a){
        System.out.println("test(int a)" );
    }

    public static void test(String a){
        System.out.println("test(String a)" );
    }

    public static void test(String a,int b){
        System.out.println("test(String a,int b)" );
    }

    public static void test(int a, String b){
        System.out.println("test(int a,String b)" );
    }
}

六、总结

构造方法是重点,注意语法的特殊写法(无返回值,方法名是类名)
有参无参的区别
在有参构造中了解 成员变量和局部变量的应用

七、作业

pdf5的 t6,t12,t13(研究,讲),t14(引用相关,复习t4579)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CUDA学习笔记3——图像卷积实现

分别采用GPU、CPU对图像进行sobel滤波处理 #include <stdio.h> #include "cuda_runtime.h" #include "device_launch_parameters.h" #include<math.h> #include <malloc.h> #include <opencv2/opencv.hpp>#include <stdlib.h…

DevEco Studio的安装和开发环境配置(详细)

记录一下这段时间备赛金砖职赛的鸿蒙应用开发 下载与安装 下载网址华为开发者联盟-智能终端能力开放,共建开发者生态 (huawei.com) 单击下载 然后跳转到下载的具体版本型号 这里我们选择window版本 下载完解压后 双击运行安装 我们需要找到一个不包含中文的地方&…

文件操作和IO详解

文件操作 和 IO 文件,File 这个概念,在计算机里,也是“一词多用”. 文件的狭义和广义 狭义的文件: 指的是硬盘上的文件和目录(文件夹) 广义的文件: 泛指计算机中很多的软硬件资源.操作系统中,把很多的硬件设备和软件设备都抽象成了文件.按照文件的方式来统一管理.例如网卡,操…

薪资27k,从华为外包测试“跳”入字节,说说我转行做测试的这5年.....

转行测试5年了 当时因为家里催促就业&#xff0c;在其中一个室友的内推下进入了一家英语教培机构&#xff0c;前期上班和工资都还算满意&#xff0c;甚至觉得自己找到了一份很稳定的工作了&#xff0c;可是好景不长&#xff0c;“双减政策”的到来&#xff0c;让公司的经济遭受…

LeetCode1389——按既定顺序创建目标数组

LeetCode1389 思路&#xff1a;先将元素存放在集合中&#xff0c;集合中的add&#xff08;index&#xff0c;value&#xff09;方法可以在指定的位置插入元素。 再创建新的数组&#xff0c;将集合中的元素存入数组&#xff0c;直接用数组的话元素移动不好操作。 public class D…

嵌入式学习笔记(58)程序运行为什么需要内存?

1.1.1.计算机程序运行的目的 程序 代码 数据 代码就是函数&#xff0c;表示加工数据的动作。 数据包括全局变量和局部变量&#xff0c;表示被加工的东西。 程序运行的目的要么重在数据结果&#xff08;有返回值&#xff09;&#xff0c;要么重在过程&#xff08;无返回值…

Java和前端都不好找工作,计算机毕业可以干嘛?

37了&#xff0c;11年多的Java经验&#xff0c;其他什么mysql&#xff0c;linux&#xff0c;Vue等等都会&#xff0c;现在失业在家已经1年多&#xff0c;不指望入职摸鱼了&#xff0c;寻思着转行中。祝你好运 这是某问答社区&#xff0c;有个大四学生提问&#xff0c;好迷茫啊马…

华为云云耀云服务器L实例评测|部署war格式的web项目

目录 准备服务器安装java安装tomcat配置tomcat部署Web Adaptor总结 对于很多刚开始接触编程的朋友&#xff0c;通常都期待自己能部署一个网站&#xff0c;并可以在公网上访问。这就需要一台云服务器。最近发现华为云 推出了 云耀云服务器L实例&#xff0c;使用后&#xff0c;体…

R语言进度条:txtProgressBar功能使用方法

R语言进度条使用攻略 在数据处理、建模或其他计算密集型任务中&#xff0c;我们常常会执行一些可能需要很长时间的操作。 在这些情况下&#xff0c;展示一个进度条可以帮助我们了解当前任务的进度&#xff0c;以及大约还需要多长时间来完成&#xff0c;R语言提供了几种简单且灵…

多模态论文串讲

多模态论文串讲 近几年&#xff0c;尤其是 CLIP 出现以来&#xff0c;多模态学习的发展异常火爆。除了传统的VQA、图文检索、图像描述等&#xff0c;还有受启发于 CLIP 的新任务 Language Guided Detection/Segmentation、文本图像生成、文本视频生成等。本次串讲主要还是围绕…

MATLAB——概率神经网络分类问题程序

欢迎关注“电击小子程高兴的MATLAB小屋” %% 概率神经网络 %% 解决分类问题 clear all; close all; P[1:8]; Tc[2 3 1 2 3 2 1 1]; Tind2vec(Tc) %数据类型的转换 netnewpnn(P,T); Ysim(net,P); Ycvec2ind(Y) %转换回来

机器人力控制构架

在交互过程中&#xff0c;环境会对末端执行器可以遵循的几何路径设置约束。这种情况通常被称为约束运动。在这种情况下&#xff0c;使用纯运动控制策略来控制交互是失败的&#xff01;&#xff01; 只有任务准确规划&#xff0c;使用运动控制才能成功执行与环境的交互任务。但…

10.17数电第二次实验

就是数码管有4个&#xff0c;前两个来表示分钟&#xff0c;后两个表示秒钟 然后下面十六个led灯来记录时间&#xff0c;小时以十六进制&#xff0c;就是说4个二进制&#xff0c;4个灯为一组&#xff0c;一共可以显示四位小时 首先是要接收信号&#xff0c;应该是要无信号&…

任务调度器

题目链接 任务调度器 题目描述 注意点 tasks[i] 是大写英文字母任务可以以任意顺序执行两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间 解答思路 利用桶思想&#xff0c;将不同的字母放进同一个桶中&#xff0c;桶的数量为tasks中字母出现频率最高的次数&#xf…

保序回归与金融时序数据

保序回归在回归问题中的作用是通过拟合一个单调递增或递减的函数&#xff0c;来保持数据点的相对顺序特性。 一、保序回归的作用 主要用于以下情况&#xff1a; 1. 有序数据&#xff1a;当输入数据具有特定的顺序关系时&#xff0c;保序回归可以帮助保持这种顺序关系。例如&…

ai配音怎么弄?推荐一款免费好用的ai配音软件

你们做短视频卡在了哪&#xff1f;剪辑&#xff1f;文案&#xff1f;还是配音&#xff1f;我身边很多朋友都卡在了配音&#xff0c;因为他们都觉得自己的声音不好听&#xff0c;普通话不标准&#xff0c;不够自信&#xff0c;那我们到底该如何解决短视频配音难题呢&#xff1f;…

动态规划:11分割等和子集

动态规划&#xff1a;11分割等和子集 416. 分割等和子集 这道题目初步看&#xff0c;和如下两题几乎是一样的&#xff0c;大家可以用回溯法&#xff0c;解决如下两题 698.划分为k个相等的子集473.火柴拼正方形 这道题目是要找是否可以将这个数组分割成两个子集&#xff0c;使…

C++:继承的概念和用法

文章目录 继承的定义基类和派生类的对象赋值转换继承中的作用域派生类的默认成员函数几个继承小点继承理论的演示 菱形继承和菱形虚拟继承虚拟继承 本篇主要总结的内容有 什么是继承继承的一些概念菱形继承和虚拟继承继承的优缺点对比 继承的定义 继承是代码复用的一种重要手…

Redis 主从复制,哨兵,集群——(1)主从复制篇

目录 1. Redis 主从复制是什么&#xff1f; 2. Redis 主动复制能干嘛&#xff1f; 2.1 读写分离 2.2 容灾恢复 2.3 数据备份 2.4 水平扩展支撑高并发 3. Redis 主从复制配置项 3.1 配从库不配主库 3.2 权限密码配置 3.3 基本操作命令 4. 案例演示 4.1 案例说明 4.…

leetCode 647.回文子串 动态规划 + 优化空间 / 中心扩展法 + 双指针

647. 回文子串 - 力扣&#xff08;LeetCode&#xff09; 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串&#x…