零度非安全 发表于 2017-2-4 15:06:06

【Java 教程(原创)】019.对象(上)

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

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











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

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

也称给出了这个类的一个实例
创建对象
创建一个对象包括哪两个步骤呢?聪明的鱼油你知道吗?
即对象的声明和为声明的对象分配内存
对象的声明

一般格式如下:
类的名字 对象名字;
例如:
People notSafe
这里 People 是一个类的名字,notSafe 是声明的对象的名字。


为声明的对象分配内存
使用 new 运算符和类的构造方法为声明的对象分配内存,即创建对象。
如果类中没有构造方法,系统会调用默认的构造方法
默认的构造方法是无参数的,且方法体中没有语句

例如:
notSafe = new People();
以下是两个详细的例子
class FishcPeople{
    float height,weight;
    String head,ear,hand,foot,mouth;
    void speak(String s){
      System.out.println(s);
    }
}

public class test1{
    public static void main(String[] args){
      FishcPeople notSafe;                        //声明对象
      notSafe = new FishcPeople();                //为对象分配内存,使用new运算符和默认的构造方法
    }
}

class Point{
    int x,y;
    Point(int a,int b){
      x = a;
      y = b;
    }
}

public class test1{
    public static void main(String[] args){
      Point point1,point2;                            //声明对象point1和point2
      point1 = new Point(10,10);                      //为对象分配内存,使用new和类中的构造方法
      point2 = new Point(23,35);                      //为对象分配内存,使用new和类中的构造方法
    }
}




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

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




下列创建对象的代码是非法的
point1 = new Point();
point2 = new Point();
对象的内存模型
使用前面的例子来说明对象的内存模型。
声明对象时的内存模型

当用 FishcPeople 类声明一个变量 notSafe,即对象 notSafe 时
FishcPeople notSafe;
内存模型如下图所示:



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

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

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

当系统见到:
notSafe = new FishcPeople();时,就会做以下两件事:




① 为 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 的。所谓为对象分配内存,就是指为它分配变量,并获得一个引用,以确保这些变量由它来“操作管理”

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



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

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

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



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

的状态不会影响其他对象的状态。例如,可以在上述例子中创建两个对象:notSafe 和 buErRuShi。
notSafe = new FishcPeople();
buErRuShi = new FishcPeople();
我的状态的改变并不会影响到不二如是状态的改变,嘻嘻 ^_^!!!





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



☞点我前往上一讲☜
☞点我前往下一讲☜

sml3871641 发表于 2017-2-9 09:15:35

感谢楼主无私奉献{:5_102:}

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

~风介~ 发表于 2017-2-9 09:42:48

终于来了,给32个赞!{:9_232:}

零度非安全 发表于 2017-2-9 11:49:15

sml3871641 发表于 2017-2-9 09:15
感谢楼主无私奉献

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

对,我们学东西就是要有耐心{:10_297:}

零度非安全 发表于 2017-2-9 11:51:05

~风介~ 发表于 2017-2-9 09:42
终于来了,给32个赞!

nice 哟{:5_92:}

棒棒哒 ^_^!!!

摆渡终极鉴黄师 发表于 2017-2-21 04:00:31

不二如是2333

pyt1 发表于 2017-2-21 08:56:25

谢谢楼主

零度非安全 发表于 2017-2-21 11:45:41

摆渡终极鉴黄师 发表于 2017-2-21 04:00
不二如是2333

小声点,不要被他听到了{:10_336:}

零度非安全 发表于 2017-2-21 11:46:00

pyt1 发表于 2017-2-21 08:56
谢谢楼主

欢迎 pyt1 童鞋的滋瓷!!!

小小七 发表于 2017-2-22 15:00:07

{:9_228:}写得很好。一定要new和C/C++还是有一定的区别。

零度非安全 发表于 2017-2-22 16:19:21

小小七 发表于 2017-2-22 15:00
写得很好。一定要new和C/C++还是有一定的区别。

是有区别的

摆渡终极鉴黄师 发表于 2017-2-23 18:43:52

零度非安全 发表于 2017-2-21 11:45
小声点,不要被他听到了

{:10_250:}

不二如是 发表于 2017-2-26 10:14:14

突然觉得鼻子中一震痒,原来又有人拿我“名号”创建变量

不二如是 发表于 2017-2-26 10:14:33

摆渡终极鉴黄师 发表于 2017-2-21 04:00
不二如是2333

{:5_92:}

摆渡终极鉴黄师 发表于 2017-2-26 10:40:08

不二如是 发表于 2017-2-26 10:14


{:10_250:}

零度非安全 发表于 2017-2-26 10:50:17

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

哎呀,被哥哥发现了{:10_243:}

不二如是 发表于 2017-2-26 10:59:12

零度非安全 发表于 2017-2-26 10:50
哎呀,被哥哥发现了

欢迎常拿我,当“反面的典型”,生动有效,喜闻乐见{:10_278:}

小剑剑 发表于 2017-4-16 20:24:22

学过c++
觉得java 这个 new xxx();       这个括号太别扭了
加了括号就是调用函数的意思了,好不习惯啊,为什么不省去括号呢{:10_243:}

零度非安全 发表于 2017-4-16 20:38:47

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

那就要去问下设计 Java 这门语言的作者咯!

fishc.love 发表于 2022-9-28 20:10:32

wow,写的真不错,学习学习发帖方法{:10_256:}
页: [1]
查看完整版本: 【Java 教程(原创)】019.对象(上)