java技术从入门到精通(孙鑫)学习笔记-Lesson2(面向对象下).doc
类的继承l 理解继承是理解面向对象程序设计的关键。l 在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类)。l 在Java中,不允许多继承。class Animalint weihght,height;void eat()System.out.println("animal eat");void sleelp()System.out.println("animal sleep");void breath()System.out.println("animal breath");class Fish extends Animalclass Integrationpublic static void main(String args)Animal an=new Animal();Fish fh=new Fish();an.breath();fh.breath();调用编译器的命令为: javac Animal.java调用执行的命令为: java Integration注 :编译器的对象是java文件 执行的对象是 包含main方法的那个类运行结果为: animal breath animal breath方法的覆盖l 在子类中定义一个与父类同名、返回类型、参数类型相同一个方法,称为方法的覆盖。l 覆盖发生在子类与父类之间。注:方法的重载发生在同一个类当中。class Animalint weihght,height;void eat()System.out.println("animal eat");void sleelp()System.out.println("animal sleep");void breath()System.out.println("animal breath");class Fish extends Animalvoid breath() /子类与父类的方法完全一致,发生覆盖。System.out.println("fish bubble");class Integrationpublic static void main(String args)Animal an=new Animal();Fish fh=new Fish();an.breath();fh.breath();运行结果为: animal breath fish bubble特殊变量superl 特殊变量super,提供了对父类的访问。l 可以使用super访问父类被子类隐藏的变量或覆盖的方法。l 每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。class Animalint weihght,height;void eat()System.out.println("animal eat");void sleelp()System.out.println("animal sleep");void breath()System.out.println("animal breath");class Fish extends Animalvoid breath()super.breath();System.out.println("fish bubble");class Integrationpublic static void main(String args)Animal an=new Animal();Fish fh=new Fish();an.breath();fh.breath();运行结果为: animal breath animal breath fish breathl 每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。class Animalint weihght,height;Animal()System.out.println("animal construct");void eat()System.out.println("animal eat");void sleelp()System.out.println("animal sleep");void breath()System.out.println("animal breath");class Fish extends AnimalFish() /这里的super()被隐藏了,实际上子类的构造方法的第一句都隐含地调用super()System.out.println("fish construct");void breath()/super.breath();System.out.println("fish bubble");class Integrationpublic static void main(String args)/Animal an=new Animal();Fish fh=new Fish();/an.breath();/fh.breath();运行结果为了: animal construct fish construct class Animal /发现编译后报错int weight,height;Animal(int weight,int height)System.out.println("animal construct");void eat()System.out.println("animal eat");void sleelp()System.out.println("animal sleep");void breath()System.out.println("animal breath");class Fish extends AnimalFish()/super(); /*编译报错。因为构造方法是不能继承的,所以调用父类的构造方法就不能用 Animal()的形式,这就得借助super()来调用了。默认情况下,子类创建的构造函数的第一条语句就会调用super()方法,super()方法即代表父类的构造方法。现在子类Fish的构造方法中默认调用的是super(),但却在父类中找不到这样的构造函数,因为父类中只存在带参数的构造方法,这样造成不匹配就会在编译的时候报错。要解决这个问题就得解决匹配的问题,应在子类Fish的构造方法中定义带参数的super()方法如: super(30,40) ,见下面的修改的程序*/System.out.println("fish construct");void breath()/super.breath();System.out.println("fish bubble");class Integrationpublic static void main(String args)/Animal an=new Animal();Fish fh=new Fish();/an.breath();/fh.breath();class Animalint weight,height;Animal(int weight,int height)System.out.println("animal construct");void eat()System.out.println("animal eat");void sleelp()System.out.println("animal sleep");void breath()System.out.println("animal breath");class Fish extends AnimalFish() super(40,50);System.out.println("f ish construct");void breath()/super.breath();System.out.println("fish bubble");class Integrationpublic static void main(String args)/Animal an=new Animal();Fish fh=new Fish();/an.breath();/fh.breath();运行结果为: animal construct fish construct-多态性l 通过覆盖父类的方法来实现,在运行时根据传递的对象引用,来调用相应的方法。class Animalint weight,height;Animal(int weight,int height)void eat()System.out.println("animal eat");void sleelp()System.out.println("animal sleep");void breath()System.out.println("animal breath");class Fish extends AnimalFish() super(40,50);void breath()System.out.println("fish bubble");class Integrationstatic void fn(Animal an)an.breath();public static void main(String args)Fish fh=new Fish();Animal an;an=fh;Integration.fn(an);运行结果为: fish bubble l 当我们将子类对象 的引用传递给声明为父类的一个对象变量,如果子类有的方法,就调用子类的方法,如果子类没有这个方法,那么就调用父类的方法。class Animalint weight,height;Animal(int weight,int height)void eat()System.out.println("animal eat");void sleelp()System.out.println("animal sleep");void breath()System.out.println("animal breath");class Fish extends AnimalFish() super(40,50);/*void breath()System.out.println("fish bubble");*/ /子类中没有定义breath()这个方法,子类会调用父类的breath()方法, /这就是运行结果显示为调用父类的breath()方法的根本原因。class Integrationstatic void fn(Animal an)an.breath();public static void main(String args)Fish fh=new Fish();Animal an;an=fh;Integration.fn(an);运行结果为: animal breath (子类继承了父类的breath()方法)操作符instanceof:用来判断一个对象是否是一个类的实例class Animalint weight,height;Animal(int weight,int height)void eat()System.out.println("animal eat");void sleelp()System.out.println("animal sleep");void breath()System.out.println("animal breath");class Fish extends AnimalFish() super(40,50);class Integrationstatic void fn(Animal an)an.breath();public static void main(String args)Animal an=new Animal(30,40); /注意:类Animal中的构造方法是带参数/的,这里初始化Animal对象时也要带上参数Fish fh=new Fish();if(an instanceof Animal)System.out.println("an is Animals instance");if(fh instanceof Fish)System.out.println("fh is fishs instance");运行结果为:an is Animals instance fh is Fishs instanceclass Animalint weight,height;Animal(int weight,int height)void eat()System.out.println("animal eat");void sleelp()System.out.println("animal sleep");void breath()System.out.println("animal breath");class Fish extends AnimalFish() super(40,50);class Integrationstatic void fn(Animal an)an.breath();public static void main(String args)Animal an=new Animal(30,40); /注意:类Animal中的构造方法是带参 / 的, 这里初始化对象Animal对象时也要带上参数Fish fh=new Fish();an=fh; /把子类对象赋给了父类对象,则父类的实例也成了子类的实例if(an instanceof Fish)System.out.println("an is Fishs instance");elseSystem.out.println("an isnt Fishs instance");if(an instanceof Animal)System.out.println("an is Animals instance");elseSystem.out.println("an isnt Animals instance");if(fh instanceof Animal)System.out.println("fh is Animals instance");elseSystem.out.println("fh isnt Animals instance");运行结果为: an is Fishs instance an is Animals instance fh is Animals instance-面向对象的程序设计l 问题:求一个长方形的周长和面积。以面向过程的程序设计方式思考:1、确定长方形周长和面积的算法。2、编写两个方法(函数)分别计算长方形的周长和面积。3、求周长的方法(函数)和求面积的方法(函数)需要两个参数,分别是长方形的长和宽。面向过程的程序设计代码:class Rectangle /保存为 Rectangle.java文件static int perimeter(int length,int width)return 2*(length+width);static int area(int length,int width)return length*width;public static void main(String args)System.out.println("perimeter="+Rectangle.perimeter(5,4);/由于定义的/是静态的方法,故可以直接用类名来调用。System.out.println("area="+Rectangle.area(5,4);/理同上运行结果为: perimeter=18 Area=20面向对象的程序设计l 问题:求一个长方形的周长和面积。以面向对象的程序设计方式思考:1、 一个长方形可以看成是一个长方形对象。2、 一个长方形有两个状态(长和宽)和两个行为(求周长和求积)。3、 将所有长方形的共性抽取出来,设计一个长方形类。4、 通过长方形对象的行为,就可以求出某个具体的长方形对象的周长和面积。class Rectangleint l,w;int perimeter()return 2*(l+w);int area()return l*w;public static void main(String args)Rectangle rec1=new Rectangle();Rectangle rec2=new Rectangle();rec1.l=4;rec1.w=6;System.out.println("perimeter of rec1="+rec1.perimeter();System.out.println("area of rec1="+rec1.area(); rec2.l=5; rec2.w=10; System.out.println("perimeter of rec2="+rec2.perimeter();System.out.println("area of rec2="+rec2.area();