Java基础语法之类和对象

news2024/12/29 11:51:36

类的定义

类就是对一个实体的属性功能进行描述

类的定义格式

首先要用到class关键字;

其次,类名采用大驼峰形式例如Dog   ClassName   Student……

最后,类中包含该类的属性,即成员变量;以及该类的功能,即成员方法

例如:Dog类

public class Dog {
    //成员变量
    public String name;
    public int age;
    //成员方法
    public void bark(){
        System.out.println(name+" 正在汪汪叫");
    }
    public void eat(){
        System.out.println(name+" 正在吃饭");
    }
}

注意

1.一般,一个文件中只定义一个类

2.main方法所在的类一般要public修饰

3.public修饰的类一般要和文件名相同

4.当一个java文件中只有一个类时,修改Java文件名的同时就可以修改了类名,但当有多个类时,修改Java文件名的同时无法同时修改类名。

类的实例化

什么是实例化

用类创建对象的过程就是实例化

在main方法中创建了dog

1.new关键字用于创建一个对象的实例

2.使用 . 来访问对象中的属性和方法

注意

1.对于Dog dog=new Dog();  Dog是一个类,是用户自定义类型     而dog是main方法中的局部变量,它的内存是在栈上,它存放了一个地址,这个地址指向堆上的一块空间,这块空间是通过new关键字开辟的,用来存放Dog类实例化出的一个对象。

this引用

什么是this引用

this引用指向了当前对象(即用new实例化出的对象)

this引用指向成员变量

在成员方法中对所有成员变量的操作都是通过this引用完成的


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

public class Test1 {
    public static void main(String[] args) {
        Date date=new Date();
        date.setDate(1998,12,22);
        System.out.println(date.year);
        System.out.println(date.month);
        System.out.println(date.day);

    }
}

this引用调用成员方法


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;
        this.print();//这就是调用成员方法,此时在main方法中没必要再打印
    }
    public void print(){
        System.out.println(this.year);
        System.out.println(this.month);
        System.out.println(this.day);

    }
}

public class Test1 {
    public static void main(String[] args) {
        Date date=new Date();
        date.setDate(1998,12,22);
    }
}

为什么要有this引用

当成员方法中的形参名不小心与成员变量名相同时


class Date{
    public int year;
    public int month;
    public int day;
    public void setDate(int year,int month,int day){
        year=year;
        month=month;
        day=day;
        this.print();
    }
    public void print(){
        System.out.println(this.year);
        System.out.println(this.month);
        System.out.println(this.day);

    }
}

public class Test1 {
    public static void main(String[] args) {
        Date date=new Date();
        date.setDate(1998,12,22);
    }
}

这时输出的是0 0 0

因为year=year不知道到底是谁给谁赋值

所以应该

注意

1.this只能在成员方法中使用

2.this是成员方法中的第一个隐藏参数,编译器会自动传递,在成员方法执行时,编译器会自动将调用该成员方法的对象的引用传递给该成员方法,this就负责接收这个引用

3.编译时,编译器会在所有没加this.的成员变量前自动添加上this.

public void print(){
   System.out.println(year);
   System.out.println(month);
   System.out.println(day);
}

上面的这个就等价于:

