认识类与对象(上)

目录

何为类,何为对象?

一.对于类

1.idea修改文件类名

二.对于对象

三.this关键字

1.区分成员变量和局部变量

2.引用当前对象

3.调用当前对象的其他构造方法

4.总结

四.构造方法

1.利用idea特性快速写出构造方法

五.封装

1.利用idea特性快速写出set和get


何为类,何为对象?

类,简单点来说,就是用来对对象进行描述的,主要是用来描述其有何功能,有何特点,有何作用的。比如说老虎是一个类,那么我们就说可以定义一个对象(老虎),描述该对象可以跑,可以吃饭,可以睡觉,具有凶猛,力气大等的特点。

具体我们继续往下看!


一.对于类

定义:类是一个模板或蓝图,用于创建对象。它定义了一组属性(数据)和方法(函数或行为),这些属性和方法描述了该类对象的特征和行为。

class为定义类的关键字

格式:

class className{

      field;//成员变量(属性)

      method;//成员方法(行为)

}

注意事项:

1.类名注意采用大驼峰定义。 如:PersonCar

2.成员变量和成员方法使用小驼峰命名。 如:getName()setAge()

3.一般一个文件当中只定义一个类。

4.main方法所在的类一般要使用public修饰

5.public修饰的类必须要和文件名相同

我们来看一个例子:

我们定义一个电脑类

//类
class Computer {
    //成员变量(属性)
    String brand;//品牌
    String mouse;//鼠标
    String keyboard;//键盘
    String hardDrive;//硬盘
    String display;//显示屏
    //等等

    //成员方法(行为)
    public void writeCode(){
        System.out.println("写代码...");
    }
    public void click(){
        System.out.println("点击...");
    }
    public void watchVideos(){
        System.out.println("看视频...");
    }
    //等等
}

1.idea修改文件类名


二.对于对象

定义:对象是类的实例。它是通过类定义的蓝图创建的具体实体。每个对象都有自己的状态(属性值)和行为(方法)。

格式:

ClassName objectName = new ClassName();   

注意事项:

1.对于格式括号里的参数,需要根据类的构造方法的参数来写,一般没有重写类的构造方法就不用写参数。

2.对象是在 堆内存 中创建的

3.对象的创建通常发生在方法中,而不是在类中直接创建。

我们继续上面的例子来写:

//类
class Computer {
    //成员变量(属性)
    String brand;//品牌
    String mouse;//鼠标
    String keyboard;//键盘
    String hardDrive;//硬盘
    String display;//显示屏
    //等等

    //成员方法(行为)
    public void writeCode(){
        System.out.println("写代码...");
    }
    public void click(){
        System.out.println("点击...");
    }
    public void watchVideos(){
        System.out.println("看视频...");
    }
    //等等
    public static void main(String[] args) {
        
        Computer com=new Computer();//实例化一个对象
        
        //通过" . "来访问对象的方法和属性
        com.brand="华为";//将该对象的属性品牌初始化为华为,以下同理
        System.out.println(com.brand);
        com.display="三星显示屏";
        System.out.println(com.display);
        com.mouse="罗技鼠标";
        System.out.println(com.mouse);
        com.keyboard="rk98";
        System.out.println(com.keyboard);
        com.hardDrive="西数固态硬盘";
        System.out.println(com.hardDrive);

        //调用对象的方法
        com.click();
        com.watchVideos();
        com.writeCode();
    }
}

三.this关键字

this是java的一个引用,他指向当前对象的实例。

一般用于区别类的成员变量和方法中的局部变量,以及调用类的其他构造方法或方法。


1.区分成员变量和局部变量

我们来看个例子:

下面的代码是否会输出zhangfei?

输出结果为null,这是为什么?

我们在idea中看到下面两个黄色提示

意思是:

从未使用分配给“name”的值“name”
变量“name”被分配给它自己

简单来说就是name = name; 只是将方法的参数 name 赋值给自己,没有赋值给类的成员变量 name,因此不会改变成员变量 name 的值。

所以此时就需要用到我们的this关键字,将第一个name指向对象的实例

public class Test {
    String name;
    public void person(String name){
        this.name=name;//相当于test.name=name
    }

    public static void main(String[] args) {
        Test test=new Test();
        test.person("zhangfei");
    }
}

输出一下:


2.引用当前对象

在方法中使用 this 表示调用该方法的对象实例,通常用于将当前对象作为参数传递给其他方法。

