第3章 类与对象2(对象与重载)_第1页
第3章 类与对象2(对象与重载)_第2页
第3章 类与对象2(对象与重载)_第3页
第3章 类与对象2(对象与重载)_第4页
第3章 类与对象2(对象与重载)_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1深入理解访问权限修饰符深入理解访问权限修饰符 类创建了一个对象之后,该对象可以通过“.”运算符操作自己的变量、使用类中的方法,但对象操作自己的变量和使用类中的方法是有一定限制的。 所谓访问权限是指对象是否可以通过“.”运算符操作自己的变量或使用类中的方法。 访问限制修饰符有private、友好(缺省)、protected和public,用来修饰成员变量或成员方法(或类)。 2(1 1)私有变量和私有方法)私有变量和私有方法 一个类在另外一个类中创建一个对象后,该对象不能访问自己的私有变量和私有方法 。 对于一个类的私有类变量(静态成员变量),在另外一个类中,也不能通过类名来操作这个私有类变量

2、。 只有在本类中创建该类的对象时,这个对象才能访问自己的的私有变量和私有方法 。3=class Tom private float weight; private f() class Jerry void g() Tom cat = new Tom(); cat.weight = 23f;/? cat.f();/? class Tom private float weight; private f() void g() Tom cat = new Tom(); cat.weight = 23f;/? cat.f();/? 4(2 2)友好变量和友好方法)友好变量和友好方法 不用private、

3、public 、protected修饰符的成员变量和方法被称为友好变量和友好方法。 一个类在另外一个类中创建一个对象后,如果两个类在同一包中,该对象能访问自己的友好变量和友好方法 对于一个类的友好类变量(静态成员变量),如果两个类在同一包中,那么在另外一个类中,也能通过类名来操作这个友好类变量。5(3 3)受保护的成员变量和方法)受保护的成员变量和方法 一个类在另外一个类中创建一个对象后,如果两个类在同一包中,该对象能访问自己的protected变量和protected方法 对于一个类的protected类变量(静态成员变量),如果两个类在同一包中,那么在另外一个类中,也能通过类名来操作这个p

4、rotected类变量。 在后面学习类的继承时,将讲述protected和“友好”之间在继承方面的区别。(子类可以使用父类) 6(4 4)公有变量和公有方法)公有变量和公有方法 一个类在另外一个类中创建一个对象后,该对象能访问自己的public变量和public方法。 对于一个类的public类变量(静态成员变量),那么在另外一个类中,也能通过类名来操作这个public类变量。7访问指示访问指示同一同一类中类中同一同一包包其他包其他包publicprotecteddefaultprivate访问控制权限表访问控制权限表 l 类的访问控制权限只有类的访问控制权限只有public和友好和友好(de

5、fault)两种;两种;l 变量和方法的访问控制可以为上面四种的任何一种。变量和方法的访问控制可以为上面四种的任何一种。访问指示访问指示同一同一类中类中同一同一包包子类中子类中其他包其他包publicprotecteddefaultprivate访问控制权限表访问控制权限表 8几种访问控制使用的时机几种访问控制使用的时机 public protected (default) private只有公用程序中的某些方法,才会用到只有公用程序中的某些方法,才会用到public修饰符;修饰符;属性属性通通常使用常使用private而不用而不用public; 某个成员对于大部分程序来说不太会使用到,但是对

6、于别的某个成员对于大部分程序来说不太会使用到,但是对于别的包中包中继承的子类继承的子类会使用到,则使用会使用到,则使用protected修饰符;修饰符; 对于自己类内部所使用的方法或属性,则使用对于自己类内部所使用的方法或属性,则使用private修饰符修饰符来隐藏它们;来隐藏它们; 如果只想让如果只想让同同包中的类所使用的方法或属性,则使用友好包中的类所使用的方法或属性,则使用友好(default)修饰符;修饰符;(1) 如果不确定该使用何种修饰符,则设定为如果不确定该使用何种修饰符,则设定为default。9关于关于Java应用程序的应用程序的main方法的进一步讨论方法的进一步讨论 pu

7、blic static void main() 1) 虚拟机规范并没有要求一定是虚拟机规范并没有要求一定是public的。的。public只是保证只是保证main方法可以从任意一个方法可以从任意一个Java运行环境运行环境中来调用他。中来调用他。2) 无无public修饰的修饰的mian方法在编译时能通过,但是方法在编译时能通过,但是Java虚拟机虚拟机无法启动无法启动该应用程序。该应用程序。103) 虚拟机调用虚拟机调用main方法时方法时不需要产生任何对象不需要产生任何对象,所以声明为所以声明为static。4) 虚拟机只是负责启动虚拟机只是负责启动Java应用程序,他应用程序,他无需无需

