【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();
我的状态的改变并不会影响到不二如是状态的改变,嘻嘻 ^_^!!!
【特别注意】贴子中的栗子希望鱼油们能自觉的手动敲上去,不要单纯的复制粘贴保存,然后编译运行。
❁
☞点我前往上一讲☜
☞点我前往下一讲☜
❁ 感谢楼主无私奉献{:5_102:}
现在的巨人肩膀非常多,想学点什么太容易了,学精还是要耐心啊{:10_266:} 终于来了,给32个赞!{:9_232:} sml3871641 发表于 2017-2-9 09:15
感谢楼主无私奉献
现在的巨人肩膀非常多,想学点什么太容易了,学精还是要耐心啊
对,我们学东西就是要有耐心{:10_297:} ~风介~ 发表于 2017-2-9 09:42
终于来了,给32个赞!
nice 哟{:5_92:}
棒棒哒 ^_^!!! 不二如是2333 谢谢楼主 摆渡终极鉴黄师 发表于 2017-2-21 04:00
不二如是2333
小声点,不要被他听到了{:10_336:} pyt1 发表于 2017-2-21 08:56
谢谢楼主
欢迎 pyt1 童鞋的滋瓷!!! {:9_228:}写得很好。一定要new和C/C++还是有一定的区别。 小小七 发表于 2017-2-22 15:00
写得很好。一定要new和C/C++还是有一定的区别。
是有区别的 零度非安全 发表于 2017-2-21 11:45
小声点,不要被他听到了
{:10_250:} 突然觉得鼻子中一震痒,原来又有人拿我“名号”创建变量
摆渡终极鉴黄师 发表于 2017-2-21 04:00
不二如是2333
{:5_92:} 不二如是 发表于 2017-2-26 10:14
{:10_250:} 不二如是 发表于 2017-2-26 10:14
突然觉得鼻子中一震痒,原来又有人拿我“名号”创建变量
哎呀,被哥哥发现了{:10_243:} 零度非安全 发表于 2017-2-26 10:50
哎呀,被哥哥发现了
欢迎常拿我,当“反面的典型”,生动有效,喜闻乐见{:10_278:} 学过c++
觉得java 这个 new xxx(); 这个括号太别扭了
加了括号就是调用函数的意思了,好不习惯啊,为什么不省去括号呢{:10_243:} 小剑剑 发表于 2017-4-16 20:24
学过c++
觉得java 这个 new xxx(); 这个括号太别扭了
加了括号就是调用函数的意思了,好不习惯啊, ...
那就要去问下设计 Java 这门语言的作者咯! wow,写的真不错,学习学习发帖方法{:10_256:}
页:
[1]