public class Test {
    String name;
    public void dispaly(){
        System.out.println(this);
    }

    @Override//重写
    public String toString() {
        return "Test{" +
                "name='" + name + '\'' +
                '}';
    }//重写toString,后面讲

    public static void main(String[] args) {
        Test test=new Test();
        test.name="wusong";
        test.dispaly();
    }
}

输出:

当然如果我们没有重写的那一部分代码,输出结果是:

但是不影响我们这this的使用方法,和指向的对象。


3.调用当前对象的其他构造方法

使用 this 调用其他构造方法可以减少代码重复。这种调用必须是构造方法中的第一个语句。

public class Person {
    private String name;
    private int age;

    public Person(String name) {
        this(name, 0); // 调用另一个构造方法
    }

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

4.总结

(1)this ---表示当前对象

(2)this.data ---表示调用成员变量

(3)this.func ---表示调用成员方法

(4)this() ---表示调用构造方法


四.构造方法

我们在创建对象的时候给成员变量初始化的时候,常常是通过类方法赋值的,那么有没有更方便的方法来初始化成员变量呢?

回答是:有,那就是构造方法。


构造方法(或称构造函数,Constructor)是一种特殊的方法,用于在创建对象时初始化对象的属性。构造方法的名称通常与类名相同,并且在实例化对象时自动调用,无需显式调用。构造方法的主要作用是为对象的属性赋予初始值,确保对象在使用前处于有效状态。

在整个对象的生命周期内只调用一次。

构造方法的格式:

[访问修饰符] 类名(参数列表) {
    // 构造函数的主体
}

 

不知道大家有没有想过为什么我们实例化对象的时候那个小括号那里为什么有时候是啥也没有,有时候又带有参数呢?比如:

我在前面对象的注意事项那里讲过那里提到过构造函数。实际上就是跟构造函数有关。

在java中,构造函数又具有以下特点:

  • 无返回类型:构造方法没有返回类型,甚至没有 void 关键字。
  • 与类名相同:构造方法名称必须与类名相同,以便编译器识别它为构造方法。
  • 可以重载:可以定义多个构造方法(构造方法重载),每个构造方法的参数列表不同,以支持不同的初始化方式。

我们来看一个例子:

public class Test {
    String name;
    public void dispaly(){
        System.out.println(name);
    }

    public static void main(String[] args) {
        Test test=new Test();//隐式调用构造方法(隐藏起来了),使用默认的无参且无初始化的构造方法
        test.name="wusong";
        test.dispaly();
    }
}

其实呢 上面的代码相当于我下面写的代码(也是无参无初始化):

这里我们重新再写一个构造方法,带参带初始化:

public class Test {
    String name;
    public void dispaly(){
        System.out.println(name);
    }
    //构造方法

    public Test(String name) {
        this.name = name;//this指向对象的实例
    }
    public static void main(String[] args) {
//        Test test=new Test();//当我们写了重载(这个后面讲)了一个带参的构造方法且只有一个后,这里不写实参会报错!
        Test test=new Test("zhangfei");
        test.dispaly();
    }
}

这样就可以实现实例化对象的时候连带初始化成员变量了。

注意事项:

1.当我们在类中创建了一个带参的构造方法,此时我们就不能调用原来那个隐式默认的无参构造方法了(以前你对我爱答不理,现在你高攀不起(bushi)),除非你自己再创建一个无参的构造方法。

2.在一个类中可以有多个构造方法。

3.可以在一个构造方法中调用另外一个构造方法(当然不能你调用我,等一下我又调用你这样形成闭环)。


1.利用idea特性快速写出构造方法

效果如图:



五.封装

封装其实就是将对象的属性和方法隐藏在内部,不让外部直接访问或者修改。

如何实现?

