Java笔记十五.深入理解类和对象(2)

类是对某一类事务的描述,是抽象的、概念上的定义;对象是实际存在的该类事务的个体,因而也称实例。可见,类描述了对象的属性和对象的行为,一个类可以对应多个对象。

一、对象

1.new关键字

在Java编程中,我们通过使用new关键字和想要创建对象的类名来实例化一个类的对象。实例化对象作用,是为对象分配内存,由new操作符根据构造方法决定新建对象分配多大的内存来存储对象。new操作符需要一个参数,就是类的构造方法,构造方法是用于初始化对象的特别方法。new操作符为对象分配内存后将调用类的构造方法确定对象的初始状态(即为类的成员变量赋初值)。举例如下:

Person p1=new Person();

其中,变量p1就是对象的引用句柄,对象的引用句柄是在栈中分配的一个变量,对象本身是在堆中分配的。

2.对象的比较

我们刚说到如何去创建一个对象,但往往在开发中同类的多个对象会存在对象之间的比较。Java提供了两种方法用于对象间的比较:"=="运算符与equals()方法。

(1)"=="操作符

用于比较两个变量的值是否相等,可以理解为基本(引用)数据类型变量的比较情况。

(2)equals()方法

equals()方法是String类的一个成员方法,用于比较两个引用变量所指向的对象的内容是否相等。

如:String str1 = new String("abc");

String str2 = new String("abc");

String str3=str1;

如果通过"=="操作符来判定,那么:str1!=str2,str1==str3。因为str1和str2分别指向了两个新创建的String类对象,他们是两个彼此独立的对象,为占据不同内存空间地址的两个对象。str1和str2分别是这两个对象的句柄,分别是这两个对象的内存地址,显然他们的值是不相等的。而

如果使用equals()方法判定,那么:str1=str2,str1=str3。因为str1、str2、str3三个对象的内容都为"abc",所以它们之间是相等的。

3.匿名对象

创建完对象,在调用该对象的方法时,也可以不定义对象的句柄,而直接调用这个对象的方法,这样的对象就叫做匿名对象,比如new
Person().shout()。 使用匿名对象有两种情况:

(1)如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。

(2)将匿名对象作为实参传递给一个函数调用。

举例说明:程序中有一个getSomeOne函数,要接收一个Person类对象作为参数。

函数的定义如下:

public static void getSomeOne(Person p)

{......}

可以看出,该函数在使用时需要给其传入一个参数,所以我们在调用该函数时可以这样:getSomeOne(new Person());即定义一个Person类的匿名对象作为该函数的实参。

二、构造方法

1.构造方法

构造方法在程序设计中非常有用,它可以为类的成员变量进行初始化工作,当创建一个类的实例对象后,这个类的构造方法会被自动调用。与成员方法不同的是构造方法一般具有以下几个特点:

(1)它具有与类相同的名称;

(2)它不含返回值;

(3)它不能在方法中用return语句返回一个值。

注释:构造方法的名称之所以要与类的名称相同,因为构造方法由Java编译器负责调用,而编译器必须知道哪一个才是构造方法。

2.构造方法的重载

我们在实现一个类时,可以不实现构造方法,因为系统会为程序自动生成一个空的构造方法(方法中不包含任何代码)供系统自动调用。构造方法的重载通过传递不同的参数列表来实现,且可以完成不同初始化的操作。在创建一个实体对象时,到底使用的是哪一个构造方法,Java会根据在括号中传递的参数来自动选择相应的构造方法,即new
类名(参数列表)。

下面分析一个构造方法具体实现了什么功能:

Person
p=new Person("Tom",18);其中,p为对象的引用句柄。

(1)创建了Person类的一个实例对象;

(2)在堆内存中为实例对象分配内存空间;

(3)调用指定类的构造方法,将实例对象的内容的首地址赋值给引用变量(引用句柄)p。

内 存 分 析

a.首先,实例化一个对象Person p=new Person("Tom",18),生成一个引用句柄p,系统自动初始化Person类中的成员变量。

b.其次,执行构造方法中的代码,用从外部接受到的姓名和年龄对成员变量重新赋值

this.name=name;

this.age=age;此时的内存状态为:

c.最后,把刚刚创建的对象赋值给引用变量。

3.构造方法总结

(1)在Java的每个类里都至少有一个构造方法,如果我们没有在一个类里定义构造方法,那么系统会自动为这个类生成一个默认的构造方法,这个默认构造方法没有参数,在其方法体中也没有任何代码,即不做任何事。

(2)构造方法一般都是public的,因为它们在对象产生时,会被系统自动调用,以便被外部调用。

(3)在创建一个对象语句中,如Person p=new Person(),其中引用变量p为对象的引用句柄,不是对象本身,我们可以通过引用变量p来操作对象中的属性(成员变量)和行为(成员方法)。

