Java宝典-类和对象

news2024/9/24 17:51:23

目录

  • 1.面向对象
    • 1.1 面向过程与面向对象
  • 2. 类的定义和使用
  • 2.1 如何定义类
  • 3.类的实例化
  • 4.this引用
  • 5.构造方法
    • 5.1 什么是构造方法
    • 5.2 构造方法的特点
  • 6.包
    • 6.1 导包
    • 6.2 自定义包
  • 7.封装
  • 8.访问限定符
  • 9.static
    • 9.1 static修饰的成员变量
    • 9.2 static修饰的成员方法
  • 10.代码块
    • 10.1 普通代码块
    • 10.2 构造代码块
    • 10.3 静态代码块

Java宝典更新啦!今天我们学习类和对象

1.面向对象

在介绍类和对象之前,我们先了解一下什么是面向对象

1.1 面向过程与面向对象

面向对象编程又称Object Oriented Programming,简称OOP,我们听说过的Java,c++都是一门面向对象编程语言.面向过程更注重一件事完成的过程,而面向对象往往会省略一些细节.
举个例子:
如何把大象放进冰箱?面向过程会关心:大象这么大怎么把它塞进去;面向对象则是:第一步:打开冰箱门,把大象塞进冰箱,关掉冰箱门,至于如何把大象塞进去,我们并不关心.

2. 类的定义和使用

类是用来描述一个对象的,例如建筑图纸,它可以描述一栋房子的属性(面积,建筑高度等),

2.1 如何定义类

Java中定义类的语法如下:

class 类名{
成员属性//成员变量
成员方法/行为
}

举个例子:
定义一个狗狗的类:

class Dog{
	public String name;
	public int age;
	public void eat(){
		System.out.println("吃饭");
	}
}

在上述类中,name和age就是Dog这个类的属性/成员变量,狗狗有自己的名字,年龄.除了有这些属性以外,狗狗也有吃饭这个行为,所以eat方法也叫成员方法或者行为.
需要注意的是:

方法名建议采用大驼峰定义
public和static是啥意思我们后续介绍,目前先按照这个方式写~

3.类的实例化

定义了类相当于定义了一个新的类型,与intf,loat这些内置类型有些类似.有了内置类型我们就可以定义一些变量,有了这些自定义的类类型我们就能很好的描述一个对象.用类类型创建对象的过程就叫做类的实例化.就比如说,光有建筑图纸怎么呀!我们得造一个真正的房子!那么如何实例化一个对象?很简单!通过new关键字:

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

我们拿上面的狗狗类举例:

Dog dog1 = new Dog();

创建好了一个对象,可以通过点号访问该对象的成员变量和成员方法.

4.this引用

想象一个场景:创建一个日期类,成员变量有年,月,日,成员方法setDate的功能是通过参数传递来设置日期,printDate打印我们设置的日期.
如下代码:

class Date {
    public int year;
    public int month;
    public int day;

    public void setDate(int y, int m, int d) {
        year = y;
        month = m;
        day = d;
    }

    public void printDate() {
        System.out.println(year + "-" + month + "-" + day);
    }
}

在main方法中调实例化一个对象,

    public static void main(String[] args) {
        Date d1 = new Date();
        d1.setDate(2024, 3, 1);
        d1.printDate();
    }

运行结果:
在这里插入图片描述
假如我们把printDate的形参名改成和成员变量名一样会怎么样呢?
我们再次运行:
在这里插入图片描述

可以发现,结果并不是我们想要的!这是为何?回答这个问题前,我们先得了解Java程序是如何运行的,以及Java虚拟机对内存的划分.
首先:Java程序的运行时,代码需要加载到内存当中,某些数据也需要存放在内存中,而我们的Java虚拟机可以帮我们完成这个工作!
Java虚拟机将内存划分了五个区域,如图
在这里插入图片描述
目前我们只需要了解两点:

  1. 虚拟机栈:方法调用时会在栈上开辟栈帧,栈帧中会保存局部变量
  2. 堆:new创建的对象是在堆上保存
    由此我们能知道通过Date创建的对象d1的内存布局
    在这里插入图片描述
    当调用setDate方法时,会在栈上开辟栈帧,如果形参名和成员变量名重复,局部变量优先原则,
    下面代码中的year,month,day都表示形参
