JavaSE的类和对象你真的了解吗
作者:星鸦wyk 发布时间:2021-09-17 21:14:59
1.基本概念
首先我们需要弄清楚几个概念:面向对象是什么、类是什么、对象又是什么?还是逐个来说
1.1面向对象
我们常说Java是面向对象的语言,C语言是面向过程的语言,那面向对象是什么,它和面向过程的区别在哪?
面向对象是解决问题的一种思想,其核心是依靠对象之间的交互来解决事情
至于面向对象和面向过程的区别,假设现在有一道数学题:
面向过程:你自己进行手算,你需要关注套用什么公式,如何化简、哪些条件组合可以推出什么结论等,中间有一个环节出错都不行
面向对象:你把问题给计算机,让计算机解决,我们关注的只是人和计算机这两个对象如何交互
这么看面向对象好像比面向过程更高级,但其实二者没有好与坏之分,它们都有自己专门的应用场景,就比如数学考试的时候题目你就只能自己写( ̄▽ ̄)
1.2类和对象
类:对一个实体的描述
对象:类的实例化
假设你要设计某个东西,类就是你所画的图纸,对象则是你通过图纸造出来的实物;一个类可以产生多个对象
2.类的定义及使用
2.1定义
在定义类的时候需要使用一个关键字:class
具体语法如下:
class ClassName {
field;
method;
}
ClassName
:类名field
:成员变量method
:成员方法
我们现在定义一个类Book,里面成员变量包括书名、作者和价格,成员方法就是打印所有成员变量
文章后面的概念都会围绕这个类来进行讲解
2.2类的实例化
在main方法中实例化一个对象用到的关键字:new
代码如下:
Book book1 = new Book();
之后便可以使用“.”来访问类中的成员变量和成员方法,如下:
之前我们说过Java中的变量都要初始化,类里面的成员变量也不例外,如果成员变量未初始化,那么默认是对应的数据类型的0值
整型变量是0,浮点数是0.0,布尔类型为false,引用类型为null,char为'\u0000'
3.this引用
3.1访问成员变量
我们现在往类里面再增加一个方法setBook,用这个方法来对成员变量进行初始化
public void setBook(String name,String author,int price) {
name=name;
author=author;
price=price;
}
我们再来看一下结果:
为什么全部都是0值?
其原因在于方法的参数名和成员变量名相等,形参因为数局部变量,所以程序认为方法里面的name等变量全部都是形参
我们只需要将等号左边的变量加上this就可以解决这个问题
this代表的是当前对象的引用(谁调用了this,谁就是当前对象)
上图中book1调用的setBook方法,所以 book1是当前对象,方法中的this.name等变量就相当于告诉程序这个不是方法的形参,而是对象book1的成员变量
3.2访问成员方法
这个比较好理解,就是在方法里面引用类中的其它方法,但注意一点:引用不能成环
假设setBook里面引用了show方法,那么show方法里面就不能再引用setBook,否则就乱套了
还有一点需要补充:
上面提到过一个类可以产生多个对象,那么多个对象调用同一个方法,程序如何分辨是哪个对象调用的?
依旧是this引用
类中的方法起始都有一个隐式的this参数,通过this知道是哪个对象调用的方法,也就是说setBook方法其实是有4个参数,如下:
public void setBook(Book this,String name,String author,int price) {
this.name=name;
this.author=author;
this.price=price;
}
除了访问成员方法外,this还可以调用本类其它构造方法,这一点在构造方法中再介绍
3.3this引用的特性
1.只能在成员方法中使用
2.是成员方法的第一个隐藏的参数
3.在成员方法中只能引用当前对象(在对象Book1中使用this就只能引用Book1,不能引用对象Book2)
4.为对应类的类型引用,即哪个对象调用就是哪个对象的引用类型
4.构造方法
构造方法也是成员方法,但它比较特殊,对象的初始化除了在main方法中使用“.”一个一个初始化外还可以使用构造方法
在实例化一个对象的时候一定会经过两个步骤:
分配内存
调用合适的构造方法
如果用户没有写构造方法,编译器会默认提供一个不带参数的构造方法,写了就调用用户自己写的构造方法
4.1构造方法的特点
方法名要和类名相同
没有返回值,即使是写void也不行
在整个对象的声明周期内只能调用一次
可以重载
我们写一个构造方法如下:
public Book(String name, String author, int price) {
this.name = name;
this.author = author;
this.price = price;
}
那么初始化对象如下:
4.2this在构造方法中使用
上面提到构造方法可以重载,那么我们再写一个没有参数的构造方法
public Book() {
}
this在构造方法中可以调用其它的构造方法,比如我在没有参数的构造方法中调用上面的有三个参数的构造方法
注意:
this同样不能成环
this必须放在构造方法的第一行
来源:https://blog.csdn.net/qq_52989768/article/details/123762440


