【JavaSE】类和对象详解(上)

欢迎关注个人主页:逸狼

创造不易,可以点点赞吗~

如有错误,欢迎指出~

目录

类和对象

类的组成

对类的理解

成员变量的访问和类方法的调用

this

抛出一个问题

this的作用

初始化成员变量

未初始化的成员变量

代码举例

就地初始化

构造方法初始化成员变量

认识构造方法

注意

快速生成构造方法

快速生成构造方法步骤图解

通过this简化构造方法

代码执行步骤图解

执行结果



类和对象

在Java中,一切皆是对象,类(类型)是描述一个对象的(在C语言中是结构体),对象是一个真正的实体。

目的是:面向对象编程(重点在对象)

类的组成

class为定义类的关键字,ClassName为类的名字(用大驼峰形式),{}中为类的主体。

// 创建类
class ClassName{  
    field;       // 字段(属性) 或者 成员变量
    method;      // 行为 或者 成员方法
}

注意:

  • 一般一个文件当中只定义一个类
  • main方法所在的类一般要使用public修饰(注意:Eclipse默认会在public修饰的类中找main方法)
  • public修饰的类必须要和文件名相同
  • 不要轻易去修改public修饰的类的名称,如果要修改,通过开发工具修改

例如定义一个类

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

    //方法
    public void doClass(){
        System.out.println("学java!");
    }
}

对类的理解

通过new关键字可以实例化多个对象,在 堆 上产生对象

  • 类只是一个模型一样的东西,用来对一个实体进行描述
  • 类是一种自定义的类型,可以用来定义变量.
  • 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量

类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东 西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

成员变量的访问和类方法的调用

  • 利用.访问对象中的成员变量和调用类方法
  • 可以new多个实例化对象

如下创建一个洗衣机类,并访问成员变量和调用相关方法

class WashMachine{
    public String brand;
    public String color;
    public double weight;

    public void washClothes(){
        System.out.println("洗衣服!");
    }
    public void dryClothes(){
        System.out.println("脱水!");
    }
}

public class j3_30 {
    public static void main(String[] args) {
        WashMachine washMachine1=new WashMachine();//new一个实例化对象washMachine1
        washMachine1.brand="海尔";//利用.访问对象中的成员变量
        washMachine1.dryClothes();//利用.调用类方法
        System.out.println(washMachine1.brand);
        System.out.println("_________");
        WashMachine washMachine2=new WashMachine();//可以new多个实例化对象
        washMachine2.brand="美的";
        System.out.println(washMachine2.brand);
        washMachine2.dryClothes();
    }

结果

this

抛出一个问题

如下代码运行结果都是0,这是为什么呢?

public class Date {
    //这些变量属于对象
    public int year;
    public int month;
    public int day;
    //设置日期
    public void setDate(int year,int month,int day){
        year=year;//局部变量优先使用
        month=month;//在括号里面自己调用自己,修改的是局部变量,出了括号后,又变为了0
        day=day;
    }
    //打印日期
    public void printDate(){
        System.out.println(year+" 年 "+month+" 月 "+day+" 日 ");
    }

    public static void main(String[] args) {
        Date date=new Date();//new一个对象date
        date.setDate(2024,3,31);
        date.printDate();
        System.out.println("**********");
        Date date2=new Date();//new一个对象date
        date2.setDate(2024,3,30);
        date2.printDate();
    }
}

这里我们就要考虑变量在内存的存储了~

我们可以看到开头我们定义了3个变量(year,month,day),这里的3个变量是属于成员变量,存储在上; 上面代码设置日期的方法里的 定义了3个变量(year,month,day),是局部变量(形参),存储在方法栈上;出现上面的这种情况是因为:对象和局部变量同名时,优先使用局部。

上面局部变量的自我修改(自己修改自己),出了作用域后就又变为了0。

那应该怎样解决该问题呢?我们可以使用this解决

this的作用

我们可以在设置日期的方法里的局部变量前面加上this,用于表示当前对象的引用

public void setDate(int year,int month,int day){
        this.year=year;
        this.month=month;
        this.day=day;
    }

成功打印结果

this使用注意

