浅谈类和对象

浅分享所学的类和对象知识

最近学了类和对象,所以就我所学到的进行浅浅的分享下吧。

在我们学习java的过程中,我们总会听到java是一门面向对象的语言。

那什么是对象?在java面向对象的世界里,一切皆为对象。而面向对象是一种解决问题的一种思想,主要依靠对象之间的交互来完成一件事情。而这用来涉及到程序,对大型程序的设计、扩展以及维护都特别友好。

这时候,听到面向对象这个词,我们忽然想起,我们一般在学计算机语言的时候先会接触到c语言,那C语言是面向过程的。

那么面向对象和面向过程怎么来简单区别呢?

就以洗衣服来举例,在我们现代洗衣服,我们的步骤是:打开洗衣机、放入衣服、放入洗衣液、关上洗衣机、启动洗衣机。

就面向对象来说,里面涉及到对象有:人、洗衣机、洗衣液、衣服。

而这我们不需要关系它们直接如何工作的,例如怎么洗、怎么甩等等。通过对象之间的交互进行完成。

而就面向过程来说:我们就要关注到怎么打开洗衣机的,怎么进行洗衣服等等。

所以据这个简单的例子也是可以分清两者之间的区别。

注意:面向对象和面向过程只是一种方法,并无优劣之分,只是使用应用场景不同

那么就上诉提到了洗衣机,它是一个对象来的,但它并不被计算机所认识,所以我们要java语言来描述它。

这时候引入一个东西,叫做类。

那什么是类呢?

简单来说类是用来对一个实体对象进行描述的。

那么类定义的格式是咋样的呢?请看一下代码:

代码中class是类的关键字,而petdog是类名,{}是主体。

诶,那我们类定义好了,就先当于给计算机中定义新的一种类型,而我们所接触的,int double类型是内置类型。既然我们有了他,那我们肯定要用它呀,怎么用呢?

这就讲到了实例化那什么又是实例化呢

用类类型创建对象的过程就叫做实例化,而我们java用new关键字来配合进行实例化,我们看以下代码:

◎   new关键字来创建一个对象的实例。

◎   通过.来访问类中的属性和方法。

◎   同一个类可以创建多个实例。

接下来,我给大家看一段较为简单的代码

这段代码都是输出:0/0/0!这里逻辑简单,但为什么输出的是0/0/0呢?

细看下,形参不小心于成员变量相同!

所以这是给成员变量赋值还是给形参赋值?还是参数给参数?成员变量给成员变量?估计它自己都搞不清了,

诶,那咋办?这时候我们就引入一个关键字:this

我们要用它就解决刚刚刚的问题。用它的this引用。

那什么又是this引用呢?

this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。 

我们把那段代码改为这样:

我们也可以看到调试中其地址:

this引用的特性:

◎  对应类类型的引用,哪个对象调用就是哪个对象的引用类型。

◎  this只能在成员方法中使用。

◎  在成员方法中this只能引用当前对象,不能引用其他对象。

  在我们学习其java语法中发现如果在方法内部中定义局部变量时,如若没有就会编译错误。

那我们其实可以发现上面两个小问题:

  1. 我们每次要设置日期都要对其方法进行传参,有些麻烦。那么对象可以初始化吗?当然!那怎么初始化呢?
  2. 为什么字段不进行初始化就不报错呢?

我们先来解决第一个问题

这里要进行对象的初始化的话,就要引入了一个叫构造方法。

那什么又是构造方法呢?

构造方法:构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。 

我们以下代码:

注意:构造方法没有返回类型,void也不行。

  一般情况使用public继续修饰。

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

   构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间

  构造方法可以构成重载(请看以下代码)

名字相同,参数相同,构成方法重载。

如果用户没有进行构造方法的写入,那么编译器会自动生成一份无参数的构造方法。

其实this方法还可以进行的优化:

把刚刚上面中的public Date 改为:

注意:this引用必须放在此方法的第一行。

且不能形成环(如下图所示)

问题一解决完了,现在解决问题二吧。

为什么局部变量就要初始化呢?二成员变量就不用呢?

因为这是进行了默认初始化了。

细一点讲就是,

当我们new完一个对象之后,这个简单的语句,在jvm层面做很多事呢。

简单来说:

◎  检测对象对应的类是否加载了,如果没有加载则加载

◎  为对象分配内存空间

◎  处理并发安全问题

比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突

在对象分配好空间后,成员变量已经初始化好值:

       数据类型

默认值

byte

0

char

‘\u0000’

short

0

int

0

long

0L

boolean

false

float

0.0f

double

0.0

reference

null

当然我们也可以在创建成员变量的时候同时也建立初值。

OK,我们的问题二也解决完啦。

下面我来讲讲Java语言中三大特性吧。

三大特性分别是:封装、继承、多态

那么封装又是什么呢?

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互 。

讲到这里不得不讲下访问限定符了。

Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符 :

范围

private

default

protected

public

同一包同一类

同一包不同类

不同包得子类

不同包的非子类

注意:

  1. protected主要用在继承上。
  2. 限定符不仅用来修饰成员变量也可以修饰类。
  3. default权限是指默认权限

简单讲下这个封装后那就顺便讲下static吧

让我们首先看下这段代码:

假设我们这里三个同学都在一个教室,那么是不是重新写一个成员,来保存我们学生上课的教室呢?其实是不需要的,因为我们这里的教室是三位学生所共有的,所以我们只需要让这个教室让所有学生共享,所以就引入了static

而static所修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的 。

被static所修饰的成员有一个最大的特性就是,不属于某个具体的对象。

还有其他的一些特性:

1.不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中

2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问

3. 类变量存储在方法区当中

4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁 )

所以我们的代码可以改为以下:

注意:

1.不能在静态方法中访问任何非静态成员变量 。

2.静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用 。

那么静态成员可以通过两种初始化。

一种是就是以上代码中的直接赋值,另外一种就是静态代码块初始化。

那么讲到了这个代码块,这里又可以拓开来讲讲了。

代码块的概念及其分类:

代码块:使用 {} 定义的一段代码称为代码块

分类:

普通代码块

构造块

静态块

同步代码块 

这里主要讲的是前三种代码块。

普通代码块:

就是简单定义在方法的代码块:

构造代码块:

实例代码块。构造代码块一般用于初始化实例成员变量。

静态代码块:

使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。v

 

注意:

1.静态代码块不管生成多少个对象,其只会执行一次

2.静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的

3.如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)实例代码块只有在创建对象时才会执行。

到现在,封装暂且讲到这里。后续再来浅谈下继承和多态相关知识。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值