鱼C论坛

 找回密码
 立即注册
查看: 6613|回复: 19

[系列教程] 【Java 教程(原创)】019.对象(上)

[复制链接]
发表于 2017-2-4 15:06:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 零度非安全 于 2017-2-7 16:47 编辑

点击图片穿越到 索引帖,听说有惊喜!

☟


类是面向对象语言中最重要的一种数据类型,类声明的变量称为对象

类是创建对象的模板,当使用一个类创建一个对象时

也称给出了这个类的一个实例

创建对象

创建一个对象包括哪两个步骤呢?聪明的鱼油你知道吗?

即对象的声明和为声明的对象分配内存

对象的声明


一般格式如下:
  1. 类的名字 对象名字;
复制代码

例如:
  1. People notSafe
复制代码

这里 People 是一个类的名字,notSafe 是声明的对象的名字。


为声明的对象分配内存

使用 new 运算符和类的构造方法为声明的对象分配内存,即创建对象。

如果类中没有构造方法,系统会调用默认的构造方法

默认的构造方法是无参数的,且方法体中没有语句


例如:
  1. notSafe = new People();
复制代码

以下是两个详细的例子
  1. class FishcPeople{
  2.     float height,weight;
  3.     String head,ear,hand,foot,mouth;
  4.     void speak(String s){
  5.         System.out.println(s);
  6.     }
  7. }

  8. public class test1{
  9.     public static void main(String[] args){
  10.         FishcPeople notSafe;                        //声明对象
  11.         notSafe = new FishcPeople();                //为对象分配内存,使用new运算符和默认的构造方法
  12.     }
  13. }
复制代码

  1. class Point{
  2.     int x,y;
  3.     Point(int a,int b){
  4.         x = a;
  5.         y = b;
  6.     }
  7. }

  8. public class test1{
  9.     public static void main(String[] args){
  10.         Point point1,point2;                            //声明对象point1和point2
  11.         point1 = new Point(10,10);                      //为对象分配内存,使用new和类中的构造方法
  12.         point2 = new Point(23,35);                      //为对象分配内存,使用new和类中的构造方法
  13.     }
  14. }
复制代码
5.gif


如果类中定义了一个或多个构造方法,那么 Java 不提供默认的构造方法。上述例子中的 Point 类提供了一个构造

方法但没有提供无参数的构造方法。


下列创建对象的代码是非法的
  1. point1 = new Point();
  2. point2 = new Point();
复制代码

对象的内存模型

使用前面的例子来说明对象的内存模型。

声明对象时的内存模型

当用 FishcPeople 类声明一个变量 notSafe,即对象 notSafe 时
  1. FishcPeople notSafe;
复制代码

内存模型如下图所示:

moudle1.png

声明对象变量 notSafe 后,notSafe 的内存中还没有任何数据,称这时的 notSafe 是一个空对象。空对象不能使用,因为

它还没有得到任何“实体”,必须再进行行为对象分配内存的步骤,即为对象分配实体。

对象分配内存后的内存模型

当系统见到:
  1. notSafe = new FishcPeople();
复制代码
时,就会做以下两件事:
6.gif

① 为 FishcPeople 类中的成员变量 height、weight、head、ear、mouth、hand 和 foot 分别分配内存,即

FishcPeople 类的成员变量被分配内存空间,然后执行构造方法中的语句。如果成员变量在声明时没有指定初值,

所使用
的构造方法也没有对成员变量进行初始化操作,那么,对于整型变量,默认初值是 0;对于浮点型,默认初

值是 0.0;对于
boolean 型,默认初值是 false;对于引用型,默认初值是 null。




② 给出一个信息,已确保这些变量是属于对象 notSafe 的,即这些内存单元将由 notSafe 操作管理。为了做到这

一点,new 运算符在为变量 height、weight、head、ear、mouth、hand、foot 分配内存后,将返回一个引用

给对象 notSafe,也就是返回一个“号码”(该号码包含着代表这些成员变量内存位置和相关的重要信息)给

notSafe。不妨认为这个引用就是 notSafe  在内存中的名字,而且这个名字(引用)是 Java 系统确保分配给

height、weight、head、ear、mouth、hand、foot 的内存单元将由 notSafe “操作管理”。


那我们称分配给 height、weight、head、ear、mouth、hand、foot 的内存单元属于对象 notSafe 的实体,即这些变量

