版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、L/O/G/O第第7章章 Java 语言类的特性语言类的特性类的私有成员与公共成员类的私有成员与公共成员方法的重载方法的重载构造方法构造方法类的静态成员类的静态成员对象的应用对象的应用类的成员声明前加上私有访问控制符类的成员声明前加上私有访问控制符privateprivate,则成员只能被则成员只能被该类自身该类自身访问和修改,而不能访问和修改,而不能被被其他类其他类(包括该类的子类)访问。(包括该类的子类)访问。达到了对数据最高级别保护的目的。达到了对数据最高级别保护的目的。思考:思考:例例7.17.1中私有成员的可访问范围中私有成员的可访问范围? ?类的成员声明前加上公共访问控制符类的成员
2、声明前加上公共访问控制符publicpublic,则表示该成员可以被则表示该成员可以被其他类其他类所访问。所访问。造成安全性和数据封装性的下降,所以一般造成安全性和数据封装性的下降,所以一般减少该成员的使用。减少该成员的使用。( (例例7.2)7.2)通过公共成员方法通过公共成员方法SetCylinderSetCylinder(),(),私有成员私有成员radiusradius和和heightheight才能得到修改。在才能得到修改。在公共成员方法内添加判断代码,可以杜绝错公共成员方法内添加判断代码,可以杜绝错误数据的输入。误数据的输入。若在类成员的前面不加任何访问控制符,则若在类成员的前面不
3、加任何访问控制符,则该成员具有缺省的访问控制特性该成员具有缺省的访问控制特性。缺省访问控制权,表示这个成员只能被同一缺省访问控制权,表示这个成员只能被同一个包(类库)中的类所访问和调用,如果一个包(类库)中的类所访问和调用,如果一个子类与父类位于不同的包中,子类也不能个子类与父类位于不同的包中,子类也不能访问父类中的缺省访问控制成员,也就是说访问父类中的缺省访问控制成员,也就是说其他包中的任何类都不能访问缺省访问控制其他包中的任何类都不能访问缺省访问控制成员。成员。同理,对于类来说,如果一个类没有访问控同理,对于类来说,如果一个类没有访问控制符,说明它具有缺省访问控制特性制符,说明它具有缺省访
4、问控制特性6 公共类和非公共类的属性(变量)和方法的访问控制表及图示见下图:7 public: 任何其它类、对象只要可以看到这个类的话,那么它就可以存取变量的数据,或使用方法。 protected:同一类,同一包可以使用。不同包的类要使用,必须是该类的子类。 private:不允许任何其他类存取和调用。 default:(前边没有修饰字的情况)在同一包中出现的类才可以直接使用它的数据和方法. 方法的重载是实现方法的重载是实现“多态多态”的方法之一。的方法之一。方法的重载是指方法带有不同的参数,方法的重载是指方法带有不同的参数,但但使用使用相同的名字相同的名字。方法的参数不同则表示实现不同的功能
5、,但功方法的参数不同则表示实现不同的功能,但功能相似。能相似。所谓参数不同是指:所谓参数不同是指:参数个数不同、参数类型参数个数不同、参数类型不同、参数的顺序不同不同、参数的顺序不同。参数的名字不同不能。参数的名字不同不能说明是方法的重载。说明是方法的重载。JavaJava中不允许参数个数或参数类型完全相同,中不允许参数个数或参数类型完全相同,而只有返回值类型不同的重载。而只有返回值类型不同的重载。例例9int add(int x, int y);int add(int x, int y, int z);float add(float f1, float f2);float add(float
6、 f1, int y);float add(int y, float f1);float add(int x, int y);int add(int u, int v);所谓参数不同是指:所谓参数不同是指:参数参数个数不同、参数类型不同、个数不同、参数类型不同、参数的顺序不同参数的顺序不同。参数的。参数的名字不同不能说明是方法名字不同不能说明是方法的重载。的重载。JavaJava中不允许参数个数或中不允许参数个数或参数类型完全相同,而只参数类型完全相同,而只有返回值类型不同的重载。有返回值类型不同的重载。右侧是否有不是方法重载右侧是否有不是方法重载的例子的例子? ?10/ Overloaded
7、 methods with identical signatures / cause compilation errors, even if return types are different.public class MethodOverloadError public int square( int x ) return x * x; public double square( int y ) return y * y; / end class MethodOverloadError两个方法仅有返回值不同,不是重载,而是语法错误。11(constructor)(constructor)是
8、是一种特殊的方法,一种特殊的方法,它是在对象被创建它是在对象被创建时时初始化对象的成初始化对象的成员员的方法。的方法。思考:如何为圆柱思考:如何为圆柱体类的成员变量赋体类的成员变量赋值?值?class Cylinder double radius; int height; double pi=3.14; double area( ) return pi*radius* radius; double volume() return pi*radius* radius*heigh; 12public class App6_3 public static void main(String args)
9、 Cylinder volu=new Cylinder(); volu.radius = 2.8; volu.height = 5; class Cylinder ; void setCylinder(double r, int h, double p) pi=p; radius=r; height=h; public class App6_4 public static void main(String args) Cylinder volu=new Cylinder(); volu.setCylinder(2.5, 5, 3.14); 方法方法1 方法方法2 构造方法的方法名与类名相同。构
10、造方法的方法名与类名相同。构造方法构造方法没有返回值没有返回值,也,也不能有不能有voidvoid。构造方法的主要作用是构造方法的主要作用是对类对象的初始化工作对类对象的初始化工作。构造方法一般不能由编程人员显式地直接调用,构造方法一般不能由编程人员显式地直接调用,而是用而是用newnew来调用。来调用。在创建一个类的对象的同时,系统会在创建一个类的对象的同时,系统会自动调用自动调用该类的构造方法为新的对象初始化。该类的构造方法为新的对象初始化。可带参数,还可以完成赋值之外的其他复杂操可带参数,还可以完成赋值之外的其他复杂操作。作。13不含返回值的概不含返回值的概念念 不同于不同于void,因
11、为构造方法的因为构造方法的返回值就是该类返回值就是该类本身。本身。14class Cylinder private double radius; private int height; private double pi=3.14; public Cylinder(double r, int h) radius=r; height=h; double area() return pi* radius* radius; double volume() return area()*height; public class App7_4 public static void main(String
12、args) Cylinder volu=new Cylinder(3.5, 8); System.out.println(圆柱底面积=+ volu.area(); System.out.println(圆柱体体积=+volu.volume(); 例例7.4:7.4: 如果去掉带参数的构造方法如果去掉带参数的构造方法, ,如如何创建实例对象何创建实例对象? ? 在该构造方法存在的在该构造方法存在的情况下是否还可以如此情况下是否还可以如此? ?如果省略构造方法,如果省略构造方法,JavaJava编译器会自动为该类编译器会自动为该类生成一个默认的构造方法,程序在创建对象时生成一个默认的构造方法,程序
13、在创建对象时会自动调用默认的构造方法。会自动调用默认的构造方法。默认的构造方法没有参数,在其方法体中也没默认的构造方法没有参数,在其方法体中也没有任何代码,即什么也不做有任何代码,即什么也不做。若若classclass前面有前面有publicpublic修饰符,则默认的构造修饰符,则默认的构造方法前面也是方法前面也是publicpublic。一旦用户为某类定义了构造方法,系统就不再一旦用户为某类定义了构造方法,系统就不再提供默认的构造方法,这是提供默认的构造方法,这是JavaJava的覆盖所致。的覆盖所致。构造方法的构造方法的重载,让用重载,让用户用不同的户用不同的参数来构造参数来构造初始化初
14、始化对象。对象。16public class Employee private String name; private int salary; public Employee(String n, int s) name = n;salary = s; public Employee(String n) name = n; salary = 0; public Employee() name = “不知道”; salary = 0; 17public class Employee private String name; private int salary; public Employee(
15、String n, int s) name = n;salary = s; public Employee(String n) this( n, 0); public Employee() this(“不知道”, 0); 如果有一个类带有几个如果有一个类带有几个构造函数,如果想复制构造函数,如果想复制其中一个构造函数的某其中一个构造函数的某方面效果到另一个构造方面效果到另一个构造函数中。可以通过使用函数中。可以通过使用关键字关键字thisthis作为一个方作为一个方法调用来达到这个目的法调用来达到这个目的18class Cylinder private double radius; priva
16、te int height; private double pi=3.14; String color; public Cylinder() radius=1; height=2; color=绿色; public Cylinder(double r, int h, String str) radius=r; height=h; color=str; public void setColor() System.out.println(该圆柱的颜色为:“ + color); double area() return pi* radius* radius; double volume() retu
17、rn area()*height; 例例缩短程序代码,减少开发程序时间。缩短程序代码,减少开发程序时间。 从某一构造方法内调用另一构造方法,从某一构造方法内调用另一构造方法,必必须须通过关键字通过关键字thisthis来调用的来调用的,否则编译出,否则编译出错。错。thisthis关键字必须写在构造方法内的关键字必须写在构造方法内的第一行第一行位置。位置。例例构造方法一般都是构造方法一般都是publicpublic,因为它们在创建对,因为它们在创建对象时,是在类的外部被系统自动调用的。象时,是在类的外部被系统自动调用的。构造函数若被声明为构造函数若被声明为privateprivate,则无法在
18、构造,则无法在构造方法所在的类以外的地方被调用,但在该类的方法所在的类以外的地方被调用,但在该类的内部还是可以被调用。内部还是可以被调用。例例在类定义中如果成员变量或成员方法没有用在类定义中如果成员变量或成员方法没有用staticstatic来修饰,则该成员就是来修饰,则该成员就是实例成员实例成员。被。被staticstatic修饰的成员称为修饰的成员称为类成员类成员。实例变量又称为域变量。实例变量是从属于实例变量又称为域变量。实例变量是从属于对象的,即每个对象的,即每个对象都各自拥有保存自己对象都各自拥有保存自己实实例例成员的存储空间,而不与其他对象共享。成员的存储空间,而不与其他对象共享。
19、22如在例如在例7.57.5的主方法的主方法main()main()中分别用中分别用newnew运算运算符产生两个新的对象符产生两个新的对象volu1volu1和和volu2volu2。这两个。这两个对象都各自拥有自己保存自己成员的存储空对象都各自拥有自己保存自己成员的存储空间,而不与其他对象共享。间,而不与其他对象共享。( (图图7.1)7.1)若修改了若修改了volu1volu1的某个成员变量的值,而的某个成员变量的值,而volu2volu2的成员变量不受影响。这样的成员变的成员变量不受影响。这样的成员变量称为实例变量。量称为实例变量。用用staticstatic修饰的成员变量称为修饰的成
20、员变量称为“静态变量静态变量”,静,静态变量也称为类变量。静态变量是隶属于类的变态变量也称为类变量。静态变量是隶属于类的变量,而不是属于任何一个类的具体对象。量,而不是属于任何一个类的具体对象。对于某类的任何一个具体对象而言,静态变量是对于某类的任何一个具体对象而言,静态变量是一个公共的存储单元。一个公共的存储单元。对于某类的任一对象访问静态变量访问它时,取对于某类的任一对象访问静态变量访问它时,取到的都是相同数值;同样,任一对象修改它也是到的都是相同数值;同样,任一对象修改它也是在同一内存单元做操作。在同一内存单元做操作。 使用使用格式有如下两种:格式有如下两种: 23类名类名. .静态变量
21、名静态变量名; /; /建议采用建议采用 对象名对象名. .静态变量名静态变量名; ; 例例24class AA char data; static int share_data;class Demo AA a,b,c,d;object achar dataobject cchar dataObject bchar datastatic intshare_dataobject dchar data 类变量在各实例间共享类变量在各实例间共享25v在在JavaJava中没有一个直接的修饰符来实现常量,而是通过静态中没有一个直接的修饰符来实现常量,而是通过静态成员变量的方式来实现的,如下代码说明了这
22、个问题。成员变量的方式来实现的,如下代码说明了这个问题。v1 1/声明声明3 3个常量个常量X X、Y Y、Z Zv2 2public static final public static final intint X=10; X=10;v3 3static public final static public final intint Y=20; Y=20;v4 4final static public final static public intint Z=40; Z=40;v vstaticstatic表示属于类,不必创建对象就可以使用,因为常量应表示属于类,不必创建对象就可以使用,因
23、为常量应该不依赖于任何对象,该不依赖于任何对象,finalfinal表示值不能改变。一般用作常量表示值不能改变。一般用作常量的静态成员变量访问权限都设置为的静态成员变量访问权限都设置为publicpublic,因为常量应该允,因为常量应该允许所有类或对象访问。许所有类或对象访问。 静态变量 与 常量 用用staticstatic修饰的方法是属于类的静态方法修饰的方法是属于类的静态方法(类方类方法法)。 非非staticstatic的方法是属于某个对象的方法,在该对象的方法是属于某个对象的方法,在该对象创建时,对象的方法在内存中拥有属于自己专用的创建时,对象的方法在内存中拥有属于自己专用的代码段
24、;而代码段;而staticstatic的方法是属于整个类的,它在内的方法是属于整个类的,它在内存中的代码段将被所有对象所共用。存中的代码段将被所有对象所共用。 静态方法访问格式:静态方法访问格式:26类名类名. .静态静态方法方法名名()(); /; /建议采用建议采用 对象名对象名. .静态静态方法方法名名()(); ; 例例27类类( (静态静态) )方法方法类方法独立于该类的任何对象,其他类不用实例化类方法独立于该类的任何对象,其他类不用实例化即可调用它们。即可调用它们。类方法可以调用其它的类方法可以调用其它的staticstatic方法;方法;类方法可以访问类方法可以访问statics
25、tatic变量和该方法的局部变量;变量和该方法的局部变量;类方法不能以任何形式引用类方法不能以任何形式引用this this 和和supersuper类方法不能直接访问实例变量和实例方法;类方法不能直接访问实例变量和实例方法; 而同一个类的实例方法可以访问该类的类变量和而同一个类的实例方法可以访问该类的类变量和类方法。类方法。28 不正确的引用: StaticErrorclass StaticError String mystring=“hello”; public static void main(String args) System.out.println(mystring); 编译时错
26、误信息: nonstatic variable mystring cannot be referenced from a static context 为什么不正确:只有实例方法可以访问实例变量。 一个类的static方法不能直接访问实例变量和实例方法。29正确的引用正确的引用 解决的办法1. 将变量改成类变量class StaticError static String mystring=“hello”; public static void main(String args) System.out.println(mystring); 30正确的引用正确的引用2. 先创建一个类的实例,再通
27、过该对象访问该变量。class NoStaticError String mystring=“hello”; public static void main(String args) NoStaticError noError; noError = new NoStaticError(); System.out.println(noError.mystring); 31n在在Java中,中,main()方法是方法是Java应用程序的入口方法应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方,也就是说,程序在运行的时候,第一个执行的方法就是法就是main()方法,这个方法和其他的方法
28、有很大方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是的不同,比如方法的名字必须是main,方法必须是,方法必须是public static void 类型的,方法必须接收一个字符类型的,方法必须接收一个字符串数组的参数等等。串数组的参数等等。n因为因为main()方法是由方法是由Java虚拟机调用的,所以必须虚拟机调用的,所以必须为为public,虚拟机调用,虚拟机调用main()方法的时候不需要产方法的时候不需要产生任何对象,所以生任何对象,所以main方法声明为方法声明为static,且不需,且不需要返回值,所以声明为要返回值,所以声明为void 。npublic stati
29、c void main(String args) 是由关键字是由关键字staticstatic修饰的修饰的 括起来的语句组,括起来的语句组,它的作用与类的构造方法有些相似,都是用来它的作用与类的构造方法有些相似,都是用来初始化工作的。初始化工作的。静态初始化器与构造方法区别:静态初始化器与构造方法区别:构造方法是对每个新创建的对象初始化,而构造方法是对每个新创建的对象初始化,而静态初始化器对整个类自身进行初始化,包静态初始化器对整个类自身进行初始化,包括括staticstatic成员变量赋初值。成员变量赋初值。构造方法是在用构造方法是在用newnew创建新对象时由系统自动创建新对象时由系统自动执行,而静态初始化器一般不能由程序来调执行,而静态初始化器一般不能由程序来调用,它是在所属的类被加载入内存时由系统用,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 内燃机车钳工风险评估与管理竞赛考核试卷含答案
- 草地监测员安全宣教能力考核试卷含答案
- 合成气装置操作工岗前安全生产知识考核试卷含答案
- 淀粉及淀粉糖制造工复测评优考核试卷含答案
- 氯氢处理工安全行为评优考核试卷含答案
- 医疗器械购销员岗中新技术考核试卷含答案
- 氯丁橡胶装置操作工达标知识考核试卷含答案
- 粉末冶金模具工岗前岗位实操考核试卷含答案
- 输蔗破碎工岗位安全宣贯考核试卷含答案
- 煤层气固井工岗中诚信道德考核试卷含答案
- 2026年企业文化企业建设知识竞赛-中国电信知识竞赛历年参考题库含答案解析
- 2026高考议论文范文19篇(完整版含真题立意+考场高分作文)
- ESG管理制度手册
- 2026苏教版二上数学第二单元第5课时《用1~6的乘法口诀求商》课件
- 2026-2027学年苏教版(新教材)小学科学五年级上册(全册)知识点清单
- 2026年湖南省中考历史试卷(含答案)
- 校园小导游、小讲堂(课件)-2025-2026学年人教版二年级上册数学
- 《演唱 郊游》课件2025-2026学年冀少版三年级下册音乐
- 矿山全员责任制考核制度
- 2026年乡村医生真题【历年真题】附答案详解
- 2026年C1驾照三力测试模拟题库
评论
0/150
提交评论