资讯专栏INFORMATION COLUMN

【从基础学 Java】对象

loostudy / 717人阅读

摘要:我们生活在一个被对象环绕的世界我们的狗桌子自行车。里,对象有两大特性状态和行为。其中,状态是对象属性的描述如一只猫有眼睛耳朵尾巴等行为是对对象能力的概括如猫会叫吃饭抓老鼠。同时,对象是基于类的。

在 Java 里,我们可以说,一切皆对象。我们生活在一个被对象环绕的世界:我们的狗、桌子、自行车。Java 里,对象有两大特性:状态(state)和行为(behavior)。其中,状态是对象属性的描述(如:一只猫有眼睛、耳朵、尾巴等);行为是对对象能力的概括(如:猫会叫、吃饭、抓老鼠)。同时,对象是基于的。也就是说:类是对象的模板。

Java 中的对象是对面向对象编程(OOP)很好的诠释,使用对象,可以使:

程序模块化

隐藏细节

代码复用

组件可拔插

在这篇博文里,我会把这些概念拓展讲开:

上面已经说过,类是对象的模板,或者说,类是对象的图纸(blueprint)。我们会在类里定义一个和现实世界对应的对象的状态和行为。

在设计一个类时,有如下几点供我们参考:

保证数据的私有

一定要对数据进行初始化

不要在类里使用过多的基本数据类型

不用对所有的字段进行 setter 和 getter

将职能进行划分

封装

对于一个 Java 类,通常提供:

私有的字段

公共的访问

同时,我们要注意:不用把一个引用型的值放在 getter 里。例如,我们有一个 Person 类,如下定义:

class Person{
    private Date birth;
    public void setBirth(Date birth){
        this.birth = birth;
    }
    public Date getBirth(){
        return this.birth;
    }
}

假如我们用下面的代码:

Person perseon = new Person();
// 省略通过 setter 给 pesron 的 birth 属性赋值
Date date = person.getBirth();
person.setBirth(new Date());
// date的值已经改变了
方法

对于 Java 而已,方法这一概念旨在说明一个类所具有的行为,一般是封装了一系列可以改变状态的代码,如:getName()saySomething(),同时,我们需要注意:

在 Java 中,对对象采用的不是引用传递,而是值传递。即:
一个方法无法修改基本数据类型的参数
一个方法可以改变对象参数的状态
一个方法不能让对象参数引用一个新的对象

对于上述的结论,我们有如下代码为证:

// 该方法不会交换 p1 和 P2 的引用 
public void swap(Person p1, Person p2){
    Person tmp = new Person();
    tmp = p1;
    p1 = p2;
    p2 = tmp;
}
构造对象

如果我们想要一个对象, 可以通过 new 关键字构造一个对象,这里,我们的 new 会调用类的构造方法(和类同名的无返回值的特殊方法)。

Java 构造对象时,通常遵循以下原则:

首先调用构造代码块

使用构造方法,为实例变量初始化(基本数据类型初始化为类 0 的默认值,类类型为 null)

使用 finalize 关键字"析构"一个对象(在 gc 之前回收资源)

类的常用方法

对于一个 Java 类,我们希望提供以下一些重要的方法:

equals 方法

我们一般用 equals() 方法比较两个对象的引用是否相同。但是,在实际开发过程中,这种使用对象引用判断对象相等似乎没太大作用,我们更倾向于带逻辑的相等。如果两个对象相等,那么这种相等应该满足如下特性:

自反性:如果 x 不为 null,x.equals(x) 为 true

对称性:如果 x.equals(y),那么 y.equals(x)

传达性:如果 x.equals(y),y.equals(z),那么 x.equqls(z)

一致性:如果 x,y 没有改变,那么 x.equals(y) 一直成立

对于任意非空引用 x,x.equals(null) 应该为 false

下面是一个比较完备的代码:

boolean equals(Object obj){
    
    if (this == obj) return true;
    if (obj == null) return false;
    if(this.getClass() != obj.getClass()) return false;
    
    SomeObj so = (SomeObj)obj;
    // 逻辑代码
}

也可以使用 hashCode() 判断两个对象是否相等,Object.hash(obj) 可以帮我们的忙。

toString 方法

建议每个类都添加 toStirng() 方法,便于日志记录。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68884.html

相关文章

  • 基础 Java】序

    摘要:本人生性愚钝,在大学期间没能好好领略等面向对象编程的魅力。现借助一些较为权威的书籍资料,将基础知识里比较重要的东西整理成文,命名从基础学。如果博文不慎侵犯了您的著作权,请联系我。 和很多大学一样,我的学校也是从 Java 、C++ 入手,教给我们面向对象 (OOP) 的思想。本人生性愚钝,在大学期间没能好好领略 Java 等面向对象编程的魅力。现借助一些较为权威的书籍资料,将 Java...

    JackJiang 评论0 收藏0
  • 基础 Java】接口与内部类

    摘要:即接口是用来描述对象具有的某种功能,而不关心具体实现。或者说,接口好比服务商指定的标准,由代加工工厂遵守来生产。内部类允许在类中定义其它类,这种定义在类中的类叫做嵌套类。局部类是声明,匿名类是表达式。匿名类当需要声明字段或其它方法时。 接口 在继承那篇博文里,我们已经简单了解了 Java 接口的概念。即:接口是用来描述对象具有的某种「功能」,而不关心具体实现。或者说,接口好比服务商指定...

    NeverSayNever 评论0 收藏0
  • 基础 Java】运算符和数据类型

    摘要:是一种强类型语言,因此,定义了基本数据类型。运算符先从运算符谈起。基本数据类的基本数据类型同其它高级程序语言比较类似。常用类类型除了一些基本数据类型,提供的一些类类型,使用频率也很高。 Java 是一种强类型语言,因此,Java 定义了基本数据类型。同时, Java 和其它高级计算机语言一样,有多种运算符,这在我们编程过程中极为有用。 运算符 先从运算符谈起。 顾名思义,运算符解决的是...

    izhuhaodev 评论0 收藏0
  • 先转行基础入门编程可以吗?

    摘要:你只需要相信一句话键盘敲烂,月薪过万就行了,进入正文,零基础入门知识点大纲如下其实到目前为止,的岗位需求还是非常多的,还是大多数企业后台开发的主流编程语言,功能强大,还是很值得学习的。 ...

    desdik 评论0 收藏0
  • 基础 Java】泛型

    摘要:泛型方法泛型类中可以定义静态非静态的泛型方法。上述泛型类会被替换成下面形式一般使用第一个限定类型替换变为原始类型,没有限定类型,使用替换。 引言 在面向对象的世界里,我们如果需要一个容器来盛装对象。举个例子:一个篮子。我们可以用这个篮子装苹果,也可以用这个篮子装香蕉。基于 OOP 的思想,我们不希望为苹果和香蕉分别创建不同的篮子;同时,我们希望放进篮子里的是苹果,拿出来的还是苹果。于是...

    huhud 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<