  1. 在代码里面我们要习惯使用this,当出现可加可不加时,都加上
  2. this的类型:对应被调用的对象引用类型
  3. this只能在 成员方法中使用,只能引用当前对象

初始化成员变量

未初始化的成员变量

对于一个类的成员变量,在没有初始化前,每个成员变量都有一个默认值(引用类型是null,其余基本变量是对应的0值,boolean类型是false)

代码举例

就地初始化

在声明成员变量时,就直接给出了初始值。

public int year=2000;
public int month=1;
public int day=1;

构造方法初始化成员变量

认识构造方法

首先它是一个方法(返回值,方法名,参数列表{}),但又有区别,只有 方法名、参数列表{}、没有返回值 且 方法名和类名相同

 例如

public Date(int year, int month, int day){
        this.year = year;
        this.month = month;
        this.day = day;
        System.out.println("学Java!");
   }

注意

  • 当我们没有写任何构造方法时,会默认存在一个(无参数的)
  • 只要存在任何一个构造方法,编译器就不会再提供了
  • 构造方法可以重载(参数不一样)

快速生成构造方法

通过编译器快速产生多个不同的构造方法,构成方法的重载

    public Date(int year, int month) {
        this.year = year;
        this.month = month;
    }

    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public Date(int month) {
        this.month = month;
    }

快速生成构造方法步骤图解

通过this简化构造方法

    public Date(){
        this(2024,3,31);//必须放在第一行
        System.out.println("22222222");
    }

    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
        System.out.println("11111111");
    }

代码执行步骤图解

执行结果

注意:this的调用不能形成环

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

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

相关文章

每日一题(leetcode331):验证二叉树的前序序列化——栈

类似消消乐,数字+“#”“#”就可以消成一个“#”,到最后如果栈中只剩一个“#”便说明序列正确。 当然也可以用槽位理解,一个数字出现会消耗一个槽位产生两个槽位(即产生一个槽位),一个“#”出现…

题目:安全序列(蓝桥OJ 3432)

问题描述&#xff1a; 题解&#xff1a; #include <bits/stdc.h> using namespace std; using ll long long; const int N 1e6 9, p 1e9 7;int prefix[N],dp[N];int main() {int n, k;cin >> n >> k;dp[0] prefix[0] 1;for(int i 1; i < n; i){i…

iptables 与 firewalld 防火墙

iptables iptables 是一款基于命令行的防火墙策略管理工具 四种防火墙策略&#xff1a; ACCEPT&#xff08;允许流量通过&#xff09; 流量发送方会看到响应超时的提醒&#xff0c;但是流量发送方无法判断流量是被拒绝&#xff0c;还是接收方主机当前不在线 REJECT&#xff08…

STM32的IAP技术,BootLoader

来源 三种下载方式&#xff1a; 1、ICP&#xff1a;ST-Link, 2、ISP: FlyMcu, 3、IAP IAP简介 IAP技术的核心在于BootLoader程序的设计&#xff0c;这段程序预先烧录在单片机中&#xff0c;正常的APP程序可以使用BootLoader程序中的IAP功能写入&#xff0c;也可以两部分代码一…

【JavaEE初阶系列】——常见的锁策略

目录 &#x1f6a9;乐观锁和悲观锁 &#x1f6a9;读写锁和普通互斥锁 &#x1f6a9;轻量级锁和重量级锁 &#x1f6a9;自旋锁和挂起等待锁 &#x1f6a9;公平锁和非公平锁 &#x1f6a9;可重入锁和不可重入锁 &#x1f6a9;关于synchronized的锁策略以及自适应 接下来讲解的锁策…

Springboot之RESTful风格

目录 1、概述&#xff1a; 1.1、传统风格的API&#xff1a; 1.2、RESTful风格的API&#xff1a; 1.3、GET、POST、PUT、DELETE&#xff1a; 2、RESTful风格相关的注解&#xff1a; ①PathVariable&#xff0c;用来获取url中的数据&#xff1b; ②GetMapping&#xff0c;接…

C++教学——从入门到精通 6.ASCII码与字符型

如何把小写字母转换成大写字母呢&#xff1f; 这个问题问的好&#xff0c;首先我们要新学一个类型——char 这个类型就是字符型 再来说说ASCII码 给大家举几个例子 空格————32 0————48 9————57 A————65 Z————90 a————97 z————122 我们…