是属于 notSafe 的。所谓为对象分配内存,就是指为它分配变量,并获得一个引用,以确保这些变量由它来“操作管理”

。为对象分配内存后,内存模型由声明对象时的模型变成了如下所示:

moudle2.png

如果鱼油们想象力丰富,可以想象在这个计算机内存中的“现实世界”里有了一个“活生生”的 notSafe,这个 notSafe

可以对自己的 height、weight、head、ear、mouth、hand、foot 进行操作,改变自己的状态。

在进行对象的声明时,也可以同时初始化该对象,即分配内存空间。例如:
  1. FishcPeople notSafe = new FishcPeople();
复制代码
4.gif

一个类通过使用 new 运算符可以创建多个不同对象,这些对象将被分配不同的内存空间,因此改变其中一个对象

的状态不会影响其他对象的状态。例如,可以在上述例子中创建两个对象:notSafe 和 buErRuShi。
  1. notSafe = new FishcPeople();
  2. buErRuShi = new FishcPeople();
复制代码

我的状态的改变并不会影响到不二如是状态的改变,嘻嘻 ^_^!!!



【特别注意】贴子中的栗子希望鱼油们能自觉的手动敲上去,不要单纯的复制粘贴保存,然后编译运行。


❁

☞点我前往上一讲☜

☞点我前往下一讲☜

❁

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
alltolove + 5 + 5 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-9 09:15:35 | 显示全部楼层
感谢楼主无私奉献

现在的巨人肩膀非常多,想学点什么太容易了,学精还是要耐心啊

评分

参与人数 1鱼币 +8 收起 理由
零度非安全 + 8 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-9 09:42:48 | 显示全部楼层
终于来了,给32个赞!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-9 11:49:15 | 显示全部楼层
sml3871641 发表于 2017-2-9 09:15
感谢楼主无私奉献

现在的巨人肩膀非常多,想学点什么太容易了,学精还是要耐心啊

对,我们学东西就是要有耐心
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-9 11:51:05 | 显示全部楼层
~风介~ 发表于 2017-2-9 09:42
终于来了,给32个赞!

nice 哟

棒棒哒 ^_^!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-21 04:00:31 | 显示全部楼层
不二如是2333

评分

参与人数 1荣誉 +6 鱼币 +6 贡献 +3 收起 理由
不二如是 + 6 + 6 + 3 热爱学习的好同志!紧跟零度大兄弟步伐~

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-21 08:56:25 | 显示全部楼层
谢谢楼主

评分

参与人数 1鱼币 +5 收起 理由
零度非安全 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-21 11:45:41 | 显示全部楼层

小声点,不要被他听到了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-21 11:46:00 | 显示全部楼层

欢迎 pyt1 童鞋的滋瓷!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-22 15:00:07 | 显示全部楼层
写得很好。一定要new和C/C++还是有一定的区别。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-22 16:19:21 | 显示全部楼层
小小七 发表于 2017-2-22 15:00
写得很好。一定要new和C/C++还是有一定的区别。

是有区别的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-23 18:43:52 | 显示全部楼层
零度非安全 发表于 2017-2-21 11:45
小声点,不要被他听到了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-26 10:14:14 | 显示全部楼层
突然觉得鼻子中一痒,原来又有人拿我“名号”创建变量

timg.jpeg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-26 10:14:33 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-26 10:40:08 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-26 10:50:17 | 显示全部楼层
不二如是 发表于 2017-2-26 10:14
突然觉得鼻子中一震痒,原来又有人拿我“名号”创建变量

哎呀,被哥哥发现了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-26 10:59:12 | 显示全部楼层
零度非安全 发表于 2017-2-26 10:50
哎呀,被哥哥发现了

欢迎常拿我,当“反面的典型”,生动有效,喜闻乐见
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-16 20:24:22 | 显示全部楼层
学过c++
觉得java 这个 new xxx();       这个括号太别扭了
加了括号就是调用函数的意思了,好不习惯啊,为什么不省去括号呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-16 20:38:47 | 显示全部楼层
小剑剑 发表于 2017-4-16 20:24
学过c++
觉得java 这个 new xxx();       这个括号太别扭了
加了括号就是调用函数的意思了,好不习惯啊, ...

那就要去问下设计 Java 这门语言的作者咯!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-28 20:10:32 | 显示全部楼层
wow,写的真不错,学习学习发帖方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-17 04:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表