year = year;
month = month;
day = day;

那么,我们就是想让形参名和成员变量名重复,并且还要表示成员变量,怎么做?加上this点号!
改正之后的代码就是:

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

代码中加了this.的year代表的是成员变量,不加this.的year就代表形参year
原理:我们在类中定义的方法,参数列表会有隐藏的参数this,只是我们看不到而已
完整的参数应该是这样的:

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

我们实例化对象时,编译器会自动帮我们把对象的引用传递过去让this接收,无需手动.所以this也表示当前对象的引用,一般情况下我们不会让形参和成员变量同名,所以不加this也是可以的,但是我们建议要习惯加上this.

5.构造方法

5.1 什么是构造方法

构造方法是一个特殊的成员方法,该方法名字必须和类名相同,构造方法没有返回值,在创建对象时,编译器会自动调用构造方法

5.2 构造方法的特点

  1. 名字与类名相同
  2. 没有返回值,void也不行
  3. 构造方法可以重载,用户可以自己提供带一个或者多个参数的构造方法
  4. 如果用户不提供构造方法,编译器会默认提供一份不带参数的构造方法,如果用户自己提供了构造方法,编译器则不会再提供不带参数的构造方法
  5. 如果构成重载,可以通过this(…)在某个构造方法中调用其他构造方法,但是this(…)必须在第一条语句中,并且不能成环调用
    拿Date类举例:
//不带参数的构造方法
    public Date() {
        this(2024);//调用带一个参数的构造方法
    }

    //带1个参数的构造方法
    public Date(int year) {
    	//this();会报错,因为不带参数的构造方法已经调用过本方法,而本方法又调用不带参数的构造方法,形成环
    }

    //带2个参数的构造方法
    public Date(int year, int month) {
		
    }

    //带3个参数的构造方法
    public Date(int year, int month, int day) {

    }

6.包

为了更好地管理类,把多个相关联的类整理在一起的组合称为包,类似文件夹,一个文件夹中有很多个相关联的文件

6.1 导包

通过import可以导入某个包里面的类,例如:使用Arrays类,可以使用import java.util.Arrays;来导入Arrays类

6.2 自定义包

用户可以自定义包,在IDEA中自定义包的步骤
在这里插入图片描述
自定义包在文件中第一行最好加上package语句声明该代码在哪个包,不过没关系~ IDEA会自动添加!

7.封装

封装,继承,多态是面向对象的三大特性.类和对象主要研究的是封装.封装可以简单理解为:将数据和操作数据的方法有机结合,隐藏对象的属性和实现细节,只提供公开的接口来和对象进行交互.在Java中通过访问权限来实现封装

8.访问限定符

Java中有三种访问限定符,四种访问权限
访问限定符有:private,protected,public.private表示私有访问权限,public表示公开访问权限,如果什么都不加表示默认的权限,protected主要运用在继承中,后续介绍.
在这里插入图片描述

9.static

9.1 static修饰的成员变量

被static修饰的变量叫做静态成员变量,被static修饰之后,该变量也就不属于某个具体的对象了,而是属于类(也称类变量),所有对象都共享,类变量储存在方法区中.

class Student {
    public String name;
    public int age;
    public static String classname;
}

访问static修饰的变量一般通过类名访问,通过对象也是可以的,但是推荐使用类名访问

public static void main(String[] args) {
        Student stu1 = new Student();
        Student.classname = "Java1班";
        System.out.println(Student.classname);
    }

输出结果:
在这里插入图片描述
需要注意的是:即使不创建对象,也能访问static修饰的成员变量,这更加说明了静态变量不属于某个具体的对象,而是属于类

9.2 static修饰的成员方法

被static修饰的方法称为静态成员方法,和静态成员变量一样,它不属于某个具体的对象,而是类方法,它也可以通过对象调用,也可以通过类名调用,更推荐使用类名调用.
注意:静态成员方法不依赖于对象,不能在静态方法中访问非静态的成员,也不能使用this

class Student {
    public String name;
    public int age;
    public static String classname;