8、从从Java应用程序的应用程序的mian方法中获取任何东西,所以方法中获取任何东西,所以main方法都声明为方法都声明为void。11Q1: C+中成员的缺省访问控制修饰符中成员的缺省访问控制修饰符 ? privateQ2: 实际使用中,实际使用中,final往往与往往与static结合在结合在一起使用一起使用?例如例如: static final int LOOP=10; (LOOP拥有一块无法改变的存储空间拥有一块无法改变的存储空间)12n 3.2 对象 在在Java语言中,对象也被称为类的语言中,对象也被称为类的实例实例,是类的,是类的 一次实例化的结果。一次实例化的结果。 任何一个对象

9、都要经历创建、使用和清除任何一个对象都要经历创建、使用和清除3个阶段。个阶段。13(1 1)创建对象)创建对象创建对象通过运算符创建对象通过运算符new和类的和类的构造方法构造方法来进行。来进行。创建一个对象包括对象的创建一个对象包括对象的声明声明、实例化实例化和和初始化初始化三三个过程。个过程。 声明对象声明对象语法格式:语法格式: 类名类名 对象名;对象名;如:如:String str;14n对象实例化对象实例化 对象实例化的格式为: 对象名=new 构造方法(参数列表); 如: String str = new String(); 对象实例化就是用关键字new为对象分配内存空间,创建对象

10、,并返回对象引用。15对象的引用对象的引用所指向的是一个存放在所指向的是一个存放在栈栈中的数据中的数据结构,他存储着有关对象的信息以及对象在结构,他存储着有关对象的信息以及对象在堆堆中的首地址。中的首地址。栈栈(Stack)是一块是一块连续存储区域连续存储区域,具有先进先,具有先进先出的特性。速度比较快。出的特性。速度比较快。堆堆(Heap)是运行时是运行时动态分配动态分配内存且分配空间内存且分配空间不保不保证是连续的证是连续的,堆的存取速度较慢。,堆的存取速度较慢。16 在在Java中,基本数据类型、常量中,基本数据类型、常量、局部变量、局部变量、对象名及对象的引用都存在于对象名及对象的引用

11、都存在于栈栈内内. 所有的对象和数组都存在于所有的对象和数组都存在于堆堆中。中。C/C+对象主要位于栈内,只有对象主要位于栈内,只有new 对象在堆中。对象在堆中。17例:定义类如下例:定义类如下class TwoPointObject int type = 1,startX,startY,endX,endY; TwoPointObject(int objectType,int x1, int y1,int x2,int y2) type = objectType; startX = x1; startY = y1; endX = x2; endY = y2; 18实例化对象实例化对象twoP

12、ointObjectOne:twoPointObjectOne = new TwoPointObject();上述语句的执行过程如下:上述语句的执行过程如下: 为对象为对象twoPointObjectOne在堆内分配空间,并在堆内分配空间,并 用默认值对该对象的非静态变量进行初始化。用默认值对该对象的非静态变量进行初始化。(2) 执行类体中的初始化语句。比如:执行类体中的初始化语句。比如:int type = 1; 执行第执行第1步后步后type =0,执行第,执行第2步后步后type=1。(3) 执行构造方法。执行构造方法。(4) 返回新创建对象的引用。返回新创建对象的引用。 19理解对象的

13、内存模型理解对象的内存模型 class XiyoujiRenwu float height, weight; String head, ear,hand,foot, mouth; void speak(String s) System.out.println(s); 20class A public static void main(String args) XiyoujiRenwu zhubajie; /声明对象声明对象 zhubajie=new XiyoujiRenwu(); /为对象分配为对象分配 /内存,使用内存,使用new 运算符和默认的构造方法运算符和默认的构造方法 21 声明对象

14、声明对象时的内存模型时的内存模型 当用当用XiyoujiRenwu类类声明声明一个变量,即对象一个变量,即对象zhubajie时,如例子中时,如例子中的对象的对象zhubajie:XiyoujiRenwu zhubajie; 内存模型如右图所示:内存模型如右图所示: 22对象对象分配内存分配内存后的内存模型后的内存模型 当系统见到:当系统见到: zhubajie=new XiyoujiRenwu(); 时,就会做三件事:时,就会做三件事: 为为height,weight,head,ear,mouth,hand,foot各个变各个变量分配内存。量分配内存。 23 执行构造方法中的语执行构造方法中