  • 将属性设为私有(private:使得类的属性只能在类内部访问。
  • 提供公共的访问方法:通过 public 的方法(如 getset 方法)控制属性的访问权限。
  • 通过访问控制修饰符控制可见性privateprotectedpublic 等修饰符可以限制访问范围,确保数据安全。

(注意这里的每一点可不是步骤,每一点都是实现封装的方法)

这里做一个访问限制符提供给大家参考:

No范围privatedefaultprotectedpublic
1同一包中的同一类
2同一包中的不同类
3不同包中的子类
4不同包中的非子类

注意:default是没给成员变量写访问限制符的时候默认的情况。

下面我们随便举个例子

/
//Person类

public class Person {
    private int age;
    private String name;
    //构造方法
    public Person(int age,String name){
        this.age=age;
        this.name=name;
    }
}


/
//Test类

public class Test {
    public static void main(String[] args) {
        //实例化对象
        Person per=new Person(18,"zhangfei");
        System.out.println(per.age);;//报错:'age' has private access in 'Person'
        System.out.println(per.name);//报错:'name' has private access in 'Person'
    }
}

此时我们能看到这两个错误:

即:

“age”在“Person”中具有私人访问权限
“name”在“Person”中具有私有访问权限

虽然说成员变量受到private的权限保护,只能在同一类中进行访问,但是我们可以通过某些特定的方法跨类来访问成员变量

如下代码所示:

/
//Person类

public class Person {
    private int age;
    private String name;
    public Person(int age,String name){
        this.age=age;
        this.name=name;
    }
    //获取age成员变量
    public int getAge() {
        return age;
    }

    //修改age成员变量
    public void setAge(int age) {
        this.age = age;
    }
    //获取name成员变量
    public String getName() {
        return name;
    }
    //修改age成员变量
    public void setName(String name) {
        this.name = name;
    }
}




/
//Test类

public class Test {
    public static void main(String[] args) {
        Person per=new Person(18,"zhangfei");
        System.out.println(per.getAge());
        System.out.println(per.getName());
        per.setAge(20);//修改age
        per.setName("wusong");//修改name
        System.out.println(per.getAge());
        System.out.println(per.getName());
    }
}

代码解释:

1.因为成员变量和我们写的getAge,setAge,getName,setName在同一个类中,所以这些方法可以访问成员变量。

2.与此同时,这些方法又被public修饰,他们可以在不同类中被访问,所以这就使得成员变量可以被访问了。

结果输出为:


1.利用idea特性快速写出set和get

效果如图:

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

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

相关文章

鸿蒙网络编程系列32-基于拦截器的性能监控示例

1. 拦截器简介 在Web开发中拦截器是一种非常有用的模式,它允许开发者在请求发送到服务器之前或响应返回给客户端之前执行一些预处理或后处理操作。这种机制特别适用于需要对所有网络请求或响应进行统一处理的情况,比如添加全局错误处理、请求头的修改、…

【深度学习】【OpenVINO】【C++】模型转化、环境搭建以及模型部署的详细教程

【深度学习】【OpenVINO】【C】模型转化、环境搭建以及模型部署的详细教程 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【OpenVINO】【C】模型转化、环境搭建以及模型部署的详细教程前言模型转换--pytorch转onnxWindows平台搭建…

我们可以用微服务创建状态机吗?

大家好,我是锋哥。今天分享关于【我们可以用微服务创建状态机吗?】面试题?希望对大家有帮助; 我们可以用微服务创建状态机吗? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 是的,微服务架构可…

为什么选择 Spring data hadoop

👉 请点赞支持这款 全新设计的脚手架 ,让 Java 再次伟大! spring-data-hadoop hbase 常见的操作方式有以下三种: Native Api 原生 api 操作繁琐,就像用 JDBC 操作关系型数据库一样,类似 flush、submit、…

Windows系统启动MongoDB报错无法连接服务器

文章目录 发现问题解决办法 发现问题 1)、先是发现执行 mongo 命令,启动报错: error: MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017; 2)、再检查 MongoDB 进程 tasklist | findstr mongo 发现没有进程&a…

【最全基础知识2】机器视觉系统硬件组成之工业相机镜头篇--51camera

机器视觉系统中,工业镜头作为必备的器件之一,须和工业相机搭配。工业镜头是机器视觉系统中不可或缺的重要组成部分,其质量和性能直接影响到整个系统的成像质量和检测精度。 目录 一、基本功能和作用 二、分类 1、按成像方式分 2、按焦距分 3、按接口类型分 4、按应用…

时间序列预测(九)——门控循环单元网络(GRU)

目录 一、GRU结构 二、GRU核心思想 1、更新门(Update Gate):决定了当前时刻隐藏状态中旧状态和新候选状态的混合比例。 2、重置门(Reset Gate):用于控制前一时刻隐藏状态对当前候选隐藏状态的影响程度。…

STM32实现毫秒级时间同步