    public static void staticFunc() {
         Student.classname = "Java1班";
         System.out.println(classname);
//        System.out.println(this.age);//错误
        System.out.println("静态方法");
    }
}
public static void main(String[] args) {
        Student.staticFunc();
        Student stu1 = new Student();
        stu1.staticFunc();
    }

输出结果:
在这里插入图片描述

10.代码块

用{}定义的一段代码叫代码块,代码块分为以下几种:

  • 普通代码块
  • 构造代码块
  • 静态代码块
  • 同步代码块(目前接触不到,学习多线程时介绍)

10.1 普通代码块

普通代码块就是定义在方法中的代码块.

public class Main {
    public static void main(String[] args) {
        {
            System.out.println("普通代码块");
        }
    }
}

10.2 构造代码块

构造代码块就是定义在类内部,方法外部并且不加修饰符的代码块,也叫实例代码块

class Student {
    public String name;
    public int age;

    {
        System.out.println("构造/实例代码块");
    }

    public void func() {
        //.......
    }
}

构造代码块一般用于初始化实例成员变量(非静态),实例代码块在创建对象时才会执行

10.3 静态代码块

在类中用static修饰的变量叫静态代码块
,一般用于初始化静态成员变量

class Student {
    public String name;
    public int age;

    {
        System.out.println("构造/实例代码块");
    }

	static{
        System.out.println("静态代码块");
    }
    public void func() {
        //.......
    }
}

注意事项:

  1. 不管生成多少个对象,静态代码块都只执行一次
  2. 如果包含多个静态代码块,编译器会按代码书写顺序执行
  3. 静态代码块在jvm加载类时开辟空间并且初始化

未完待续…

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

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

相关文章

大数据信用报告如何查询?有哪些需要注意的?

大数据信用对于有资金周转的人来说是比较重要的,主要由于大数据信用无形的被不少机构用于贷前风控,无论是机构要求的还是自查,提前了解大数据信用情况是常规操作,那大数据信用报告如何查询?有哪些需要注意的呢?本文详细为大家讲…

Linux使用基础命令

1.常用系统工作命令 (1).用echo命令查看SHELL变量的值 qiangziqiangzi-virtual-machine:~$ echo $SHELL /bin/bash(2).查看本机主机名 qiangziqiangzi-virtual-machine:~$ echo $HOSTNAME qiangzi-virtual-machine (3).date命令用于显示/设置系统的时间或日期 qiangziqian…

数据结构篇十:红黑树

文章目录 前言1. 红黑树的概念2. 红黑树的性质3. 红黑树节点的定义4. 红黑树的插入4.1 情况一: cur为红,p为红,g为黑,u存在且为红4.2 情况二: cur为红,p为红,g为黑,u不存在/u存在且为黑。4.2.1 …

图论 - Trie树(字符串统计、最大异或对)

文章目录 前言Part 1:Trie字符串统计1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 Part 2:最大异或对1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 前言 本篇博客将介绍Trie树的常见应用,包括:Trie…

30道python自动化测试面试题(全)

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号【互联网杂货铺】,回复 1 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、什么项目适合做自动化测试? 关键字:…

【Pytorch】论文复现 Vision Transformer (ViT)

文章目录 0. 进行设置1. 获取数据2. 创建Dataset和DataLoader3. 复现 ViT 论文:概述4. Equation 1: 将数据拆分为 patch 并创建类、位置和 patch 嵌入5. Equation 2: Multi-Head Attention (MSA)6. Equation 3: Multilayer Perceptron (MLP)7. 创建 Transformer 编码…

【计算机网络_应用层】协议定制序列化反序列化

文章目录 1. TCP协议的通信流程2. 应用层协议定制3. 通过“网络计算器”的实现来实现应用层协议定制和序列化3.1 protocol3.2 序列化和反序列化3.2.1 手写序列化和反序列化3.2.2 使用Json库 3.3 数据包读取3.4 服务端设计3.5 最后的源代码和运行结果 1. TCP协议的通信流程 在之…

每个人都应该知道的AI大模型:通往智能未来的桥梁