15、的语句。句。 返回一个返回一个引用引用给对象给对象变量变量zhubajie。XiyoujiRenwu sunwukong = new XiyoujiRenwu();/?sunwukong = zhubajie;/?24小结:小结:在创建每个新的类对象时,构造方法自动执行。它在创建每个新的类对象时,构造方法自动执行。它主要用于对象初始化。主要用于对象初始化。new可以为一个类实例化多个不同的对象。这些对可以为一个类实例化多个不同的对象。这些对象分别占用不同的内存空间,因此改变其中一个对象分别占用不同的内存空间,因此改变其中一个对象的状态不会影响其他对象的状态。象的状态不会影响其他对象的状态。25

16、n 对象初始化对象初始化对象是类的实例,对象是类的实例,Java总是试图创建一个总是试图创建一个确定状确定状态态的对象。的对象。如果没有为类中的某些值赋初始值,如果没有为类中的某些值赋初始值,Java会为类会为类的成员赋予默认值。的成员赋予默认值。 26对象初始化过程如下:对象初始化过程如下:(1)装载类)装载类.class时,对时,对静态变量静态变量进行初始化。且只进行初始化。且只初始化初始化1次。当产生新对象时,他并不会重新被初始次。当产生新对象时,他并不会重新被初始化,但其值是可以改变的。化,但其值是可以改变的。(2)执行)执行静态代码块中静态代码块中的初始化代码。如存在多个的初始化代码

17、。如存在多个静态代码块,则按照他们出现的先后次序依次执行。静态代码块,则按照他们出现的先后次序依次执行。(3)当利用关键字)当利用关键字new产生新对象时,对产生新对象时,对实例变量实例变量进行初始化。进行初始化。(4)执行构造方法中的)执行构造方法中的初始化代码初始化代码,产生对象。,产生对象。27 一个对象可以有许多属性和多个方法 对象的使用是通过引用对象变量或调用对象的方法来实现的。 与C+相类似,对象变量和方法均是通过运算符“.”来实现的。(2 2)使用对象)使用对象28 访问对象变量访问对象变量 格式格式: 对象名对象名. 变量名变量名 例:例: class example int

18、x; example a = new example(); a.x=100; 注意注意: 对象变量的引用在对象变量的引用在Java中还有一种特殊的情中还有一种特殊的情况,即可以况,即可以使用表达式指定对象变量所在的对象使用表达式指定对象变量所在的对象。29例例: public class A: public class A int a=20;int a=20; public static void main(String args) public static void main(String args) int y=new A().a;int y=new A().a; System.out.