提起“时间同步”这个概念,大家可能很陌生。一时间搞不清楚是什么意思。 我理解“时间同步”可以解决多个传感器采集数据不同时的问题,让多个传感器同时采集数据。 打个比方。两个人走路,都是100毫秒走一步(频率相同是前提&…

2024数学分析【南昌大学】

计算极限 lim ⁡ n → ∞ 2024 n ( 1 − cos ⁡ 1 n 2 ) n 3 1 + n 2 − n \mathop {\lim }\limits_{n \to \infty } \frac{{\sqrt[n]{{2024}}\left( {1 - \cos \frac{1}{{{n^2}}}} \right){n^3}}}{{\sqrt {1 + {n^2}} - n}} n→∞lim​1+n2 ​−nn2024 ​(1−cosn21​)n3​ …

XJ02、消费金融|消费金融业务模式中的主要主体

根据所持有牌照类型的不同,消费金融服务供给方主要分为商业银行、汽车金融公司、消费金融公司和小贷公司,不同类型机构定位不同、提供消费金融服务与产品类型也各不相同。此外,互联网金融平台也成为中国消费金融业务最重要的参与方之一,虽其并非持牌金融机构,但借助其流量…

React 分装webSocket

背景 AI 实时对话 需要流式数据 React Hooks 写法。新建WebSocket.tsx 放在根目录components import { useCallback, useRef, useState } from react;type MessageHandler (message: MessageEvent) > void; type ErrorHandler (event: Event) > void;export functi…

深度学习(一)基础:神经网络、训练过程与激活函数(1/10)

深度学习基础:神经网络、训练过程与激活函数 引言: 深度学习作为机器学习的一个子领域,近年来在人工智能的发展中扮演了举足轻重的角色。它通过模仿人脑的神经网络结构,使得计算机能够从数据中学习复杂的模式和特征,…

List、Set、数据结构、Collections

一、数据结构 1.1 常用的数据结构 栈 栈:stack,又称堆栈,它是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作。 简单的说:采用该结构的集合&#…

【网络协议栈】Tcp协议(下)的可靠性和高效性(超时重传、快速重传、拥塞控制、流量控制)

绪论: 承接上文,上文写到Tcp协议的结构以及对tcp协议的性能优化的滑动窗口,本章我们将继续了解Tcp协议的可靠性和高效性的具体展示。后面我将继续完善网络协议栈的网络层协议敬请期待! 话不多说安全带系好,发车啦(建议…

【AI绘画】Midjourney进阶:对角线构图详解

博客主页: [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 💯前言💯什么是构图为什么Midjourney要使用构图 💯对角线构图特点应用场景提示词书写技巧测试 💯小结 💯前言 【AI绘画】Midjourney进阶&a…

Linux常用命令1

切换目录 cd [rootlocalhost menge]# cd /[rootlocalhost /]# cd: cd [-L|[-P [-e]] [-]] [目录] 查看当前的目录 pwd 浏览目录内容 ls ls浏览后颜色表示 白色:普通文件 蓝色:目录 红色:压缩包文件 黄色:设备文件 绿…

以 6502 为例讲讲怎么阅读 CPU 电路图

开篇 你是否曾对 CPU 的工作原理充满好奇,以及简单的晶体管又是如何组成逻辑门,进而构建出复杂的逻辑电路实现?本文将以知名的 6502 CPU 的电路图为例,介绍如何阅读 CPU 电路图,并向你演示如何从晶体管电路还原出逻辑…

.NET Core WebApi第2讲:前后端分离,Restful

动态页面:数据流动 / Web服务器 / Ajax / 前后端分离 / restful风格源栈课堂一起帮https://17bang.ren/Code/261 一、Ajax:页面可以局部刷新 1、PPT演示:使用Ajax也无法减小带宽耗用 请求第一个页面,用AJAX从服务器端加载了一个页头。 请求第…

Maven进阶——坐标、依赖、仓库

目录 1.pomxml文件 2. 坐标 2.1 坐标的概念 2.2 坐标的意义 2.3 坐标的含义 2.4 自己项目的坐标 2.5 第三方项目坐标 3. 依赖 3.1 依赖的意义 3.2 依赖的使用 3.3 第三方依赖的查找方法 3.4 依赖范围 3.5 依赖传递和可选依赖 3.5.1 依赖传递 3.5.2 依赖范围对传…

ollama 在 Linux 环境的安装

ollama 在 Linux 环境的安装 介绍 他的存在在我看来跟 docker 的很是相似,他把市面上已经存在的大语言模型集合在一个仓库中,然后通过 ollama 的方式来管理这些大语言模型 下载 # 可以直接通过 http 的方式吧对应的 shell 脚本下载下来,然…