第三章对象与类3.
1类与对象3.
2定义类3.
3成员变量的作用域3.
4方法重载3.
5创建对象3.
6构造方法3.
7this关键字3.
8初始化问题3.
9static关键字3.
10对象的清理3.
11访问控制修饰符3.
12具体隐藏实现3.
13参数传递3.
14总结3.
1定义类传统程序设计语言的不足数据和对数据的操作相分离面向对象设计的思想什么是对象一切都是对象对象与类的关系类是对象的模版,对象是类的实例3.
2定义类类是组成程序的基本单元,定义了自己的类就是定义了要使用的对象的类型.
例:定义一个汽车类:classCar{intcolor;intdoor;intspeed;voidstart(voidbrake(声明一个汽车类的引用变量:CarmyCar;声明类的语法:修饰符class类名称{//成员变量//方法}Java基本数据类型Java数据类型包括基本数据类型和引用类型包装器类型把基本数据类型数据"包装"成对象从int类型创建一个Integer对象:intmyInt;IntegermyInteger=newInteger(myInt);从包装对象中取出基本类型值:myInt=myInteger.
intValue();Java基本数据类型第一个Java程序程序3.
1Rectangle.
javaclassRectangle{inta,b;intgetArea(returna*b;voidlocate(intx,inty)System.
out.
println("Thepositions("+x+","+y+publicstaticvoidmain(Stringargs[Rectangler1=newRectangle();r1.
locate(3,4);r1.
a=2;r1.
b=3;intarea=r1.
getArea();System.
out.
println("Areaofr1is:"+area);}}第一个Java程序main方法是程序的入口包含main方法的类是Java应用程序的主类一个Java源文件可以包含多个类,但同一个Java源文件只有主类可以声明为publicJava源文件的命名必须与主类同名3.
3成员变量的作用域在Java中变量的作用域是由大括号组成的程序块决定在不嵌套的程序块中可以多次声明相同变量在嵌套的程序块中不允许重复声明同名的变量声明在方法中的变量为局部变量,与实例变量重名的局部变量会覆盖实例变量,其作用域为整个方法体.
见程序3.
2TestScoping.
java作用域举例{intx=1;inty=2//xy可用x可用y超出作用域}合法的声明:{intx=1;}{intx=2;}不合法的嵌套声明:{intx=1;intx=2;}}3.
4方法重载方法重载(Overload)是指一个类中可以定义参数列表不同但名字相同的多个方法,调用时,会根据不同的参数列表来选择对应的方法.
重载的方法名字必须相同重载的方法参数必须不同当一个重载方法被调用时,Java用参数的类型和(或)数量来表明实际调用的重载方法的版本.
每个重载方法的参数的类型和(或)数量必须是不同的.
虽然每个重载方法可以有不同的返回类型,但返回类型并不足以区分所使用的是哪个方法.
当Java调用一个重载方法时,参数与调用参数匹配的方法被执行.
见程序3.
3TestOverload.
java程序3.
4TestOverload1.
java被重载的方法必须有不同的参数列表,前面例子区分重载方法的参数采用了或者数量不同,或者类型不同,参数顺序不同虽然也可以重载,但是容易产生歧义.
例:程序3.
5TestOverload2.
javapublicclassTestOverload2{voidprint(inta,floatb){System.
out.
println("Printintaandfloatb:"+a+""+b);}voidprint(floata,intb){System.
out.
println("Printfloataandintb:"+a+""+b);}publicstaticvoidmain(String[]args)TestOverload2obj=newTestOverload2(obj.
print(1,2);}}3.
5创建对象先声名引用变量Rectangler1;然后创建对象赋值给r1:r1=newrectangle();声明引用变量的同时产生一个对象赋给它:Rectangler1=newRectangle();引用变量r1"代表"了一个矩形对象,我们就可以使用引用变量加句点形式访问对象的成员了在Java中基本类型变量存储在栈的内存结构中intx=10;booleany=true;引用型变量内储存着对象实例的地址声明两个矩形类引用变量r1、r2:Rectangler1,r2;r1、r2没有指向任何对象实例,系统默认赋初值null产生一个新对象实例并赋值给r1:r1=newrectangle();r2=r1;在java中字符串类型数据是按照对象来处理的两种方式显式和隐式创建Java为了加快程序的执行速度,把隐式创建的字符串对象放在栈中一个特殊区域—字符串池(StringPool)中,相同内容的字符串对象只保留一份.
Stringstr1=newString("Hellojava!
");Stringstr2="HelloJava!
"程序3.
6TestString.
javapublicclassTestString{publicstaticvoidmain(String[]args)Stringstr1=newString("HelloJava!
Stringstr2=str1;Stringstr3="HelloJava!
Stringstr4="HelloJava!
System.
out.
println(str1==str2)System.
out.
println(str1==str3)System.
out.
println(str3==str4);}}输出结果:truefalsetrue3.
6构造方法构造方法是创建对象时调用的特殊方法方法名必须与要创建对象的类名相同不允许声明返回类型,即使声明为void也是不正确的如果类中并没有定义构造方法,Java会自动地给你添加一个无参的缺省构造方法可以自定义重载的多个构造方法,在创建对象时使实例多样化.
(重载)例:程序3.
7Student.
java3.
7this关键字publicStudent(intage){System.
out.
println("Invokeconstructorwithage.
");age=age;}以上构造方法中出现age=age的奇怪语句,this关键字用来解决这个问题.
this引用指向的是其本身所在方法的当前对象.
以上构造方法若采用this关键字则修改为:publicStudent(intage){System.
out.
println("Invokeconstructorwithage.
");this.
age=age;}this.
age=age意指把参数age的值赋给类成员变量age.
3.
8初始化问题如果程序员使用了缺省的构造方法并且没有在类中初始化成员变量,创建对象时系统会对各种类型的成员变量按表3.
3自动进行初始化赋予一个默认值.
用构造方法完成初始化可以使用自定义的构造方法在方法体内初始化成员可以在构造方法中使用this()调用其它构造方法以减少代码冗余构造方法内this必须在第一行只能调用一次this()不允许调用两次this()只能在构造器中使用,其他成员方法不得调用.
classStudent{intage;Stringname;publicStudent(){System.
out.
println("Creatingdefaultstudent.
");System.
out.
println("Defaultage="+age);System.
out.
println("Defaultname="+name)publicStudent(inta,Stringn){this(a);//必须在第一句name=n;System.
out.
println("Initializestudentwithnameandage.
publicStudent(intage){this.
age=age;System.
out.
println("Initializestudentwithage.
publicStudent(Stringnamethis.
name=name;System.
out.
println("Initializestudentwithname.
publicclassTestThis{publicstaticvoidmain(String[]args)Studentst1=newStudent(newStudent(24,"Jacky"程序3.
8TestThis.
java3.
9static关键字声明为static的成员方法和变量在内存中固定只存在一份,也就是说所有类都可以共享使用的声明为静态的成员变量和成员方法在类内部可以直接使用,在类外部可以通过类名加句点的方式直接访问,而不必实例化再使用静态方法内部不能调用非静态方法,因为静态方法本身是不会实例化的;this在静态方法中没有意义3.
10对象的清理C语言和c++是通过程序员自己定义对象的生命周期,你必须在适当的时候自己写程序清除不再使用的对象空间Java将释放无用内存空间的任务交给了Java虚拟机,通过垃圾回收器来回收无用对象的内存空间程序员无需强制垃圾回收器立即执行进行清除工作,只有当内存资源不够用时垃圾回收器才开始真正回收空间,所以整个程序过程中垃圾回收器可能不需要工作.
什么样的对象将被垃圾回收classStudent{intage;Stringname;publicStudent(Stringn){name=n;publicstaticvoidp(){Studentst1=newStudent("Peter");Studentst2=newStudent("Julie");st1=st2;st2=null;publicclassTestGcpublicstaticvoidmain(String[]args)Student.
p(程序3.
9TestGc.
java静态方法p中首先创建了两个学生Peter和Julie,然后引用st1指向st2,这时st1和st2同时指向Julie,对象Peter没有引用变量引用,所以处于待回收状态,st2赋空值后仍然有st1指向Julie所以Julie这时还不是垃圾,当方法p()执行完成返回main方法时,局部变量st1和st2超出作用域,结束生命.
内存堆中的Peter和Julie都变成了垃圾,处于待回收状态.
处于待回收状态只是告诉虚拟机哪些对象是垃圾,并不不知道垃圾回收器什么时候回收他们.
当内存资源紧张时,垃圾回收器会及时工作清理这些垃圾.
finalize()在某些情况下回收垃圾对象时需要结束与这个对象相关的一些工作,比如说某个对象打开了一个文件,那么清除这个对象时就需要关闭这个文件,否则这个文件在垃圾对象被回收以后就无法再编辑和关闭了finalize方法可以完成这些工作.
finalize方法在垃圾回收发生之前调用,用来验证回收条件是否成熟,比如你的对象可能还与其他对象联系在一起,这时在finalize方法中设定条件,阻止垃圾回收,使垃圾对象"复活".
3.
11访问控制修饰符类成员修饰符public指定类成员为public时,该类成员在任何类中都可以通过一个该类对象的引用来进行访问,当然该类内部可直接访问.
private即声明说这是私有的,指定成员变量或方法为private时,该类成员变为此类的"私有财产",只能在该类中访问.
defualt即缺省,修饰符为隐含的package,可以在该类中访问,也能够在同一包中的类访问.
但在不同包中即使是其子类也无法访问.
protected说明该成员是受保护的,可以在该类中访问.
同时同一包中的类也可以对其进行访问,不同包的子类也可以进行访问.
类修饰符:public、default指定为public时,可以通过import指令对该类进行复用.
如果缺省则是隐含的package访问修饰语,这时只有在相同包里的类才能调用该类.
3.
12具体隐藏实现具体隐藏实现是面向对象设计中一个非常重要的概念,通过使用访问控制修饰符,把类中的无须公开的数据与方法封装起来,对外隐藏了类功能的具体实现过程.
改变类的功能时不会影响类的使用者,并且提高了程序的安全性与可维护性.
通过添加访问器和修改器修改Rectangle类classRectangle{privateinta,b;publicintgetArea(returna*b;}publicintsetAB(inta,intb)if(a内存地址值.
引用变量的参数传递仍然是值传递.
程序3.
10TestPass.
javaclassStudent{intage;Stringname;publicStudent(inta,Stringn){age=a;name=n;}}publicclassTestPass{publicstaticvoidchangeAge(intfromAge,inttoAge){fromAge=toAge;System.
out.
println("AfterinvokemethodchangeAgefromAgeis:"+toAge)publicstaticvoidchangeObjAge(Studentst,inttoAge){st.
age=toAge;publicstaticvoidmain(String[]args)Studentst1=newStudent(19,"Jacky"changeAge(st1.
age,20)System.
out.
println("AfterinvokemethodchangeAgestudentageis:"+st1.
age)changeObjAge(st1,20)System.
out.
println("AfterinvokemethodchangeObjAgestudentageis:"+st1.
age)changeObjAge方法通过接受引用变量参数改变了对象的成员值,如果你从此就认为传递了引用变量参数就可以改变对象就大错特错了.
以修改后的程序3.
10TestPass1.
java为例方法调用完毕st完成使命从内存中释放,而原来的st1仍然指向"Jacky","Julie"没有引用变量再引用它成为垃圾,等待垃圾回收器清除.
整个过程"Jacky"没有发生改变.
由此可知,Java的参数传递都是值传递,只要理解了这一点并掌握了内存的变化过程,这样的错误很容易避免.
4.
8总结面向对象设计是一种更接近人类自然思维的程序设计方法,最重要的就是通过类的定义与使用,类的封装等特性提高程序的复用性.
类是封装了相同属性与行为的一类对象的模版,对象就是类的实例,使用new关键字加构造方法的方式创建对象,然后通过引用变量名加点(.
)运算符来访问对象成员.
实例成员变量是属于类的一个对象实例的变量,要使用它必须通过创建类的对象实例然后用引用变量访问它.
类属成员变量和方法,即静态成员,用static关键字声明,静态变量和静态方法不依赖于具体实例,可以通过类名直接访问.
修饰符指定类、方法和数据的访问方式.
public表示任何用户都具有访问权限.
Private表示方法和数据成员只能在类内部访问.
方法的所有参数传递都是值传递.
对于基本类型的参数传递实际值,对于引用类型的参数传递对象的引用.
具体隐藏实现是通过设定修改器与访问器方法把类中的数据封装起来,通过这些方法访问类的数据提高了安全性.
This是指向类的当前实例的引用,关键字this也能在构造方法中使用,this()调用同一个类的另一个构造方法.
创建的对象存储在对内存中,这是一种灵活的存储机制,你不必自己定义对象的生命周期,在合适的时候垃圾回收器会对垃圾对象进行清理以释放内存空间.
搬瓦工最近新增了荷兰机房中国联通(AS9929、AS4837)线路的VPS产品,选项为NL - China Unicom Amsterdam(ENUL_9),与日本软银和洛杉矶(DC06)CN2 GIA配置一致可以互换,属于高端系列,2.5Gbps-10Gbps大带宽,最低季付46.7美元起。搬瓦工VPS隶属于老牌IT7公司旗下,主要提供基于KVM架构VPS主机,数据中心包括美国洛杉矶、凤凰城、纽...
Advinservers,国外商家,公司位于新泽西州,似乎刚刚新成立不久,主要提供美国和欧洲地区VPS和独立服务器业务等。现在有几款产品优惠,高达7.5TB的存储VPS和高达3.5TBDDoS保护的美国纽约高防服务器,性价比非常不错,有兴趣的可以关注一下,并且支持Paypal付款。官方网站点击直达官方网站促销产品第一款VPS为预购,预计8月1日交付。CPU为英特尔至强 CPU(X 或 E5)。官方...
今天有网友提到自己在Linux服务器中安装VNC桌面的时候安装都没有问题,但是在登录远程的时候居然有出现灰色界面,有三行代码提示"Accept clipboard from viewers,Send clipboard to viewers,Send primary selection to viewers"。即便我们重新登录也不行,这个到底如何解决呢?这里找几个可以解决的可能办法,我们多多尝试。...