public void print(Date this){
    System.out.println(this.year);
    System.out.println(this.month);
    System.out.println(this.day);

对象的构造及初始化

如何初始化对象

刚刚我们写了一个date类,通过自己写的setDate方法对对象进行了初始化,但这样很麻烦,每次新建一个类就得调用方法

构造方法

为了可以在实例化对象的同时对对象进行初始化,我们引入构造方法的概念

什么是构造方法

构造方法时一个特殊的成员方法,名字必须与类名相同,无任何返回值,void也不可以加。

会在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次

默认的构造方法

这是系统会自动添加的构造方法,无任何参数

构造方法的作用

只负责对对象进行初始化,并不负责给对象开辟空间

那么默认的初始值是什么呢?

对于整型,初始值为0

对于char,初始值为'\u0000'

对于float,是0.0f

对于double,是0.0

对于Boolean,是false

对于引用类型,是null。

构造方法的重载

要想在实例化对象时就给对象赋想要的值,我们就需要自己写一个构造方法,也就是方法的重载,之前讲过,重载就是方法名相同,返回值和参数列表可以不同

但要是写一个构造方法的重载,就不能加任何参数了

这就是自己写的构造方法,那如何实例化对象?如下

date1为什么会报错?

因为我们自己写了一个带参数的构造方法,系统就不会再提供不带参数的构造方法,所以括号里不传参就会报错。

date2就是调用了我们自己写的构造方法,就不会报错

那怎么让date1也不报错?同时写俩个构造方法,一个带参数,一个不带

此时就不会报错

this调用构造方法

这个语法只能是在构造方法中。也就是说,在构造方法中,可以用this调用其他构造方法

这就是在无参的构造方法中调用了有参的构造方法

注意:

1.不要用  . 来调用,直接就是this加括号

2.此调用语句只能出现在构造方法的第一条语句,因为只有执行完一个构造方法了,对象才真正生成,才能执行其他任务

3.不能形成环,如下

static成员

对于一个学生类,他们可以在一个班级,那么班级这个成员变量就可以被设置为static,

static修饰成员变量

在Java中,被static修饰的成员变量叫做静态成员,也叫做类成员,顾名思义,它不属于某个具体的对象,而是所有对象所共享的,它是专属于这个类的。

被static修饰的成员变量被存储在方法区,而不是堆上

举例

如上,通过student1给classroom赋值后,可以直接用student2来访问classroom。这是为什么呢?这就要看看static修饰后的本质了

本质

通过调试,发现classroom不属于任何一个对象,而且编译器提供的构造函数中没有classroom这个选项

它实际上是类的属性,不存储在某个对象的空间中

如何访问被static修饰的成员变量

1.可以用对象来访问

2.可以直接用类来访问

3.因为可以用对象来访问,所以可以在构造方法或普通成员方法中用this引用来访问静态变量

4.更推荐使用类名来访问它

如果这个静态变量的访问权限是private,那如何对他访问呢?

这时就要引入静态成员方法了

statiic修饰成员方法

被static修饰的成员方法是静态成员方法,是类的方法,不是某个对象所特有,

注意

1.在静态方法中不能调用非静态成员变量或非静态成员方法,this也不能在静态成员方法中出现,但非静态成员方法可以调用静态成员方法

这是错误的,因为this引用是依赖具体对象的,而静态方法不依赖对象,它的参数中就没有默认的this,所以不能使用this

2.静态方法无法重写,不能来实现多态,这一点会在多态里面讲

代码块

分类

普通代码块

用{}定义的,放在方法内部的代码块

静态代码块

用static{}定义的,一般用于初始化静态成员变量

特点:

1.它在整个类当中只执行一次,不管生成几个对象

虽然创建了三个对象,但只执行了一次静态代码块

2.它是在类加载的时候就执行

虽然没有创建任何变量,但在main方法中引用了Student类,所以静态代码块也执行了

构造代码块/实例代码块

定义在类中,方法外的代码块,一般用于初始化实例成员变量

特点:

1.它是在创建对象的时候执行,有几个对象就执行几次

执行顺序

会发现,先执行静态代码块,再执行构造代码块,最后执行构造方法,这个大顺序不会被我们所写的代码的顺序影响,即使将构造方法写到静态代码块的上方,它也是最后执行

但要是有俩个同样的代码块,则按先后顺序执行,如下

结果就是按顺序执行,最终班级是1003

实际上,在编译时,会将同类型的代码块编译成一个:

对象的打印

到目前,我们想打印对象,要自己写一个show方法,每次打印都要调用它

那能否不写show方法呢?

重写toString方法

这是直接打印时出现的结果:包名.类名.哈希值  这是怎么出现的?我们来看看源码

最后一张就是追根溯源到了最终的toString方法,它的返回值是String

那要想默认打印出对象的各个属性,就要重写toString方法

这就是打印出来的结果,再极端一点:

所以说,当你重写了toString方法后,就不再调用系统已有的方法了

什么是重写

简单来说就是不改变方法名,参数和返回值,只改变内部的实行方式

这会在多态,动态绑定里面讲到

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

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

相关文章

HelpLook VS Confluence:知识管理方面谁更有优势?

多年来,在线协作和文档工具市场一直被Confluence所主导。Confluence由Atlassian于2004年创立,很迅速地成为企业寻求强大而全面的协作解决方案和知识管理的热门选择。然而,随着新工具如Notion和HelpLook的出现,市场格局发生了变化&…

各地加速“双碳”落地,数字能源供应商怎么选?

作者 | 曾响铃 文 | 响铃说 随着我国力争2030年前实现“碳达峰”、2060年前实现“碳中和”的“双碳”目标提出,为各地区、各行业的低碳转型和绿色可持续发展制定“倒计时”时间表,一场围绕“数字能源”、“智慧能源”、“新能源”等关键词的创新探索进…

十六 动手学深度学习v2计算机视觉 ——样式迁移

文章目录 基于CNN的样式迁移 基于CNN的样式迁移 我们通过前向传播(实线箭头方向)计算风格迁移的损失函数,并通过反向传播(虚线箭头方向)迭代模型参数,即不断更新合成图像。 风格迁移常用的损失函数由3部分组…

【lombok】从easyExcel read不到值到cglib @Accessors(chain = true)隐藏的大坑

背景: 在一次使用easyExcel.read 读取excel时,发现实体类字段没有值,在反复测试后,发现去掉Accessors(chain true)就正常了,为了验证原因,进行了一次代码跟踪 由于调用链路特别长,只列举出部分代码&#x…

141 环形链表

解题思路: \qquad 最容易想到的方法,就是遍历链表同时用哈希表unordered_map把节点存下来: \qquad\qquad 遇到重复节点则认为存在环,返回true; \qquad\qquad 遍历到nullptr,则链表中不存在环&#xff0c…

使命召唤9缺少buddha.dll的解决方法分享,如何快速修复buddha.dll

《使命召唤》系列作为备受欢迎的第一人称射击游戏,经常会在新作发行后引起广大玩家的讨论。最近,《使命召唤9》玩家中出现了一个常见的技术问题:游戏无法启动,因为系统找不到 buddha.dll 文件。这篇文章将探讨 buddha.dll 的相关信息、丢失原…

奥比中光 Femto Bolt相机ROS配置

机械臂手眼标定详解 作者: Herman Ye Auromix 测试环境: Ubuntu20.04/22.04 、ROS1 Noetic/ROS2 Humble、X86 PC/Jetson Orin、Kinect DK/Femto Bolt 更新日期: 2023/12/12 注1: Auromix 是一个机器人爱好者开源组织。 注2&#…

机器学习笔记 - 基于C# + .net framework 4.8的ONNX Runtime进行分类推理

该示例是从官方抄的,演示了如何使用 Onnx Runtime C# API 运行预训练的 ResNet50 v2 ONNX 模型。 我这里的环境基于.net framework 4.8的一个winform项目,主要依赖下面版本的相关库。 Microsoft.Bcl.Numerics.8.0.0 Microsoft.ML.OnnxRuntime.Gpu.1.16.3 SixLabors.ImageShar…

“百里挑一”AI原生应用亮相,百度智能云千帆AI加速器首个Demo Day来了!

作者简介: 辭七七,目前大二,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&#x1f…

机器视觉系统选型-同轴光源分类及应用场景

同轴光源 从与相机同轴的方向均匀照射漫射光 Mark点定位条码识别二维码识别反光物体表面缺陷检测 高亮同轴光源 照射光线与水平方向成低角度夹角Mark点定位反光件表面凹坑、损伤、缺陷印刷电路板二维码识别 平行同轴光源 从与相机同轴方向照射平行度高 的平行光尺寸测量玻璃检…

Linux---Ubuntu操作系统

1. Ubuntu操作系统的介绍 Ubuntu操作系统是属于Linux操作系统中的一种,它是免费、稳定又可以拥有绚丽界面的一个操作系统 2. Ubuntu图形界面的介绍 任务栏 窗口操作按钮 窗口菜单条 任务栏效果图: 窗口操作按钮效果图: 窗口菜单条效果图: 3. 与Windows目录结…

单变量线性回归的机器学习代码

本文为学习吴恩达版本机器学习教程的代码整理,使用的数据集为https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes/blob/f2757f85b99a2b800f4c2e3e9ea967d9e17dfbd8/code/ex1-linear%20regression/ex1data1.txt 将数据集和py代码放到同一目录中,使…

HarmonyOS(二)—— 初识ArkTS开发语言(下)之ArkTS声明式语法和组件化基础

前言: 通过前面ArkTS开发语言(上)之TypeScript入门以及ArkTS开发语言(中)之ArkTS的由来和演进俩文我们知道了ArkTS的由来以及演进,知道了ArkTS具备了声明式语法和组件化特性,今天,搭…

计网 - 如何理解 Mac地址 、 IP地址 、端口号

文章目录 概述Mac地址IP 地址IP 地址和 MAC 地址之间的区别端口号为什么端口号有 65535 个?端口号的确定标准既定的端口号时序分配法 观察端口号 小结 概述 Mac地址(Media Access Control Address)和IP地址(Internet Protocol Ad…

蓝桥杯小白赛第一场(1~6)(期望DP)

1、模拟 2、贪心 3、前缀和 4、猜结论 5、双指针 6、期望DP 1. 蘑菇炸弹 思路&#xff1a;一个简单的暴力模拟。 #include <bits/stdc.h> using namespace std; int main() {int n;cin >> n;vector<int>a(n , 0);for(int i 0 ; i < n ; i )cin &…

西南交通大学【数据结构实验8】

实验内容及要求&#xff1a; 编写控制台应用程序&#xff0c;提供以下菜单项&#xff1a; 插入元素 从键盘输入若干两两互不相同的非0整数&#xff0c;直到输入0时停止。将输入的所有非0整数按输入次序插入二叉排序树(初始时是空树)。 插入某个非0整数时&#xff0c;若该整…

Linux——基本指令(二)

​ 个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C语言小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 写在前面&#xff1a; 紧接上一章&#xff0c;我们在理解接下来的命令之前&#xff0c…

IEEE Transactions on Industrial Electronics工业电子TIE论文投稿须知

一、背景 IEEE TIE作为控制领域的TOP期刊&#xff0c;接收机器人、控制、自动驾驶、仪器和传感等方面的论文&#xff0c;当然范围不止这些&#xff0c;感兴趣的可以自行登录TIE官网查看。所投稿论文必须经过实验验证&#xff0c;偏工程应用类&#xff0c;当然也必须有方法上的…

Qt之自定义QToolTip,去掉显示动画和隐藏延时

一.效果 先来看看Qt原生QToolTip的缺点: 1.当提示内容无变化时,弹窗无法移动。只能先传个空字符串强制弹窗隐藏,然后在新位置再传个字符串。 If the text is the same as the currently shown tooltip, the tip will not move. You can force moving by first hiding the t…

LTspice 中电容的类型

目录 背景钽电容、铝电容陶瓷电容新电容技术聚合物铝电容 背景 在 LTspice 中仿真电路时&#xff0c;需要选择合适的电容&#xff0c;由于刚接触 LTspice 和模拟电路&#xff0c;所以不清楚如何选择与实际常用电容对应的型号&#xff0c;于是整理了一个类型列表&#xff0c;方…