时间: 2024-11-03 13:01:26

Java笔记十五.深入理解类和对象(2)的相关文章

Java笔记十四.深入理解类和对象(1)

Java是一种完全面向对象的编程语言(C是面向过程).所谓面向对象编程(OOP),即是一种编程风格,它通过给程序中加入扩展语句,把函数"封装"进编程所必需的"对象"中.OOP 达到了软件工程的三个主要目标:重用性.灵活性和扩展性.其实,面向对象就是把一切东西看成一个个对象,比如人,车,面包,等等,然后把这些对象拥有的属性变量,比如年龄,民族,工作地点,变质期,寿命,还有操作这些属性变量的函数(方法)打包成一个类来表示,这个类的一个抽象就是一个对象.在Java程序中,

Android学习笔记十五.深入理解fragment(三) 之《兼容多分辨率的应用》实战

深入理解fragment(三) 之<兼容多分辨率的应用>实战 在上一篇博文中介绍了如何使用Android Fragment开发适用于大屏幕应用,现在我们在上一个应用的基础上继续学习如何使用Fragment开发兼容多分辨率的应用. 1.建立/res/values-large/refs.xml引用资源文件 为了开发兼顾屏幕分辨率的应用,我们需要建立一个引用资源文件,专门用于定义各种引用项.refs.xml引用资源文件中定义了一项引用,其作用就是标明activity_book_list实际引用(@)

Java笔记十二.常用API-Hashtable类及其与HashMap、HashSet的区别

常用API-Hashtable类及其与HashMap.HashSet的区别 一.Hashtable<K,V>类 1.概述 Hashtable是一种高级数据结构,实现了一个Key-Value映射的哈希表,用以快速检索数据.Hashtable不仅可以像Vector一样动态存储一系列的对象,而且对存储的每一个值对象(值)都安排与另一个键对象(关键字)相关联,非null对象都可以被使用作为键对象或者值对象.为了能够成功从hashtable中存储和读取对象元素,实现键对象的类必须实现hashCode方法

Swift 学习笔记十五:扩展

扩展就是向一个已有的类.结构体或枚举类型添加新功能(functionality).扩展和 Objective-C 中的分类(categories)类似.(不过与Objective-C不同的是,Swift 的扩展没有名字.) Swift 中的扩展可以: 1.添加计算型属性和计算静态属性 2.定义实例方法和类型方法 3.提供新的构造器 4.定义下标 5.定义和使用新的嵌套类型 6.使一个已有类型符合某个协议 一.扩展属性,构造器,方法 class Human{ var name:String? va

第十五章 文件属性类的实现

                  第十五章    文件属性类的实现        根用户的权限也不能是无限大.必须考虑到保护用户的隐私!用户的文件内容.程序代码可设置为根用户也不能观看,只能是文件拥有者可以查看.修改.但根用户可以删除一切非根用户的文件.也可以查看用户的目录.所以,i_mode字符更改如下:      BU16 i_mode; // 描述文件的访问权限:文件的读.写.执行权限  // i_mode.15-13  ftype; 文件类型: 0-符号软连接文件, // 1-硬连接文

laravel3学习笔记(十五)

原作者博客:ieqi.net ==================================================================================================== 异常与日志 在应用中,我们总会遇到各种问题.各种异常,这时,记录异常发生时的状态就很重要,所以异常与日志是有着天然的关系的. 关于异常与日志的配置在文件 application/config/error.php 中. 文件中有四个配置项: 'ignore' => ar

Java知多少(7)类与对象

Java是一门面向对象的编程语言,理解Java,首先要理解类与对象这两个概念. Java中的类可以看做C语言中结构体的升级版.结构体是一种构造数据类型,可以包含不同的成员(变量),每个成员的数据类型可以不一样:可以通过结构体来定义结构体变量,每个变量拥有相同的性质.例如: 1 #include <stdio.h> 2 int main(){ 3 // 定义结构体 Student 4 struct Student{ 5 // 结构体包含的变量 6 char *name; 7 int age; 8

c++第五章-(类与对象、构造器和析构器)

1.构造器与结构体的区别:构造器多支持方法.其作用有申请内存,初始化变量. 在c++中构造器没有返回值:语法Class Name(); 2.析构器的作用:释放内存. 在c++中析构器没有返回值:语法~ClassName(); class Animal { public: std::string mouth; std::string name; void eat(); void sleep(); void drool(); Animal(std::string theName); }; class

Java基础学习笔记十五 集合、迭代器、泛型

Collection 集合,集合是java中提供的一种容器,可以用来存储多个数据. 在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据.那么,集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的.集合的长度是可变的. 集合中存储的元素必须是引用类型数据 集合继承关系图 ArrayList的继承关系: 查看ArrayList类发现它继承了抽象类AbstractList同时实现接口List,而List接口又继承了Collection接口.Collec