您好,欢迎访问三七文档
8.1引言8.2定义对象的类8.4构造方法8.5通过引用变量访问对象8.6使用java中的类8.7静态变量、常量、静态方法8.8可见性修饰符8.9数据域封装补充:不可变对象和类8.10对象引用作为参数补充:变量的作用域补充:关键字this8.11对象数组第8章对象和类8.1引言面向对象的程序设计–与结构化程序设计方法相比,OO更符合人类认识现实世界的思维方式–已成为程序设计的主流方向–涉及的主要概念抽象封装继承多态第11章第8,10章所有对象的抽象,是类。类是模板。对象是类的具体实例(instance,实例化instantiation)实例变量实例方法8.2定义对象的类对象的状态status数据域属性成员变量对象的行为behavior成员方法(函数)OOP8.3举例:定义类和创建对象classCircle{privatedoubler;publicvoidsetR(doublex){r=x;}publicdoublegetArea(){returnMath.PI*r*r;}}classTestCircle{publicstaticvoidmain(String[]s){Circlec1=newCircle();Circlec2=newCircle();c1.setR(1);c2.setR(2);System.out.println(c1.getArea());System.out.println(c2.getArea());}}8.4使用构造方法构造对象构造方法–一种和类同名的特殊方法–用来初始化对象–Java中的每个类都有构造方法,用来初始化该类的一个新的对象–没有定义构造方法的类,系统自动提供默认的构造方法构造方法的特点–方法名与类名相同–没有返回类型,修饰符void也不能有。如果有,编译器认为它是普通方法,而非构造方法–通常被声明为公有的(public)–可以有任意多个参数–主要作用是完成对象的初始化工作–不能在程序中显式的调用–在生成一个对象时,系统会自动调用该类的构造方法为新生成的对象进行初始化–没有定义构造方法的类,系统自动提供默认的构造方法系统提供的默认构造方法–如果在类的声明中没有声明任何构造方法,则Java编译器会提供一个默认的构造方法–默认的构造方法没有参数,其方法体为空–使用默认的构造方法初始化对象时,如果在类声明中没有给实例变量赋初值,则对象的属性值为零或空声明一个银行帐号类及测试代码classBankAccount{StringownerName;intaccountNumber=2012;floatbalance;}publicclassBankTester{publicstaticvoidmain(Stringargs[]){BankAccountmyAccount=newBankAccount();System.out.println(ownerName=+myAccount.ownerName);System.out.println(accountNumber=+myAccount.accountNumber);System.out.println(balance=+myAccount.balance);}}运行结果ownerName=nullaccountNumber=2012balance=0.0自定义构造方法与方法重载–可在生成对象时给构造方法传送初始值,使用希望的值给对象初始化–构造方法可以被重载,构造方法的重载和方法的重载一致–一个类中有两个及以上同名的方法,但参数表不同,这种情况就被称为方法重载。在方法调用时,Java可以通过参数列表的不同来辨别应调用哪一个方法ClassCircle{doubleradius=1.0;Circle(){}Circle(doublenewRadius){radius=newRadius;}doublegetArea(){returnradius*radius*Math.PI}}publicclassTest{publicstaticvoidmain(){Circlec=newCircle();Circled=newCircle(2.0);……}}自定义无参的构造方法–无参的构造方法对其子类的声明很重要。如果在一个类中不存在无参的构造方法,则要求其子类声明时必须声明构造方法,否则在子类对象的初始化时会出错–在声明构造方法时,好的声明习惯是不声明任何构造方法如果声明,至少声明一个无参构造方法构建一个Bush类,有两个有参数的构造方法classBush{Bush(inti){}Bush(doubled){}}–如果写:newBush();编译器将要告诉你找不到对应的构造方法说明–用户在进行类声明时,如果没有声明任何构造方法,系统会赋给此类一个默认(无参)的构造方法。但是,只要用户声明了构造方法,即使没有声明无参的构造方法,系统也不再赋默认的构造方法记住一点:在构造子类时,一定会显式或隐式地调用到父类的构造方法。classA{publicA(){}//1:无参数构造方法。publicA(Strings){}//2:有参构造方法}classBextendsA{publicB(Strings){super(s);//3.显式调用父类的构造方法}}如果1和3都去掉,编译会不会报错?8.5通过引用变量访问对象8.5.1引用变量和引用类型类名对象引用变量名;对象引用变量名=new类名();ClassCircle{doubleradius=1.0;Circle(){}Circle(doublenewRadius){radius=newRadius;}doublegetArea(){returnradius*radius*Math.PI}}publicclassTest{publicstaticvoidmain(){Circlec=newCircle();Circled=newCircle(2.0);……}}8.5.2访问对象的数据和方法点运算符.Circlec=newCircle();c.radiusc.getArea();有时候,创建对象后很快不用,回收内存,创建对象不需要引用对于实例变量和实例方法:对象.变量或对象.方法对于静态变量和静态方法:常用类名.变量或类名.方法也可以对象.变量或对象.方法举例对象的声明–格式类名变量名Clockaclock;–声明一个引用变量时并没有对象生成对象的创建–生成实例的格式:new类名()例如:aclock=newClock()其作用是:在内存中为此对象分配内存空间返回对象的引用8.5.3数据域引用和null成员变量有默认值:引用型:null数值型:00.0boolean型:falsechar型:‘\u0000’(空不显示DOS若字体大a)局部变量没有默认值:必须初始化,否则编译错8.5.4基本数据类型变量和引用类型变量的区别P218图8-7图8-88.6使用java中的类System类currentTimeMillis()返回1970-1-1日0时到现在的毫秒数java.util.Date类newDate().getTime()同上Math类random(),返回[0.0,1.0)之间的double数值java.util.Random类newRandom().nextInt(101);返回(0,101)间整数newRandom().nextDouble();返回(0.0,1.0)间小数8.7静态变量、常量、静态方法数据成员–表示Java类的状态–声明数据成员必须给出变量名及其所属的类型,同时还可以指定其他特性–在一个类中成员变量名是唯一的–数据成员的类型可以是Java中任意的数据类型(简单类型,类,接口,数组)–分为实例变量和类变量–声明格式[public|protected|private][static][final][transient][volatile]变量数据类型变量名1[=变量初值],变量名2[=变量初值],…;–格式说明public、protected、private为访问控制符static指明这是一个静态成员变量,属于类final指明变量的值不能被修改transient指明变量是临时状态volatile指明变量是一个共享变量实例变量–没有static修饰的变量称为实例变量(InstanceVariables)–只能在对象创建后使用–用来存储所有实例都需要的属性信息,不同实例的属性值可能会不同–可通过下面的表达式访问实例属性的值实例名.实例变量名类变量–也称为静态变量,声明时需加static修饰符–不管类的对象有多少,类变量只存在一份,在整个类中只有一个值–类初始化的同时就被赋值–适用情况类中所有对象都相同的属性经常需要共享的数据系统中用到的一些常量值–引用格式类名|实例名.类变量名类方法静态方法同上声明常量用finalfinal类变量必须在声明的同时初始化多数时候,常量被类的所有对象共享,故,finalstaticdoublep=3.14补充:final修饰类?abstract修饰类?static方法中不能访问非static成员publicclassFoo{publicvoidmethod1(){System.out.println(china+Math.PI);}publicstaticvoidmain(String[]args){method1();//编译错}}Fooa=newFoo();a.method1();问:编程时,变量和方法是否该定义成static的?答:看其是否与具体实例相关8.8可见性修饰符类成员的访问控制–公有(public)可以被其他任何对象访问(前提是对类成员所在的类有访问权限)–保护(protected)只可被同包任何类,同一类及其子类的实例对象访问–私有(private)只能被这个类本身访问,在类外不可见–默认(default)仅允许同一个包内的访问;又被称为“包(package)访问权限”类型private无修饰protectedpublic同一类yesyesyesyes同一包中的子类noyesyesyes同一包中的非子类noyesyesyes不同包中的子类nonoyesyes不同包中的非子类nononoyes修饰成员(数据和方法)时修饰类时类的访问控制–类的访问控制只有public(公共类)及无修饰符(缺省类)两种–访问权限符与访问能力之间的关系如表类型无修饰public同一包中的类yesyes不同包中的类noyes8.9数据域封装P227private成员变量作用:①防止数据被其它类直接篡改;②容易调试维护public返回类型set方法//设置器修改器public返回类型get方法//读取器访问器如果返回值是boolean型,get方法往往取名is属性名()8.10对象引用作为方法参数Java只有一种参数传递方式:值传递参数本身不会被改变P2298.11对象数组基本数据类型数组inta[]=newint[5];对象数组Circleb[]=newCircle[5];for(Circlei:b)i=newCircle();ab
本文标题:第8章 对象和类
链接地址:https://www.777doc.com/doc-3218451 .html