资源预览内容
第1页 / 共30页
第2页 / 共30页
第3页 / 共30页
第4页 / 共30页
第5页 / 共30页
第6页 / 共30页
第7页 / 共30页
第8页 / 共30页
第9页 / 共30页
第10页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第 五五 章章2024/8/11进一步讨论对象和类进一步讨论对象和类第五章第五章 进一步讨论对象和类进一步讨论对象和类5.1 Java中方法及类的访问规则中方法及类的访问规则5.2 Java中的按值传送中的按值传送5.3 Java中的抽象类、接口和程序包中的抽象类、接口和程序包5.4 对象的构造函数对象的构造函数5.5 内部类内部类25.1 Java中方法及类的访问规则中方法及类的访问规则public class AccessInClass1 int sex; void m1() sex=1; int m2() sex=2; return sex; void m3() m1(); m2(); 前提:若某个方法可直接访问其它成员,该方前提:若某个方法可直接访问其它成员,该方法不能是静态的,即方法前面不能有法不能是静态的,即方法前面不能有static关键关键字。字。35.1 Java中方法及类的访问规则中方法及类的访问规则public class AccessInClass2 int sex; static int salary; void m1() sex=1; salary=1; int m2() sex=2; salary=2; return sex; void m3() m1(); m2(); m4(); m5(); static void m4() static void m5() AccessInClass2 aic=new AccessInClass2(); aic.m1(); aic.m2(); aic.m3(); aic.m4(); m4(); /m1(); /error /m2();/error /m3();/error aic.sex=3; aic.salary=3; alary=3;/sex=3;error 注意:非静态方法注意:非静态方法访问静态或非静态访问静态或非静态成员方式一样,可成员方式一样,可直接访问。静态直接访问。静态方方法访问非静态成员法访问非静态成员必须创建对象。必须创建对象。静态静态方法可不创建方法可不创建对象,直接访问静对象,直接访问静态态成员和静态方法,成员和静态方法,也可创建对象来访也可创建对象来访问。问。45.1 Java中方法及类的访问规则中方法及类的访问规则public class AccessOtherClass1 void m1() OtherClass1 oc1=new OtherClass1(); oc1.sex=1; System.out.println(“sex=”+ oc1.sex); public static void main(String args) OtherClass1 oc2= new OtherClass1(); oc2.sex=0; System.out.println(“sex= ”+oc2.sex); oc2.m2(); class OtherClass1 int sex; void m2() System.out.println(“m2()”); 注意:文件中包含注意:文件中包含两两个或以上类个或以上类,那,那只能有一个类前加只能有一个类前加public关键字,且关键字,且文件名必须与这个文件名必须与这个类名一致。类名一致。AccessOtherClass1访问访问OtherClass1, 无论何情况下,都无论何情况下,都需创建该类对象才需创建该类对象才可以访问它的成员可以访问它的成员(域或方法)。(域或方法)。若两个类名前都没若两个类名前都没有有public,可以以可以以任何任何名字把文件存名字把文件存盘。盘。55.2 Java中的按值传送中的按值传送 当当“按值按值”传送自变量时,方法调用不会改传送自变量时,方法调用不会改变自变量的值。变自变量的值。 当当对象实例作为自变量传送给方法时,自变对象实例作为自变量传送给方法时,自变量的值是对象的引用可修改该引用指向的对量的值是对象的引用可修改该引用指向的对象内容。象内容。 (P93)6public void changeStr(String value) System.out.println(before value is: +value); value = new String(different); System.out.println(after value is: +value);public void changeObjValue(PassTest ref) System.out.println(before ref.ptValue is: +ref.ptValue); ref = new PassTest(); ref.ptValue = 99f; System.out.println(after ref.ptValue is: + ref.ptValue);75.3 Java中的抽象类、接口和程序包中的抽象类、接口和程序包抽象类是指不能直接被实例化抽象类是指不能直接被实例化的类。的类。 一般一般作为其它类的作为其它类的超类,与超类,与final类正好相反。类正好相反。抽象类中抽象类中的抽象方法的抽象方法在该类中定义但不在该类在该类中定义但不在该类中中提供实现,由提供实现,由继承类提供继承类提供细节。细节。 public abstract class SomeAbstractClass void method1() System.out.println(“Hi, Java”); abstract void method2(); public abstract class SomeAbstractClass1 abstract void method1(); abstract void method2(); 85.3 Java中的抽象类、接口和程序包中的抽象类、接口和程序包抽象类的定义格式为:抽象类的定义格式为: public abstract class 类名类名 .抽象类方法的定义格式为:抽象类方法的定义格式为: public abstract (参数表参数表);抽象类不能创建实例,由非抽象类的子类创建抽象类不能创建实例,由非抽象类的子类创建定义抽象方法的类必须是抽象类。定义抽象方法的类必须是抽象类。对于抽象方法不允许使用对于抽象方法不允许使用final修饰修饰abstract方法方法95.3 Java中的抽象类、接口和程序包中的抽象类、接口和程序包 /两两个类个类Circle和和Rectangle, ,完成相关参数的计算完成相关参数的计算 class Circle public int r; Circle(int r) this.r=r /this指指这个对象的这个对象的 public int area() return 3*r*r; /取近似取近似 class Rectangle public int width,height; /这里不需这里不需this Rectangle (int w, int h) width=w,height=h; public int area() return width*height; 105.3 Java中的抽象类、接口和程序包中的抽象类、接口和程序包 假设假设有若干个有若干个Circle,以及若干个以及若干个Rectangle,希望计算它们的总面积希望计算它们的总面积,直截了当的做法是将直截了当的做法是将它们分别放到两个数组中它们分别放到两个数组中,用两个循环用两个循环,加上一加上一个加法个加法,这种做法是不漂亮的。这种做法是不漂亮的。 如果如果还有其它形状还有其它形状,如如triangle,ellipses等等,上上述方法显得述方法显得“累赘累赘”,我们希望有一种统一的我们希望有一种统一的表示表示,例如用一个数组例如用一个数组shape,接受接受所有的形所有的形状状,然后用然后用 for (i=0; ishape.length; i+) area_total += shapei.area(); 11 abstract class Shape abstract float area(); class Circle extends Shape public int r; Circle(int r) this.r=r; public float area() return 3.14*r*r; class Square extends Shape public int width,height; Rectangle (int w, int h) width=w,height=h; public float area() return width*height; 125.3 Java中的抽象类、接口和程序包中的抽象类、接口和程序包利用接口可实现多重利用接口可实现多重 继承继承(子类可子类可同时实现同时实现多个接口)。多个接口)。接口的作用和抽象类接口的作用和抽象类 类似类似, ,指定原型指定原型,不直不直 接定义方法的内容。接定义方法的内容。关键字关键字implement用用 来实现方法来实现方法,即在使用即在使用时要用给出方法的实际时要用给出方法的实际内容。内容。接口中的方法和变量接口中的方法和变量 是是public的。的。interface Stack void push(object x); object pop();class A extends Applet implements Stack void push(object x) ;/具体内容具体内容 object pop() ;/具体内容具体内容 135.3 Java中的抽象类、接口和程序包中的抽象类、接口和程序包接口的声明格式为:接口的声明格式为: 接口修饰符接口修饰符 interface 接口名称接口名称 extends父类父类名名 .接口中定义的成员变量都必须赋初值,系统默接口中定义的成员变量都必须赋初值,系统默认为终极类变量,即自动增加认为终极类变量,即自动增加final与与static关键关键字。字。接口与类的继承不同之处在于实现接口的类不接口与类的继承不同之处在于实现接口的类不从该接口的定义中继承任何行为,在实现过程从该接口的定义中继承任何行为,在实现过程中,这个类还可同时实现其它接口。中,这个类还可同时实现其它接口。完成接口的类须实现接口中的所有抽象方法。完成接口的类须实现接口中的所有抽象方法。 145.3 Java中的抽象类、接口和程序包中的抽象类、接口和程序包 程序包程序包:相当于其它语言中的库函数。:相当于其它语言中的库函数。 打包打包package graphics;class Square ;class Circle ;class Triangle ; 使用使用程序包中的类要用程序包中的类要用import命命 令令。表示路径表示路径, ,*表示使用包表示使用包中的中的 所有所有类。类。 import java.io.FileInputStream; import java.io.*;iojavaFileInputStream155.4 对象的构造函数对象的构造函数class Demo1 /数组的配置数组的配置 public static void main(String args) int array; array=new int55; array14=5; class MyClass /对象实体的产生对象实体的产生 int data=5;class Demo2 public static void main(String args) MyClass obj;/建立一个引用建立一个引用 obj=new MyClass(); System.out.println(obj.data); 165.4 对象的构造函数对象的构造函数constructor( (构造函数构造函数),),在一个类中和类同名的在一个类中和类同名的方法叫构造函数。系统在产生对象时会自动执方法叫构造函数。系统在产生对象时会自动执行。行。class Point int x,y; Point() x =0;y=0; Point(int new_x,int new_y) x=new_x;y=new_y; class UsePoint Point point_A=new Point(); Point point_B=new Point(5,7);175.4 对象的构造函数对象的构造函数 构造函数应包含哪些内容构造函数应包含哪些内容? 构造函数多半定义一些初值或内存配置工作构造函数多半定义一些初值或内存配置工作,一个类可以有多个构造函数一个类可以有多个构造函数(重载重载),根据参数的根据参数的不同决定执行哪一个不同决定执行哪一个。 如果程序中没有定义构造函数如果程序中没有定义构造函数,则创造实例时则创造实例时使用的是缺省函数使用的是缺省函数,它是一个无内容的空函数它是一个无内容的空函数。 若类为若类为public,但是构造方法为,但是构造方法为private,那么,那么在其它类中也不能创建该类的对象。即若不想让在其它类中也不能创建该类的对象。即若不想让别人访问一个类,可用别人访问一个类,可用private修饰它的构造方法修饰它的构造方法185.4 对象的构造函数对象的构造函数thisthis是是Java中的一个关键字,指中的一个关键字,指自己自己这个对象。这个对象。this的作用是要将自己这个对象的作用是要将自己这个对象当作参数,传送当作参数,传送给给别的对象中的方法别的对象中的方法。class ThisClass public static void main() Bank bank=new Bank(); bank.someMethod(this); class Circle int r; Circle(int r) this.r=r; public area() return r*r*3;195.4 对象的构造函数对象的构造函数supersuper指这个对象的父类指这个对象的父类super用来引用父类中的方法及变量数据用来引用父类中的方法及变量数据. public class Apple extends Fruits public Apple(int price) super(price); 以上句子表示使用超类的构造函数生成实例以上句子表示使用超类的构造函数生成实例super必须是子类构造函数的第一条语句必须是子类构造函数的第一条语句205.4 对象的构造函数对象的构造函数使用使用super调用父类的构造方法调用父类的构造方法class Student int number; String name; Student() Student(int number, String name) this.number = number; this.name = name; System.out.println(“I am”+name+ “my number is ” + number); class UStudent extends Student boolean 婚否;婚否; UStudent(int number, String name, boolean b) super (number, name); 婚否婚否=b; System.out.println(“婚否婚否=” +婚否婚否); public class Example public static void main(String args) UStudent zhang = new UStudent(9801, “张红张红”,false); I am 张红张红 my number is 9801婚否婚否= false215.4 对象的构造函数对象的构造函数使用使用super操作被隐藏的成员变量和方法操作被隐藏的成员变量和方法class Sum int n; float f() float sum = 0; for(int i=1;i=n; i+) sum = sum + i ; return sum; class Average extends Sum int n; float f() float c; super.n=n; c=super.f(); return c/n; float g() float c; c=super.f(); return c/2;225.4 对象的构造函数对象的构造函数超类与子类可以有一模一样的静态方法超类与子类可以有一模一样的静态方法。但静。但静态方法不能被覆盖态方法不能被覆盖(重置),(重置),只能被隐藏,且只能被隐藏,且子类与父类中的方法须同时为子类与父类中的方法须同时为static或同时不或同时不是是static。class A static void m() System.out.println(“static method in superClass”); public class VerriddenStatic1 extends A static void m() System.out.println(“static method in subClass”); public static void main(String args) A obj= new VerriddenStatic1(); obj.m(); 结果结果:static method in superClass235.4 对象的构造函数对象的构造函数 静态静态块是在类被调到内存后就开始执行的块是在类被调到内存后就开始执行的, ,一一般用于初始化类中的静态成员。它和创建对象般用于初始化类中的静态成员。它和创建对象或者或者main方法没有关系。方法没有关系。public class StaticBlock1 static System.out.println(“static block”); public static void main(String args) 运行后结果:运行后结果:Static block245.4 对象的构造函数对象的构造函数n在创建对象时,对象所在类的所有数据成员会在创建对象时,对象所在类的所有数据成员会首先进行初始化。首先进行初始化。class Children Children(int marker) System.out.println(“Children(”+marker+ “)”); class Parent Children child1=new Children(1); Parent() System.out.println(“Parent()”); Children child3=new Children(33); Children child2 = new Children(2); void relation() System.out.println(“relation()”); Children child3=new Children(3);public class ObjectInit public static void main(String args) System.out.println(“main begins”); Parent mother=new Parent(); mother.relation(); main beginChildren(1)Children(2)Children(3)Parent()Children(33)relation()255.4 对象的构造函数对象的构造函数n在创建对象时,对象所在类的所有数据成员会在创建对象时,对象所在类的所有数据成员会首先进行初始化。首先进行初始化。class Children Children(int marker) System.out.println(“Children(”+marker+ “)”); class Parent Children child1=new Children(1); Parent()System.out.println(“Parent()”); Children child3=new Children(33); Children child2 = new Children(2); void relation() System.out.println(“relation()”); static Children child3=new Children(3);public class ObjectInit public static void main(String args) System.out.println(“main begins”); Parent mother=new Parent(); mother.relation(); main beginChildren(3)Children(1)Children(2)Parent()Children(33)relation()265.4 对象的构造函数对象的构造函数创建对象时,对象所在类的所有数据成员首先创建对象时,对象所在类的所有数据成员首先进行初始化。构造方法的作用就是初始化进行初始化。构造方法的作用就是初始化静态对象在非静态对象前初始化,但静态对象静态对象在非静态对象前初始化,但静态对象只初始化一次。只初始化一次。1、当类调入到内存时,类中的静态成员开始初、当类调入到内存时,类中的静态成员开始初始化。始化。2、超类的构造方法按照从最高到最低的顺序调、超类的构造方法按照从最高到最低的顺序调用。用。3、类中的非静态对象初始化。、类中的非静态对象初始化。4、调用类的构造方法。、调用类的构造方法。初始化的顺序包括构造方法调用的顺序如下:初始化的顺序包括构造方法调用的顺序如下:275.5 内部类内部类public class Outer1 private int size; public class Inner public int m1(int newSize) size=newSize; return size; /*public static int m2() size = 2; return size;*/ public void accessInner(int newSize) Inner inner=new Inner(); System.out.println(“Inner.m1()=”+inner.m1(5); public static void main(String args) Outer1 outer=new Outer1(); outer.accessInner(1); Outer1.Inner inner=outer.new Inner(); inner.m1(2); 非静态非静态内部类内部类1、在内部类中的方法可、在内部类中的方法可以直接访问外部类的成员,以直接访问外部类的成员,不需要创建外部类的对象。不需要创建外部类的对象。2、外部类的非静态方法,、外部类的非静态方法,若要访问内部成员,须创若要访问内部成员,须创建内部类的对象。建内部类的对象。3、外部类的静态方法若、外部类的静态方法若要访问内部类成员,须先要访问内部类成员,须先创建外部类对象,再创建创建外部类对象,再创建内部类对象,最后才可访内部类对象,最后才可访问。问。285.5 内部类内部类class China final String nationalAnthem=义勇军进行曲义勇军进行曲; Beijing beijing; China() beijing= new Beijing(); String getSong() return nationalAnthem; class Beijing String name =北京北京; void speak() System.out.println(我们是我们是+name+我们的国歌是:我们的国歌是:+getSong(); public class Example public static void main(String args) China china = new China(); china.beijing.speak(); /China.Beijing beij=china.new Beijing(); /beij.speak(); 295.5 内部类内部类class Cubic double getCubic(int n) return 0;abstract class Sqrt public abstract double getSqrt(int x);class A void f(Cubic cubic) double result = cubic.getCubic(3);System.out.println(result);public class Example public static void main(String args) A a= new A(); a.f(new Cubic()double getCubic(int n) return n*n*n;); Sqrt ss =new Sqrt()public double getSqrt(int x)return Math.sqrt(x); double m = ss.getSqrt(5); System.out.println(m); 匿名类匿名类30
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号