猜你喜欢
- Java中多态性的实现什么是多态面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念
- 要说在 Spring Boot 中注册过滤器有三种方式,你都能想到哪些呢?今天松哥就来和大家聊一聊 Spring Boot 中注册过滤器的三
- 目录一、首先模型本身需要特殊处理二、编写Shader三、讲解先上图看看效果:下面详细分享一下制作步骤吧:一、首先模型本身需要特殊处理二、编写
- @ApiImplicitParam作用在方法上,表示单独的请求参数参数name:参数名。value:参数的具体意义,作用。required:
- Remote Debug 综述当我们的后台项目部署到服务器上时,由于环境和本地不同,有时候也会有一些奇奇怪怪的问题出现。只依赖服务器上的日志
- 实现步骤step1:添加乐观锁 * MP的其他 * 功能可以参考官网@Beanpublic MybatisPlusInterceptor m
- 1、前言Android Studio对模块化开发提供的一个很有用的功能就是可以在主项目下新建库项目(Module),但是在使用库项目时却有一
- 先看效果图一、申请成为百度开发者,获得使用地图API接口的权限,获取(AK)码。1.打开百度地图开放平台打开网址:http://lbsyun
- 微信开发API如何接入服务器,下面就为大家进行介绍一、说明* 本示例根据微信开发文档:http://mp.weixin.qq.com/wik
- 我们在使用一些开源调度系统(比如:elastic-job等)的时候,对于任务的执行时间通常都是有规律性的,可能是每隔半小时执行一次,或者每天
- 背景之前我不想用注解来写启动框架,因为启动框架需要的参数太多了。将参数都定义在注解内和写一个task就没有本质上的差别,所以一直觉得没必要用
- 在hibernate5中,有了一些新的变动: 新引导 APISpatial/GIS 支持Java 8 支持扩展 AUTO
- volatile关键字相信了解Java多线程的读者都很清楚它的作用。volatile关键字用于声明简单类型变量,如int、float、boo
- 如果所有的键都是小整数,我们可以使用一个数组来实现无序的符号表,将键作为数组的索引而数组中键 i 处存储的就是它对应的值。散列表就是用来处理
- 进程之间的通信是为了解决不同进程之间的数据传输问题,这样可以让不同程序交互数据。实现进程通信的方式:1、剪切板;2、COM;3、内存映射文件
- 一、开篇通过对之前Java之路的了解之后,相信初学者们都对Java有了一个比较深印象的了解了。但是事情不能总停留在理论层面,还得多多实现,才
- 十进制整数与其他进制的字符串之间的转换。c#中十六进制用前缀0x表示。int c = 0x1000;一、利用Convert.ToString
- 本文实例讲述了C#实现XML与实体类之间相互转换的方法。分享给大家供大家参考,具体如下:using System;using System.
- 这里说是框架,说的大了点,其实没有那么复杂,只是一个容易扩展的基类而已。不过至少算是框架类的代码。package arui; i
- 逆时针画圆弧,原理:将360度分割成36份,分别标出每10度角度时的坐标点,然后将每个点连接起来。 #include <io