版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
lecture4成员变量的初始化、包和访问控制符提纲成员变量的初始化包访问控制类的访问控制符类成员的访问控制符成员变量的初始化简单数据类型变量的初始化复杂数据类型变量的初始化指定初值构造函数的初始化静态数据的初始化简单数据类型成员变量的初始化(1)classMeasurement{booleant;charc;byteb;shorts;inti;longl;floatf;doubled;简单数据类型成员变量的初始化(2)voidprint(){System.out.println("DatatypeInitialvalue\n"+"boolean"+t+"\n"+"char["+c+"]"+(int)c+"\n"+"byte"+b+"\n"+"short"+s+"\n"+"int"+i+"\n"+"long"+l+"\n"+"float"+f+"\n"+"double"+d);}}简单数据类型成员变量的初始化(3)publicclassInitialValues{publicstaticvoidmain(String[]args){Measurementd=newMeasurement();d.print();/*Inthiscaseyoucouldalsosay:newMeasurement().print();*/}}///:~
简单数据类型成员变量的初始化(4)结果:Theoutputofthisprogramis:DatatypeInitialvaluebooleanfalsechar[]0byte0short0int0long0float0.0double0.0复杂类型变量的初始化如果是复杂类型的变量,则初始化为null如:classtest{studentb;}则b初始化为null指定初值(1)简单数据类型指定初值classMeasurement{booleanb=true;charc='x';byteB=47;shorts=0xff;inti=999;longl=1;floatf=3.14f;doubled=3.14159;//...指定初值(2)复杂数据类型指定初值classMeasurement{Deptho=newDepth();booleanb=true;//...指定初值后初始化顺序构造函数可用来执行初始化动作,但是自动初始化动作和指定初值在构造函数之前执行classCounter{inti;Counter(){i=7;}}//...过程:初始化次序(1)classTag{Tag(intmarker){System.out.println("Tag("+marker+")");}}
初始化次序(2)classCard{Tagt1=newTag(1);//BeforeconstructorCard(){//Indicatewe'reintheconstructor:System.out.println("Card()");t3=newTag(33);//Reinitializet3}Tagt2=newTag(2);//Afterconstructorvoidf(){System.out.println("f()");}Tagt3=newTag(3);//Atend}初始化次序(3)publicclassOrderOfInitialization{publicstaticvoidmain(String[]args){Cardt=newCard();t.f();//Showsthatconstructionisdone}}///:~结果:
Tag(1)Tag(2)Tag(3)Card()Tag(33)f()静态数据的初始化如果数据属于基本数据类型,而又没有加以初始化,则会设置为基本数据类型的标准初值如果数据是复杂类型,初值便为null如果想在定义时给定初值,做法跟非static数据是一样的注意:不论产生多少对象,static变量都只占用一份存储空间Static明确初始化Java允许你将多个static初始化动作组织起来,置于特殊的“static构建子句(有时也称为staticblock)”中,看起来像这样:classSpoon{staticinti;static{i=47;}//...看起来像是个函数,但其实是在关键字static之后紧接着函数本体。这样的程序代码就像其他形式的static初始化一样,只会被执行一次;在你首次产生class对象或首次访问该class的static成员时。
Static明确初始化示例(1)classCup{Cup(intmarker){System.out.println("Cup("+marker+")");}voidf(intmarker){System.out.println("f("+marker+")");}}
classCups{staticCupc1;staticCupc2;static{c1=newCup(1);c2=newCup(2);}Cups(){System.out.println("Cups()");}}Static明确初始化示例(2)publicclassExplicitStatic{publicstaticvoidmain(String[]args){System.out.println("Insidemain()");Cups.c1.f(99);//(1)}//staticCupsx=newCups();//(2)//staticCupsy=newCups();//(2)}///:~No-static实体初始化Java也为对象内的non-static变量的初始化行为提供了类似语法。
classMug{Mug(intmarker){System.out.println("Mug("+marker+")");}voidf(intmarker){System.out.println("f("+marker+")");}}
No-static实体初始化示例(1)publicclassMugs{Mugc1;Mugc2;{c1=newMug(1);c2=newMug(2);System.out.println("c1&c2initialized");}Mugs(){System.out.println("Mugs()");}publicstaticvoidmain(String[]args){System.out.println("Insidemain()");Mugsx=newMugs();}}///:~No-static实体初始化示例(2)其中{c1=newMug(1);c2=newMug(2);System.out.println("c1&c2initialized");}可以看作实体的初始化子句初始化顺序(二)当某个型别为A的对象首次被产生出来,或是当classA的static函数或static数据成员被首次访问,Java编译器必须查找环境变量所指定的位置,找到A.class一旦A.class被装载,它的所有static初始动作会被执行起来。因此static初始化动作仅会发生一次,就是在Class对象首次被装载时。当你newA(),构建过程会先为A()对象在heap上分配足够的存储空间。这块存储空间会先被清为零,并自动将A对象内所有隶属基本型别的数据设为缺省值,并将复杂类型的引用设为null执行所有出现数据定义处的初始化序列执行构造函数初始话顺序(二)classBowl{Bowl(intmarker){System.out.println("Bowl("+marker+")");}voidf(intmarker){System.out.println("f("+marker+")");}}初始话顺序(二)classTable{staticBowlb1=newBowl(1);Table(){System.out.println("Table()");b2.f(1);}voidf2(intmarker){System.out.println("f2("+marker+")");}staticBowlb2=newBowl(2);}初始话顺序(二)classCupboard{Bowlb3=newBowl(3);staticBowlb4=newBowl(4);Cupboard(){System.out.println("Cupboard()");b4.f(2);}voidf3(intmarker){System.out.println("f3("+marker+")");}staticBowlb5=newBowl(5);}初始话顺序(二)publicclassStaticInitialization{publicstaticvoidmain(String[]args){System.out.println("CreatingnewCupboard()inmain");newCupboard();System.out.println("CreatingnewCupboard()inmain");newCupboard();t2.f2(1);t3.f3(1);}staticTablet2=newTable();staticCupboardt3=newCupboard();}///:~初始话顺序(二)结果:Bowl(1)Bowl(2)Table()f(1)Bowl(4)Bowl(5)Bowl(3)Cupboard()f(2)CreatingnewCupboard()inmainBowl(3)Cupboard()f(2)CreatingnewCupboard()inmainBowl(3)Cupboard()f(2)f2(1)f3(1)Package(包)一个包就是一些提供访问保护和命名空间管理的相关类与接口的集合使用包的目的就是使类容易查找使用包的作用命名空间的管理防止类名的冲突访问控制privatepublicpackageprotected包的创建格式:packagepkg1[.pkg2[.pkg3]];包名独一无二将Internet域名反写作为包的名称将包的名称分解为机器的目录结构必须放在一个Java文件的第一句import语句格式:importpkg1[.pkg2].(<classname>|*);例子importjava.util.Date;importjava.io.*;注意:使用的类或包必须加载程序中使用‘*’将会延长编译时间,但不会影响类的大小和性能包的使用用包的全名来引用包中的类,要求在类名前加上包的全名。例如:java.lang.refrect.Array.getByte(nameArray,5);用import语句导入包importjava.io.*;用import导入包import包名;例如:importjava.lang.refrect;若要使用包中的类,可用refrect.类名import包名.类名;例如:java.lang.refrect.Array这样,在程序中就可直接引用Arrayimport包名.*;例如:java.lang.refrect.*;它引入了包的所有类,这种方式最常用包对文件的管理在没有package语句的源文件中,一个文件中的所有类都放在默认的无名包中,它对应于当前的目录当有包语句的情况下,解释器按照文件系统的层次结构查找类,所以字节码文件所在目录名应与其中的类所在的包名对应包对文件的管理说明.njtu.graphicsclassCircle{………}
classTriangle{………}包对应的字节码文件cnedunjtugraphicsCircle.classTriangle.class创建包路径格式javac–d包路径根目录源文件例子假设在d:\test\source目录下有一个TestPackage.java文件,定义如下:packageaa.bb.cc;publicclassTestPackage{………}假设想要将编后的字节码文件放到d:\test\classes目录下,则可以使用下列命令:javac–dd:\test\classesd:\test\source\TestPackage.java创建包路径若当前在d:\test\source目录下,则可以使用下列命令将当前目录作为包路径的根目录:javac–d.TestPackage.java其中”.”表示当前目录编译后在d:\test\source\aa\bb\cc\目录下存放TestPackage.class文件编译器、解释器寻找类首先找出环境变量CLASSPATH,CLASSPATH含有一个或多个目录,每个目录作为.class的文件的查找起点Java会从这个起点开始,并将package名称中的每个“.”号替换为斜线以获得在CLASSPATH起点下的路径名称得出的路径会接续于CLASSPATH的各个目录下这些路径名称便是直译器查找你所产生.class的起点例子环境变量classpah的设置有以下两种方式。(1)设置环境变量CLASSPAHTsetclasspath=.;d:\test\classes(2)
用-classpath选项指明java–classpathd:\test\classesaa.bb.cc.TestPackage编译器和解释器可以在classpath指定的路径中搜索到类。上面的例子中解释器会根据路径d:\test\classes和包名aa.bb.cc构造出d:\test\classes\aa\bb\cc路径找TestPackage.class字节码文件。
访问控制类的访问控制一个独立的类称为外部类,嵌在类内部的类称为内部类。所说的类一般指外部类。类可以用公有、友好修饰;不能用保护、私有(编译不过)。每个编译单元(文件)可以有多个类,但只能有一个是公有的,其它都是友好的。公有类名与文件名完全相同。一般设计成一个文件只包含一个类。可能一个文件不含公有类,此时类名可以任意。修饰一个公有类的成员变量和成员函数同一包其它类,可访问该类公有、保护、友好的成员。不同包其它类(不包括子类),仅能访问该类公有成员。同一包的子类,继承父类公有、保护、友好的成员。访问父类公有、保护、友好的成员。继承和访问的一样多。不同包的子类,继承父类公有、保护的成员,不能继承友好成员。访问父类公有成员。继承的多于访问的。可访问(本类声明对象)publicprotecteddefaultprivate1.同一个类yyyy2.同一个包其它类(包括子类)yyyn3.不同包其它类(不包括子类)ynnn可继承(子类声明对象)publicprotecteddefaultprivate1.同一包子类,可继承yyyn2.不同包子类,可继承yynn
public
—所有类都能访问—可以被子类继承—公共的接口
private
—本类可访问
protected
—同一包的所有类可访问;所有子类都可继承。
package:—同一包的所有类可访问;同一包子类可继承。访问控制符总结publicpackageGreek;publicclassAlpha{
publicintiampublic;
publicvoidpublicMethod(){System.out.println("publicMethod");}}packageRoman;importGreek.*;classBeta{voidaccessMethod(){Alphaa=newAlpha();
a.iampublic=10;//?
a.publicMethod();//?}}返回privateclassAlpha{
privateintiamprivate;
privatevoidprivateMethod(){System.out.println("privateMethod");}}classBeta{
voidaccessMethod(){Alphaa=newAlpha();
a.iamprivate=10;//?
a.privateMethod();//?}}返回protectedpackageGreek;classAlpha{
protectedintiamprotected;
protectedvoid
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 卖车合同协议范本
- 2023正规租房协议书样本10篇
- 2023购房合同协议书七篇大全
- 金黄色苔藓病因介绍
- 蛙形腹病因介绍
- 中考政治总复习基础知识梳理七下第一单元做自尊自信的人
- 中小学校长2024年度述职报告范文二
- 新疆维吾尔自治区喀什地区疏勒县实验学校教育集团2023-2024学年七年级11月月考道德与法治试题(解析版)-A4
- 第一章 给水排水管道工程概论-1.1 给水排水系统的组38课件讲解
- 《居住小区调研报告》课件
- 中医内科学虚劳培训课件
- 2024广东省建筑安全员A证考试题库附答案
- 商业广场环境卫生保洁方案
- 2024年建筑消防设计改造服务合同3篇
- 2024年建设银行个人住房贷款标准协议模板一
- 大学生职业规划采访稿
- 中国血管性认知障碍诊治指南(2024版)解读
- 2024年度防水材料品牌推广与销售合同2篇
- 实+用法律基础-形成性考核任务四-国开(ZJ)-参考资料
- 2024年国网公司企业文化与职业道德试考试题库(含答案)
- 《中国急性肾损伤临床实践指南(2023版)》解读
评论
0/150
提交评论