对象解决内存不能为read

解决内存不能为read  时间:2021-01-19  阅读:()

第3章面向对象(上)本章重点u面向对象的概念u类与对象u构造方法uthis和static关键字u内部类1.
1面向对象的概念面向对象是一种符合人类思维习惯的编程思想.
现实生活中存在各种形态不同的事物,这些事物之间存在着各种各样的联系.
在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就是面向对象.
提到面向对象,自然会想到面向过程,面向过程就是分析解决问题所需要的步骤,然后用函数把这些步骤一一实现,使用的时候一个一个依次调用就可以了.
面向对象则是把解决的问题按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题.
当然,一个应用程序会包含多个对象,通过多个对象的相互配合来实现应用程序的功能,这样当应用程序功能发生变动时,只需要修改个别的对象就可以了,从而使代码更容易得到维护.
面向对象的特点主要可以概括为封装性、继承性和多态性,接下来针对这三种特性进行简单介绍.
1、封装性封装是面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界知道具体实现细节,这就是封装思想.
例如,用户使用电脑,只需要使用手指敲键盘就可以了,无需知道电脑内部是如何工作的,即使用户可能碰巧知道电脑的工作原理,但在使用时,并不完全依赖电脑工作原理这些细节.
2、继承性继承性主要描述的是类与类之间的关系,通过继承,可以在无需重新编写原有类的情况下,对原有类的功能进行扩展.
例如,有一个汽车的类,该类中描述了汽车的普通特性和功能,而轿车的类中不仅应该包含汽车的特性和功能,还应该增加轿车特有的功能,这时,可以让轿车类继承汽车类,在轿车类中单独添加轿车特性的方法就可以了.
继承不仅增强代码了复用性,提供了开发效率,而且为程序的修改补充提供了便利.
3、多态性多态性指的是在程序中允许出现重名现象,它指在一个类中定义的属性和方法被其它类继承后,它们可以具有不同的数据类型或表现出不同的行为,这使得同一个属性和方法在不同的类中具有不同的语义.
例如,当听到"Cut"这个单词时,理发师的行为是剪发,演员的行为表现是停止表演,不同的对象,所表现的行为是不一样的.
面向对象的思想光靠上面的介绍是无法真正理解的,只有通过大量的实践去学习和理解,才能将面向对象真正领悟,接下来的第三章、第四章将围绕着面向对象的三个特征(封装、继承、多态)来讲解Java这门编程语言.
1.
2类与对象面向对象的编程思想力图在程序中对事物的描述与该事物在现实中的形态保持一致.

为了做到这一点,面向对象的思想中提出两个概念,即类和对象.
其中,类是对某一类事物的抽象描述,而对象用于表示现实中该类事物的个体.
接下来通过一个图例来抽象描述类与对象的关系,如图3-1所示.
图3-1类与对象在图3-1中,可以将玩具模型看作是一个类,将一个个玩具看作对象,从玩具模型和玩具之间的关系便可以看出类与对象之间的关系.
类用于描述多个对象的共同特征,它是对象的模板.
对象用于描述现实中的个体,它是类的实例.
从图3-1可以明显看出对象是根据类创建的,并且一个类可以对应多个对象,接下来分别讲解什么是类和对象.

1.
2.
1类的定义在面向对象的思想中最核心就是对象,为了在程序中创建对象,首先需要定义一个类.