Cortex-M7中断向量表的重定向

1 前言 系统上电后&#xff0c;PC会指向复位向量&#xff0c;即向量表中的Reset_Handler&#xff0c;而系统就是通过Vector Table Offset Register (VTOR)的值加上4字节来找到复位向量的入口的。 因为地址 0 处应该存储引导代码&#xff0c;所以它通常映射到 Flash 或者是 ROM …

Unity类银河恶魔城学习记录11-14 p116 Thunder strike item effect源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili ThurderStrike_Controller.cs using System.Collections; using System.C…

如何提高小红书笔记的收录率?

在小红书平台上&#xff0c;笔记的收录率是衡量一篇笔记是否受欢迎和有价值的重要因素。为了提高笔记的收录率&#xff0c;有几个关键点需要注意&#xff1a; 1.内容不涉及广告 在发布笔记前要先确保笔记内容不包含任何形式的广告或推广信息。小红书平台对于广告性质的内容有…

关于Ansible的模块②

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 接《关于Ansible的模块 ①-CSDN博客》&#xff0c;继续学习和梳理Ansible的常用文件类模块 1. copy模块 从当前机器上复制文件到…

关于 Unreal 的各种坐标系、输入与逻辑的转换问题

说明 已知&#xff1a; 在世界原点往 X 轴方向看去&#xff0c;ForwardVector 为 [ 1 , 0 , 0 ] [1,0,0] [1,0,0]&#xff0c;此时的右手边的方向为 [ 0 , 1 , 0 ] [0,1,0] [0,1,0] 手柄摇杆、鼠标移动朝右得到的 [ 1 , 0 , 0 ] [1,0,0] [1,0,0]&#xff0c;朝上得到的是…

代码随想录:字符串5-7

右旋字符串 题目 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k&#xff0c;请编写一个函数&#xff0c;将字符串中的后面 k 个字符移到字符串的前面&#xff0c;实现字符串的右旋转操作。 例如&#xff0c;对于输入字符…

货币与利率

货币与利率 货币及其职能什么是货币货币的职能货币带来了什么&#xff1f; 货币形式的演变商品货币代用货币信用货币货币的特性 现代社会货币的表现形式流通中的现金支票存款信用卡储存存款 货币层次划分目的划分标准划分种类我国的货币层次 货币与物价的关系利率什么是利息什么…

算法学习——LeetCode力扣补充篇1

算法学习——LeetCode力扣补充篇1 1365. 有多少小于当前数字的数字 1365. 有多少小于当前数字的数字 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个数组 nums&#xff0c;对于其中每个元素 nums[i]&#xff0c;请你统计数组中比它小的所有数字的数目。 换而言之&a…

推荐一本牛逼的入门 Python书!,如何试出一个Python开发者真正的水平

本书详细解说了 Python 语言和编程的本质&#xff0c;无论你是否接触过编程语言&#xff0c;只要是 Python 编程的初学者&#xff0c;都可阅读本书。 本书讲解的内容虽然基础&#xff0c;但并不简单。本书提供了 165 幅图表&#xff0c;可以让大家能够轻松地理解并掌握复杂的概…

Taro+vue3 监听当前的页面滚动的距离

1.需求 想实现一个这样的效果 一开始这个城市组件 是透明的 在顶部 的固定定位 当屏幕滑动的时候到一定的距离 将这个固定的盒子 背景颜色变成白色 2.Taro中的滚动 Taro中的滚动 有固定的api 像生命周期一样 这个生命周期是 usePageScroll import Taro, { useDidShow, useP…

外包干了5天,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入杭州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

Django源码之路由的本质(上)——逐步剖析底层执行流程

目录 1. 前言 2. 路由定义 3. 路由定义整体源码分析 3.1 partial实现path函数调用 3.2 图解_path函数 3.3 最终 4.URLPattern和Pattern的简单解析 5. 小结 1. 前言 在学习Django框架的时候&#xff0c;我们大多时候都只会使用如何去开发项目&#xff0c;对其实现流程并…

【C++】位图

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;手撕哈希表的闭散列和开散列 > 毒鸡汤&#xff1a; 坚持不懈&#xff0c;才能在困难面前看到光明的希望。 > 专栏选自&#xff1a;C嘎嘎进阶 >…