19、println(y=+y); System.out.println(y=+y); 注意注意: :在这条语句被执行后,不再保留对象在这条语句被执行后,不再保留对象A A的引用。的引用。30访问类变量(两种方法):访问类变量(两种方法): (1) 类名类名.类变量名(类变量名(建议建议) (2) 对象名对象名.类变量名类变量名311 1 class MyClass class MyClass 2 2public int a1;public int a1;3 3 public static int a2;public static int a2;4 4 5 MyClass A=new MyClass

20、();5 MyClass A=new MyClass();6 MyClass B=new MyClass();6 MyClass B=new MyClass();7 A.a1=100; A.a2=200;7 A.a1=100; A.a2=200;8 System.out.println(A.a2= +A.a2);8 System.out.println(A.a2= +A.a2);9 System.out.println(9 System.out.println(“B.a2= +B.a2);B.a2= +B.a2); A.a2=200;B.a2=200;NY10 MyClass.a1=100;

21、(?)10 MyClass.a1=100; (?)11 MyClass.a2=100; (?)11 MyClass.a2=100; (?)32 访问对象方法:访问对象方法: 对象名对象名.方法名方法名 (参数列表参数列表);例例: class Circle double r; void set(double raduis)r=raduis; Circle c=new Circle(); c.set(5.0);33访问类方法(两种方法):访问类方法(两种方法): (1) 类名类名.类方法名(类方法名(参数列表参数列表)()(建议建议) (2) 对象名对象名.类方法名(类方法名(参数列表参数列表)

22、34(3 3)对象比较)对象比较对象比较有两种含义。一种是对象比较有两种含义。一种是对象引用对象引用之间的比之间的比较,另一种是较,另一种是对象内容对象内容之间的比较。之间的比较。判断两个判断两个对象引用对象引用是否相等的运算符是是否相等的运算符是“= =”和和“!=”。对象引用相等的含义是指两个对象指向栈内的同对象引用相等的含义是指两个对象指向栈内的同一内存空间,即他们具有共同的对象变量。一内存空间,即他们具有共同的对象变量。对象之间的赋值是对象引用的赋值。对象之间的赋值是对象引用的赋值。35对象内容相等对象内容相等是指两个同类对象在堆内的所有对象是指两个同类对象在堆内的所有对象变量变量的值

23、都一一对应相等。的值都一一对应相等。判断两个对象内容是否相等的方法是调用对象的判断两个对象内容是否相等的方法是调用对象的equals方法方法来实现。来实现。系统系统默认默认实现的实现的equals方法使用的运算符是方法使用的运算符是“=”如果要对自己所写类的不同对象的内容进行是否相如果要对自己所写类的不同对象的内容进行是否相等的比较,必须为自己的类创建一个等的比较,必须为自己的类创建一个equals方法。方法。36newnew类类 A A实例实例a1内存内存实例实例a2对象对象信息信息对象对象信息信息 类类 信息信息Q3:a1 = a2; if (a1.equals(a2) if (a1 =

24、= a2) Q1: if(a1.equals(a2)newnewQ2:if(a1 = = a2)(1)(3)(4)(2)例例371 public class Test 2 int x,y; 3 public static void main(String args)4Test test1 = new Test();5test1.x =1;6test1.y =1;7Test test2 = new Test();8test2.x =1;9test2.y =1;10if (test1.equals(test2)11System.out.println(true);12 else13System.o

25、ut.println(false); /无无equals方法,则输出结果为方法,则输出结果为false public boolean equals(Test t )16 return ( this.x = t.x ) & (this. y = t.y );17 18 38n 3.3 参数传递(值、引用)(1 1)值传递)值传递值传递值传递就是方法的形参申请自己的存储空间,运行就是方法的形参申请自己的存储空间,运行时把调用方法的实参值时把调用方法的实参值复制复制给形参的方式。给形参的方式。方法中形参的改变方法中形参的改变不会影响不会影响到实参。到实参。当方法的参数是当方法的参数是基本数据

26、类型基本数据类型时,方法之间时,方法之间按值传按值传递递。391 public class Test 2 public static void main(String args) 3 int n = 3;4 System.out.println(Before change, n = + n);5changeData(n);6System.out.println(After change, n = + n); private static void changeData(int n) 9n = 10;10 11 Before change, n = 3After change, n = 340(

27、2 2)引用传递)引用传递引用传递引用传递是指方法的形参不申请自己的存储空间,让方法的是指方法的形参不申请自己的存储空间,让方法的形参与实参形参与实参共享同一存储地址共享同一存储地址的方式。的方式。在在Java中,引用传递也是把实参值复制给形参,只是复制中,引用传递也是把实参值复制给形参,只是复制的值是实参在栈空间中存放的的值是实参在栈空间中存放的对象引用对象引用,即实参与形参将共,即实参与形参将共用同一个堆空间(对象的存放空间)。用同一个堆空间(对象的存放空间)。如果方法中仅改变堆空间中的内容,则实参会同步改动。如果方法中仅改变堆空间中的内容,则实参会同步改动。如果方法体内如果方法体内修改了

28、修改了形参所引用的对象(形参所引用的对象(指向了新的引用指向了新的引用),),则对他所做的任何操作都不会影响到被传入的引用本身。则对他所做的任何操作都不会影响到被传入的引用本身。41public class Test public static void main(String args) 3 MyObject sb = new MyObject(“Hello”);4 System.out.println(“Before change, sb = ” + );5 changeData(sb);6 System.out.println(“After change, sb = ” +

29、 ); 7 8 public static void changeData(MyObject myObject) 9 /myObject = new MyObject(“changeData”);/指向了新的引用指向了新的引用10 myO = World!; 11 12 13 class MyObject14 String name = “Unnamed”;15 MyObject(String myObjectname)16 name = myObjectname; 17 18 Before change, sb = HelloAfter change, sb

30、 = World!Before change, sb = HelloAfter change, sb = Hello42n 3.4 this关键字this引用表示当前正在运行的引用表示当前正在运行的对象对象。this引用只与特定的对象关联,而引用只与特定的对象关联,而不与类关联不与类关联。this引用只能在类的非静态方法中使用,引用只能在类的非静态方法中使用,静态静态方法方法和静态代码块中和静态代码块中绝对不能绝对不能出现出现this引用。引用。主要有以下四方面的作用:主要有以下四方面的作用:43(1)访问当前对象)访问当前对象 this是系统自动产生的、是系统自动产生的、隐含于隐含于每一个类

31、的非静每一个类的非静态方法中的特殊引用。态方法中的特殊引用。他指向的是正在被某个方法操作的当前对象,即他指向的是正在被某个方法操作的当前对象,即指向调用该方法的当前对象指向调用该方法的当前对象。可以用可以用this访问访问当前对象当前对象的成员变量或方法的成员变量或方法44class Test static int s; int x,y; void f1() static void f2()Test A , B;this指针示意图指针示意图动态存储区动态存储区对象对象B动态存储区动态存储区对象对象A静态存储区静态存储区类类Test共享共享共享共享B.xB.yA.xA.ysf1()f2()thi

32、s45this指针示意图指针示意图动态存储区动态存储区对象对象B动态存储区动态存储区对象对象A静态存储区静态存储区类类Test共享共享共享共享B.xB.yA.xA.ysf1()f2()thisQ1:执行A.f1();this指针指向?461 public class Test 2int i= 1; 3public static void main(String args) Test test= new Test(); test.increment().print();67 8Test increment() 9i+; 10return this;1112void print()13System

33、.out.println(i= +i);1415 i= 2test = test.increment(); test.print();47(2)访问同名的成员变量)访问同名的成员变量 如果方法体内定义的局部变量和对象成员变量名字相同,或方法的形参和对象的成员变量名字相同时,如何将两者区分开? Java中,局部变量及方法的参数可以和成员变量名字相同。 访问同名的成员变量的格式为: this.成员变量名48获取当前对象的变量获取当前对象的变量public class Test int i=1; public static void main(String args) Test x= new Tes

34、t(); x.thisDemo(3); void thisDemo(int i) System.out.println(i); System.out.println(this.i); this.i = i; System.out.println(this.i); 结果结果: 3 1 3Q:可否可否? void thisDemo(int i) int i; (N)49(3)访问构造方法)访问构造方法在构造方法内,使用this(参数),调用该类内符合该参数列的某个构造方法。this应是该构造方法内第一个可执行语句。50public class Flower int petalCount=0; St