类是对象的抽象,它用于描述一组对象的共同特征和行为.
类中可以定义成员变量和成员方法,其中成员变量用于描述对象的特征,也被称作属性,成员方法用于描述对象的行为,可简称为方法.
接下来通过一个案例来学习如何定义一个类,如例程3-1所示.
例程3-1Person.
java1classPerson{2intage;//定义int类型的变量age3//定义speak()方法4voidspeak(){5System.
out.
println("大家好,我今年"+age+"岁!
");6}7}例程3-1中定义了一个类.
其中,Person是类名,age是成员变量,speak()是成员方法.
在成员方法speak()中可以直接访问成员变量age.
M脚下留心:在Java中,定义在类中的变量被称为成员变量,定义在方法中的变量被称为局部变量.

如果在某一个方法中定义的局部变量与成员变量同名,这种情况是允许的,此时方法中通过变量名访问到的是局部变量,而并非成员变量,请阅读下面的示例代码:classPerson{intage=10;//类中定义的变量被称作成员变量voidspeak(){intage=60;//方法内部定义的变量被称作局部变量System.
out.
println("大家好,我今年"+age+"岁!
");}}上面的代码中,在Person类的speak()方法中有一条打印语句,访问了变量age,此时访问的是局部变量age,也就是说当有另外一个程序来调用speak()方法时,输出的值为60,而不是10.
1.
2.
2对象的创建与使用应用程序想要完成具体的功能,仅有类是远远不够的,还需要根据类创建实例对象.
在Java程序中可以使用new关键字来创建对象,具体格式如下:类名对象名称=new类名();例如,创建Person类的实例对象代码如下:Personp=newPerson();上面的代码中,"newPerson()"用于创建Person类的一个实例对象,"Personp"则是声明了一个Person类型的变量p.
中间的等号用于将Person对象在内存中的地址赋值给变量p,这样变量p便持有了对象的引用.
本书接下来的章节为了便于描述,通常会将变量p引用的对象简称为p对象.
在内存中变量p和对象之间的引用关系如图3-2所示.
图3-2内存分析在创建Person对象后,可以通过对象的引用来访问对象所有的成员,具体格式如下:对象引用.
对象成员接下来通过一个案例来学习如何访问对象的成员,如例程3-2所示.
例程3-2Example01.
java1classExample01{2publicstaticvoidmain(String[]args){0x3000newPerson()Personp0x3000内存(对象的地址)3Personp1=newPerson();//创建第一个Person对象4Personp2=newPerson();//创建第二个Person对象5p1.
age=18;//为age属性赋值6p1.
speak();//调用对象的方法7p2.
speak();8}9}运行结果如图3-3所示.
图3-3运行结果例程3-2中,p1、p2分别引用了Person类的两个实例对象.
从图3-3所示的运行结果可以看出,p1和p2对象在调用speak()方法时,打印的age值不相同.
这是因为p1对象和p2对象是两个完全独立的个体,它们分别拥有各自的age属性,对p1对象的age属性进行赋值并不会影响到p2对象age属性的值.
程序运行期间p1、p2引用的对象在内存中的状态如图3-4所示.
图3-4P1、P2对象在内存中的状态在例程3-2中,通过"p1.
age=18"将p1对象的age属性赋值为18,但并没有对p2对象的age属性进行赋值,按理说p2对象的age属性应该是没有值的.
但从图3-3所显示的运行结果可以看出p2对象的age属性也是有值的,其值为0.
这是因为在实例化对象时,Java虚拟机会自动为成员变量进行初始化,针对不同类型的成员变量,Java虚拟机会赋予不同的初始值,如表3-1所示.
表3-1成员变量的初始化值成员变量类型初始值byte0short0int0long0Lfloat0.
0Fdouble0.
0Dchar空字符,'\u0000'booleanfalse引用数据类型nullP1内存P2newPerson()age18speak()0speak()agenewPerson()当对象被实例化后,在程序中可以通过对象的引用变量来访问该对象的成员.
需要注意的是,当没有任何变量引用这个对象时,它将成为垃圾对象,不能再被使用.
接下来通过两段程序代码来分析对象是如何成为垃圾的.
第一段程序代码:{Personp1=newPerson();………}上面的代码中使用变量p1引用了一个Person类型的对象,当这段代码运行完毕时,变量p1就会超出其作用域而被销毁,这时Person类型的对象就没有被任何变量引用,变成垃圾.
第二段程序代码,如例程3-3所示.
例程3-3Example02.
java1classPerson{2voidsay(){//创建say()方法,输出一句话3System.
out.
println("我是一个人!
");4}5}6classExample02{7publicstaticvoidmain(String[]args){8Personp2=newPerson();//创建Person对象9p2.
say();//调用say()方法10p2=null;//将Person对象置为null11p2.
say();12}13}运行结果如图3-5所示.
图3-5运行结果在例程3-3中,创建了一个Person类的实例对象,并两次调用了该对象的say()方法.
第一次调用say()方法时可以正常打印,但在第10行代码中将变量p2的值置为null,当再次调用say()方法时抛出了空指针异常.
在Java中,null是一种特殊的常量,当一个变量的值为null时,则表示该变量不指向任何一个对象.
在例程中,当把变量p2置为null时,被p2所引用的Person对象就会失去引用,成为垃圾对象,其过程如图3-6所示.
图3-6垃圾对象1.
2.
3类的设计在Java中,对象是通过类创建出来的.
因此,在程序设计时,最重要的就是类的设计.

接下来就通过一个具体的案例来学习如何设计一个类.
假设要在程序中描述一个学校所有学生的信息,可以先设计一个学生类(Student),在这个类中定义两个属性name、age分别表示学生的姓名和年龄,定义一个方法introduce()表示学生做自我介绍.
根据上面的描述设计出来的Student类如例程3-4所示.
例程3-4Student.
javapublicclassStudent{Stringname;intage;publicvoidintroduce(){//方法中打印属性name和age的值System.
out.
println("大家好,我叫"+name+",我今年"+age+"岁!
");}}在例程3-4的Student类中,定义了两个属性name和age.
其中的name属性为String类型,在Java中使用String类的实例对象表示一个字符串,例如:Stringname="李芳";关于字符串在本书的第6章将会进行详细地讲解,在此处可简单地将字符串理解为一连串的字符.
1.
2.
4类的封装接下来针对例程3-4中设计的Student类创建对象,并访问该对象的成员,如例程3-5所示.
例程3-5Example03.
java1publicclassExample03{2publicstaticvoidmain(String[]args){3Studentstu=newStudent();//创建学生对象4stu.
name="李芳";//为对象的name属性赋值5stu.
age=-30;//为对象的age属性赋值{Personp2=newPerson();……P2=null;……}nullPerson对象成为垃圾p2p2Person对象6stu.
introduce();//调用对象的方法7}8}运行结果如图3-7所示.
图3-7运行结果在例程3-5的第5行代码中,将年龄赋值为一个负数-30,这在程序中不会有任何问题,但在现实生活中明显是不合理的.
为了解决年龄不能为负数的问题,在设计一个类时,应该对成员变量的访问作出一些限定,不允许外界随意访问.
这就需要实现类的封装.

所谓类的封装是指在定义一个类时,将类中的属性私有化,即使用private关键字来修饰,私有属性只能在它所在类中被访问,为了能让外界访问私有属性,需要提供一些使用public修饰的公有方法,其中包括用于获取属性值的getXxx方法和设置属性值的setXxx方法.
接下来通过一个案例来实现类的封装,如例程3-6所示.
例程3-6Example04.
java1classStudent{2privateStringname;//将name属性私有化3privateintage;//将age属性私有化4//下面是公有的getXxx和setXxx方法5publicStringgetName(){6returnname;7}8publicvoidsetName(StringstuName){9name=stuName;10}11publicintgetAge(){12returnage;13}14publicvoidsetAge(intstuAge){15//下面是对传入的参数进行检查16if(stuAge3*Description:通过Person类来说明Java中的文档注释4*Company:Itcast5*@authorItcast6*@version1.
07*/8publicclassPerson{9publicStringname;10/**11*这是Person类的构造方法12*@paramnamePerson的名字13*/14publicPerson(Stringname){15执行语句;16}17/**18*这是read()方法的说明19*@parambookName读的书的名字20*@paramtime读书所需的时间21*@return读的书的数量22*/23publicintread(StringbookName,inttime){24执行语句;25}26}在例程3-25中添加了很多文档注释,其中包括对整个类的说明、构造方法的说明以及成员方法的说明.
在文档注释中出现的@标记都是有特殊作用的,具体解释如下:@author:用于对类的说明,表示这个程序的作者@version:用于对类说明,表示这个程序的开发版本号@param:用于对方法的说明,表示方法上定义的参数以及参数对应的说明@return:用于对方法的说明,表示方法的返回值代表的意义为程序添加文档注释后,便可以使用javadoc命令生成Person类的帮助文档.
打开命令行窗口,进入程序所在的目录,输入生成文档的命令,具体如下所示:javadoc-d.
-version-authorPerson.
java其中:l-d用来指定输出文档存放的目录l.
表示当前的目录l-version用来指定输出文档中需包含版本信息l-author用来指定输出文档中需包含作者信息通过javadoc命令会在指定目录下生成许多的html格式的文件,这些文件就是程序的帮助文档,如图3-24所示.
图3-24HTML文档结构目录下的index.
html文件是整个帮助文档的首页,双击打开这个文件,便可以看到Person类的帮助文档,如图3-25所示.
图3-25Person帮助文档1.
8.
2JDK帮助文档的使用Oracle公司针对JDK中所有的Java类也提供了一整套帮助文档,我们习惯称之为JDK帮助文档.
JDK帮助文档详细介绍了所有Java类的属性、方法、继承关系和示例用法等内容.
JDK帮助文档通常有两种,一种是Oracle公司官方发布的HTML格式的JDK帮助文档,可以从Oracle公司的官方网站http://www.
oracle.
com下载.
通常下载的HTML文档都是一个ZIP压缩文件,只需把它解压后,打开其中的index.
html文件即可对其进行查看,如图3-26所示.
图3-26Oracle官方JDK帮助文档另一种是由一些Java爱好者根据官方文档制作而成的CHM格式的JDK帮助文档,它具有独特的搜索功能和不同的语言版本,被许多开发者所钟爱.
CHM格式的JDK帮助文档如图3-27所示.
图3-27CHM格式JDK帮助文档JDK帮助文档对所有的Java类提供了详细全面的说明,开发人员在开发过程中通常会把它作为一种文档查阅工具来使用.
例如在3.
5小节中,使用了System类中的gc()方法,如果想了解Oracle官方对gc()方法的使用说明,就可以查阅JDK帮助文档.
打开CHM格式的JDK帮助文档,在左边的【索引】栏中输入类名"System",然后按下回车键,在右边的页面中就会显示出System类所有的信息,包括System类的继承体系、类的介绍、属性、方法概要和详细信息等内容,如图3-28所示.
图3-28JDK帮助文档中的System类下拉窗口右边的滚动条,可以看到System类的方法列表,gc()方法包含在其中,如图3-29所示.
图3-29System类的方法列表点击gc()方法的链接,就可以进入到该方法的详细信息页面,如图3-30所示.
图3-30gc()方法详细信息CHM格式的JDK帮助文档也支持直接输入方法名进行检索,在【索引】栏中输入"gc"并按下回车后,在右边的页面中会列出与"gc"相关的方法,如图3-31所示.
图3-31gc()方法列表点击"java.
lang.
System.
gc()"链接,就可以直接查看System类中gc()方法的详细信息.
1.
9本章小结本章详细介绍了面向对象的基础知识.
首先介绍了什么是面向对象的思想,然后介绍了类与对象之间的关系,类的封装与使用,接着介绍了构造方法的定义与重载,this和static关键字的使用,最后介绍了三种内部类的定义以及应用场景等.
熟练掌握好这些知识,有助于学习下一章的内容.
深入理解面向对象的思想,对以后的实际开发也是大有裨益的.

1.
10习题一、填空题1、面向对象的三大特征是_和______.
2、在Java中,可以使用关键字______来创建类的实例对象.
3、定义在类中的变量被称为______,定义在方法中的变量被称为______4、面向对象程序设计的重点是______的设计,______是用来创建对象的模板.
5、在非静态成员方法中,可以使用关键字______访问类的其它非静态成员.
6、当一个对象被当成垃圾从内存中释放时,它的______方法会被自动调用.
7、被static关键字修饰的成员变量被称为______,它可以被该类所有的实例对象共享.
8、在一个类中,除了可以定义属性、方法,还可以定义类,这样的类被称为______.

9、在Java中,提供了一个______命令,用于将程序中的文档注释提取出来,生成HTML格式的帮助文档.
10、所谓类的封装是指在定义一个类时,将类中的属性私有化,即使用______关键字来修饰.
二、判断题1、在定义一个类的时候,如果类的成员被private所修饰,该成员不能在类的外部被直接访问.
2、Java中的每个类都至少有一个构造方法,一个类中如果没有定义构造方法,系统会自动为这个类创建一个默认的构造方法.
3、声明构造方法时,不能使用private关键字修饰.
4、类中static修饰的变量或方法,可以使用类名或对象的引用变量访问.
5、方法内部类中不能访问外部类的成员变量三、选择题1、类的定义必须包含在以下哪种符号之间A、方括号[]B、花括号{}C、双引号""D、圆括号()2、下面哪一个是正确的类的声明A、publicvoidHH{…}B、publicclassMove(){…}C、publicclassvoidnumber{}D、publicclassCar{…}3、在以下什么情况下,构造方法会被调用A、类定义时B、创建对象时C、调用对象方法时D、使用对象的变量时4、下面对于构造方法的描述,正确有哪些(多选)A、方法名必须和类名相同B、方法名的前面没有返回值类型的声明C、在方法中不能使用return语句返回一个值D、当定义了带参数的构造方法,系统默认的不带参数的构造方法依然存在5、使用this调用类的构造方法,下面的说法正确的是(多选)A、使用this调用构造方法的格式为this([参数1,参数2…])B、只能在构造方法中使用this调用其它的构造方法C、使用this调用其它构造方法的语句必须放在第一行D、不能在一个类的两个构造方法中使用this互相调用6、下面哪些可以使用static关键字修饰(多选)A、成员变量B、局部变量C、成员方法D、成员内部类7、关于内部类,下面说法正确的是(多选)A、成员内部类是外部类的一个成员,可以访问外部类的其它成员B、外部类可以访问成员内部类的成员C、方法内部类只能在其定义的当前方法中进行实例化D、静态内部类中可以定义静态成员,也可以定义非静态成员8、下面对于单例设计模式的描述,正确的是(多选)A、类中定义一个无参的构造方法,并且声明为私有B、在内部创建一个该类的实例对象,使用静态变量引用该实例对象C、使用private修饰静态变量,禁止外界直接访问D、定义静态方法返回该类实例9、请先阅读下面的代码publicclassTest{publicTest(){System.
out.
println("构造方法一被调用了");}publicTest(intx){this();System.
out.
println("构造方法二被调用了");}publicTest(booleanb){this(1);System.
out.
println("构造方法三被调用了");}publicstaticvoidmain(String[]args){Testtest=newTest(true);}}上面程序的运行结果为下列哪一项A、构造方法一被调用了B、构造方法二被调用了C、构造方法三被调用了D、以上三个选项之和10、Outer类中定义了一个成员内部类Inner,需要在main()方法中创建Inner类实例对象,以下四种方式哪一种是正确的A、Innerin=newInner()B、Innerin=newOuter.
Inner();C、Outer.
Innerin=newOuter.
Inner();D、Outer.
Innerin=newOuter().
newInner();四、程序分析题阅读下面的程序,分析代码是否能够编译通过,如果能编译通过,请列出运行的结果.

搬瓦工最新套餐KVM,CN2线路

搬瓦工在国内非常流行的主机商,以提供低价的vps著称.不过近几年价格逐渐攀升.不过稳定性和速度一向不错.依然深受国内vps爱好者喜爱.新上线的套餐经常卖到断货.支持支付宝,paypal很方便购买和使用.官网网站:https://www.bandwagonhost.com[不能直接访问,已墙]https://www.bwh88.net[有些地区不能直接访问]https://www.bwh81.net...

宝塔面板企业版和专业版618年中活动 永久授权仅1888元+

我们一般的站长或者企业服务器配置WEB环境会用到免费版本的宝塔面板。但是如果我们需要较多的付费插件扩展,或者是有需要企业功能应用的,短期来说我们可能选择按件按月付费的比较好,但是如果我们长期使用的话,有些网友认为选择宝塔面板企业版或者专业版是比较划算的。这样在年中大促618的时候,我们也可以看到宝塔面板也有发布促销活动。企业版年付899元,专业版永久授权1888元起步。对于有需要的网友来说,还是值...

Vultr VPS韩国首尔机房速度和综合性能参数测试

Vultr 商家有新增韩国首尔机房,这个是继日本、新加坡之后的第三个亚洲机房。不过可以大概率知道肯定不是直连中国机房的,因为早期的日本机房有过直连后来取消的。今天准备体验看看VULTR VPS主机商的韩国首尔机房的云服务器的速度和性能。1、全球节点PING速度测试这里先通过PING测试工具看看全球几十个节点的PING速度。看到好像移动速度还不错。2、路由去程测试测试看看VULTR韩国首尔机房的节点...

解决内存不能为read为你推荐
主机空间网站空间、主机是什么?他们有什么联系??中国互联网域名注册中国互联网络域名注册暂行管理办法的第三章 域名注册的申请linux主机linux优点和缺点有哪些啊?中文域名注册查询哪里有可以查询中文域名是否被注册的地方?免费虚拟主机申请免费域名和免费虚拟主机申请以及绑定求详解免费国内空间中国有什么免费的空间美国服务器托管美国服务器租用时要注意什么?成都虚拟空间空间服务商那个好虚拟主机试用30天需要一个免费的虚拟主机,稳定的广西虚拟主机江西服务器托管,但要接入专线,问了很多代理都说不可以,如何解决?
网络星期一 eq2 合租空间 股票老左 双线主机 稳定免费空间 美国网站服务器 美国堪萨斯 流媒体加速 vul 英雄联盟台服官网 镇江高防 实惠 阿里云邮箱怎么注册 美国vpn代理 windowsserverr2 发证机构 美国达拉斯 大硬盘分区 ddos攻击软件 更多