人工智能大模型已成为我们通往智能未来的桥梁。这些模型,如OpenAI的GPT-4,不仅是技术的巅峰,更是人类智慧的结晶。在这篇文章中,我们将深入探讨AI大模型的重要性,它们是如何工作的,以及它们对社会的潜在影响…

算法------(13)KMP

例题:(1)AcWing 831. KMP字符串 。。其实写完也不太理解。。随便写点吧 KMP就是求next数组和运用next的数组的过程。相比传统匹配模式一次更新一单位距离的慢速方法,next数组可以让下表字符串一次更新n - next【n】个距离&#x…

Java项目layui分页中文乱码

【问题描述】这部分没改之前中文乱码。 【解决办法】在layui.js或者layui.all.js文件中替换共、页、条转换成Unicode码格式。 字符Unicode共&#x5171页&#x9875条&#x6761【完美解决】改完之后重新运行项目,浏览器F12缓存清除就好了,右键

从键盘输入5个整数,将这些整数插入到一个链表中,并按从小到大次序排列,最后输出这些整数。

设节点定义如下struct Node {int Element; // 节点中的元素为整数类型struct Node * Next; // 指向下一个节点 }; 从键盘输入5个整数,将这些整数插入到一个链表中,并按从小到大次序排列,最后输出这些整数。注释那段求指出错误,求解…

【QT+QGIS跨平台编译】之六十二:【QGIS_CORE跨平台编译】—【错误处理:未定义类型QgsPolymorphicRelation】

文章目录 一、未定义类型QgsPolymorphicRelation二、解决办法一、未定义类型QgsPolymorphicRelation 报错信息: 错误原因为,使用了未定义类型 QgsPolymorphicRelation 二、解决办法 QgsRelation.h文件中 ①注释第36行: //class QgsPolymorphicRelation;②注释第414行: …

leetcode括号生成

题目描述 解题思路 首先看到题目,一开始是并没有思路的。这时候可以在纸上进行演算一下结果。当只有一对括号的时候,我们可以得知结果[“()”],当有两对括号的时候,我们可以发现,括号在第一个基础上,要么在括号内部出…

Java中心校智慧校园智慧班牌物联网平台源码

目录 智慧班牌 班牌首页 班级信息 课表信息 视频 图片 进离校管理 人脸登录页 学生个人中心 请假管理 成绩管理 家长留言 学生绑卡 学生评价 系统设置 通知管理 值日管理 倒计时 班级德育 班牌模式 1.课堂授课模式 2.家长会签到模式 3.考场模式 4.班级…

MySQL:错误ERROR 1045 (28000)详解

1.问题说明 有时候我们登录Mysql输入密码的时候,会出现这种情况: mysql -u root -p Enter Password > ‘密码’ 错误:ERROR 1045 (28000): Access denied for user ‘root’‘localhost’ (using password: YES) 或者:错误…

本届挑战赛季军方案:构建由大模型辅助的基于多模态数据融合的异常检测、根因诊断和故障报告生成系统

DDopS团队荣获本届挑战赛季军。该团队来自中山大学计算机学院Intelligent DDS 实验室。实验室主要方向为云计算、智能运维(AIOps)、软件定义网络、分布式软件资源管理与优化、eBPF 性能监控与优化等。 选题分析 基于对竞赛数据的洞察和对时代趋势的考量,我们尝试应…

YOLOv9改进|增加SPD-Conv无卷积步长或池化:用于低分辨率图像和小物体的新 CNN 模块

专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,主力高效涨点!!! 一、文章摘要 卷积神经网络(CNNs)在计算即使觉任务中如图像分类和目标检测等取得了显著的成功。然而,当图像分辨率较低或物体较小时&…

02-设计概述

上一篇:01-导言 本章重点讨论 JNI 中的主要设计问题。本节中的大多数设计问题都与本地方法有关。调用 API 的设计将在第 5 章:调用 API 中介绍。 2.1 JNI 接口函数和指针 本地代码通过调用 JNI 函数来访问 Java 虚拟机功能。JNI 函数可通过接口指针使用…

基于SpringBoot的企业头条管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

springBoot整合Redis(二、RedisTemplate操作Redis)

Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅&…