35、ring s=new String(“null”); Flower(int petals) petalCount=petals; Flower(String s, int petals) this(petals); this.s= s; 51(4)方法形参)方法形参(较难较难)1 public class Test 2 public static void main(Stringargs) 3new Test();4 5 public Test() new MyObject(this).print();6 public void print() System.out.println(Hello

36、 from A!);7 8 class MyObject9Test test;10public MyObject(Test test) this.test = test;11public void print() 12 System.out.println(Hello from B!); /1 test.print(); /2 15 结果结果: Hello from B!Hello from A!52n 小结小结: 静态方法中不能使用静态方法中不能使用this 使用使用this简化构造方法的编写简化构造方法的编写 使用使用this区别成员变量和局部变量区别成员变量和局部变量 this指代对象实

37、例自身指代对象实例自身 当不能事先知道实例名时使用当不能事先知道实例名时使用this代替代替53小提示:小提示: 构造方法是特殊的方法,不能用static修饰构造方法。 (为什么?)54n 3.5 方法重载在在Java中,每个方法都有一个签名。中,每个方法都有一个签名。签名签名是由方法名及其参数的类型、数量或不同类是由方法名及其参数的类型、数量或不同类型参数出现的顺序组成。型参数出现的顺序组成。在同一个类中,可以声明若干个具有相同的方法在同一个类中,可以声明若干个具有相同的方法名,但名,但参数的类型、数量或不同类型参数出现的参数的类型、数量或不同类型参数出现的顺序不完全相同顺序不完全相同的方法

38、。的方法。重载(重载(overloading)55方法重载是实现多态性的一种方式。方法重载是实现多态性的一种方式。多态性可以用多态性可以用“一个对外接口,多个内在一个对外接口,多个内在实现方法实现方法”表示。表示。重载的方法通常会具有不同的方法体。重载的方法通常会具有不同的方法体。56Q:能编译通过吗能编译通过吗? class a void f() int f() f(); / (N)57class Testclass Test Test Test buildRect(int x1, int y1, int x2, int y2) buildRect(int x1, int y1, int x

39、2, int y2) Test Test buildRect(Point topLeft, Point bottomRight) buildRect(Point topLeft, Point bottomRight) public static void main(String args)public static void main(String args) Test rect=new Test(); Test rect=new Test(); rect.buildRect(25,25,50,50); rect.buildRect(25,25,50,50); rect.buildRect(new Point(10,10),new Point(20,20); rect.buildRect(new Point(10,10),new Point(20,20); 58当重载方法仅是所接受的当重载方法仅是所接受的同类型同类型的参数的参数个数个数不同不同时,可以用时,可以用可变参数可变参数。可变参数可变参数是指同一方法可以接收多个同一类型的是指同一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论