1、面向对象程序设计面向对象程序设计本课内容本课内容方法的重载 This关键字对象的创建和初始化细节几种常用的Java类Java类的static成员final关键字 方法重载方法重载 在同一个类中可以定义多个同名方法-方法重载public class PrintStreampublic void println(int i)public void println(float f)public void println(String s)重载方法的参数列表必须不同 重载方法的返回值类型可以相同,也可以不同构造方法重载构造方法重载(代码重用代码重用)构造方法重载举例:public class Pers
2、onpublic Person(String name,int age,Date d)public Person(String name,int age)public Person(String name,Date d)构造方法重载,参数列表必须不同可以在构造方法的第一行第一行 使用this()关键字调用其它(重载的)构造方法构造方法重载举例构造方法重载举例import java.util.Date;public class Person private String name;private int age;private Date birthDate;public Person(Strin
3、g name,int age,Date d)this.name=name;this.age=age;this.birthDate=d;public Person(String name,int age)this(name,age,null);public Person(String name,Date d)this(name,30,d);public Person(String name)this(name,30);Ex1 编写应用程序编写应用程序TestOverride.java测试前页测试前页Person.java中的重载方法中的重载方法 构造方法不能构造方法不能继承继承子子类类继继承承父
4、父类类所所有有的的成成员员变变量量和和成成员员方方法,但法,但不继承不继承父类的构造方法父类的构造方法在在一一个个Java类类中中可可以以通通过过两两种种方方式式获获得得构造方法构造方法使用系统默认的无参构造方法使用系统默认的无参构造方法显式定义一个或多个构造方法显式定义一个或多个构造方法一一旦旦显显式式定定义义了了构构造造方方法法,则则系系统统不不再再提供默认构造方法提供默认构造方法子类的构造方法中一定要子类的构造方法中一定要调用调用父类构造方法父类构造方法在在 子子 类类 的的 构构 造造 方方 法法 中中 可可 使使 用用 语语 句句super(argument_list)显式调用显式调
5、用父类的构造方法父类的构造方法如如果果子子类类的的构构造造方方法法中中没没有有显显示示地地调调用用父父类类构构造造方方法法,也也没没有有使使用用this关关键键字字调调用用重重载载的的其其它它构构造造方方法法,则则系系统统默默认认调调用用父父类类无参数无参数的构造方法的构造方法如如果果子子类类构构造造方方法法中中既既未未显显式式调调用用父父类类构构造造方方法法,而而父父类类中中又又没没有有无无参参的的构构造造方方法法,则编译出错则编译出错调用父类构造方法举例调用父类构造方法举例public class Student extends Person private String school;p
6、ublic Student(String name,int age,String s)super(name,age);school=s;public Student(String name,String s)super(name);school=s;public Student(String s)/super();school=s;this/super(1)thisthis是对是对当前对象的一个引用当前对象的一个引用supersuper是对是对父类的一个引用父类的一个引用什么叫当前对象的一个引用呢?我们先来看一些例子什么叫当前对象的一个引用呢?我们先来看一些例子class Box class
7、Box double width;double height;double depth;double width;double height;double depth;double volume()return width*height*depth;double volume()return width*height*depth;void void setDim(doublesetDim(double width,double height,double depth)width,double height,double depth)widthwidth =width;=width;height
8、 height=height;=height;depth depth =depth;=depth;JavaJava中特殊而且非常有用的引用中特殊而且非常有用的引用this.this.this.this.this.this.按照变量定义域的规则,这种情况下成员变量(蓝)按照变量定义域的规则,这种情况下成员变量(蓝)会被方法中局部变量(红)覆盖掉会被方法中局部变量(红)覆盖掉使用使用thisthis引用后,成员引用后,成员又重新暴露出来了又重新暴露出来了用用thisthis引用解决成员变引用解决成员变量与成员方法的局部变量与成员方法的局部变量名称冲突的问题量名称冲突的问题this(2)如果我们用下
9、列语句如果我们用下列语句Box bx1=new Box();Box bx1=new Box();Box bx2=new Box();/Box bx2=new Box();/生成了两个生成了两个BoxBox的对象的对象从外部看前一个对象的引用是从外部看前一个对象的引用是bx1bx1,从,从它的内部看引用则是它的内部看引用则是thisthis同样道理,从外部看第二个对象的引用是同样道理,从外部看第二个对象的引用是bx2bx2,而从而从bx2bx2的内部看的内部看它的引用也是它的引用也是thisthis这就是说,这就是说,在一个对象的内部,如果想得到这个对象的引用,要在一个对象的内部,如果想得到这个
10、对象的引用,要用用thisthis,而不是它的名称而不是它的名称从一个对象的内部看它的父类的对象就是从一个对象的内部看它的父类的对象就是supersuperthis(3)/superthisthis作为输入参数作为输入参数thisthis表示本对象的表示本对象的getValue(AgetValue(A a)a)调用父类的构造方法调用父类的构造方法调用父类的调用父类的getValuegetValue()()方法方法class A class A A(intA(int v)value=v;v)value=v;public public intint getValue(AgetValue(A a)a
11、)System.out.println(getValueSystem.out.println(getValue(.)of class A);(.)of class A);return a.value;return a.value;protected protected intint getValuegetValue()()System.out.println(getValueSystem.out.println(getValue()of class A);()of class A);return return this.getValue(thisthis.getValue(this););pr
12、otected protected intint value;value;class B extends A class B extends A B()super(7);B()super(7);public public intint getValue(BgetValue(B b)b)System.out.println(getValueSystem.out.println(getValue(.)of class B);(.)of class B);return b.value;return b.value;protected protected intint getValuegetValue
13、()()System.out.println(getValueSystem.out.println(getValue()of class B);()of class B);return return super.getValuesuper.getValue();();this(4)/更多的例子更多的例子public class ThisTestDemo1 public class ThisTestDemo1 public static void main(String s)public static void main(String s)A a=new A(30);A a=new A(30);
14、B b=new B();B b=new B();System.out.println(a.getValueSystem.out.println(a.getValue();();System.out.println(b.getValueSystem.out.println(b.getValue();();getValuegetValue()of class A()of class AgetValuegetValue(.)of class A(.)of class A3030getValuegetValue()of class B()of class BgetValuegetValue()of c
15、lass A()of class AgetValuegetValue(.)of class A(.)of class A7 7a.getValuea.getValue()()的调用顺序的调用顺序调用调用a a的的getValuegetValue()()调用调用a a的的getValue(AgetValue(A a)a)返回返回a a对象的对象的valuevalue值值b.getValueb.getValue()()的调用顺序的调用顺序调用调用b b的的getValuegetValue()()调用调用a a的的getValuegetValue()()调用调用a a的的getValue(AgetV
16、alue(A a)a)返回返回a a对象的对象的valuevalue值值使用使用thisthis引用调用自己的构造方法引用调用自己的构造方法this(5)class Box class Box/Box()width=10;height=10;depth=10;Box()width=10;height=10;depth=10;Box()Box()this(10,10,10);this(10,10,10);Box(double w)Box(double w)this(w,10,10);this(w,10,10);Box(double w,double h,double d)Box(double w,double h,double d)width=w;height=h;depth=d width=w;height=h;depth=d;double volume()return width*height*depth;double volume()return width*height*depth;double width;double height;double depth;double wi