JAVA课件五讲包和继承.ppt
1.包1)包语句包是一种若干松散的类的集合,默认情况下,同一个包中的类可以相互访问。创建包使用package语句,该语句必须是java程序文件的首条语句,指明该源文件定义的类所在的包。格式为:package pkg1.pkg2.pkg3;例:package sunrise;package java.awt.image;若有package tom.jiafei;目录结构中必须包含.tomjiafei的结构,如e:javapromtomjiafei,要将文件保存在此目录下,用e:javapromtomjiafeijavac 源文件或者 javac e:javapromtomjiafei 源文件,编译方法:(自动生成目录层次结构)javac xxx.java-d.,package tom;public class Package1int a,b;public void setab(int i,int j)a=i;b=j;public void printab()int sum=a+b;System.out.println(a+b=+sum);,package tom.jiafei;public class Package2int x,y;public void setxy(int i,int j)x=i;y=j;public void printxy()int product=x*y;System.out.println(x*y=+product);,import tom.Package1;import tom.jiafei.Package2;class E_packagepublic static void main(String args)Package1 obja=new Package1();obja.setab(3,5);obja.printab();Package2 objb=new Package2();objb.setxy(3,5);objb.printxy();,2)import语句用import语句可以引入java提供给我们的大约130多个包和自己定义的包中的类。Java.applet 包含所有的实现applet的类Java.awt包含抽象窗口工具集中的图形、文本、窗口类包含抽象窗口工具集中的图像处理类Java.lang包含所有的基本语言类Java.io包含所有的输入输出类J包含所有实现网络功能的类Java.util包含常用类,import java.applet.Applet;import java.awt.*;public class E_import extends AppletButton redbutton;public void init()redbutton=new Button(这是个红色按钮);redbutton.setBackground(Color.red);add(redbutton);public void paint(Graphics g)g.drawString(this is a button,30,50);,2.访问权限小结public:所有的类除了内部类(类中类)都能有public说明符。可以从任何java程序的任何对象使用公有类、实例变量或方法。(所有包可见)private:只有同一类中创建的对象才能访问私有变量方法。在其他类中创建的对象不能访问私有变量。(仅在本类可见)protected:在类中被申明为保护的变量可以被同一个包中的该类的对象访问。也能被其子类访问,而不管它们是否在同一个包中。(本类和本类子类可见)缺省访问:如果没有给定修饰符,那就是friendly(友元)的(它不是java的关键字)。拥有友元修饰符的类、变量或方法对同一个包里的所有类来说都是可访问的。(同一包中的各类及其子类可见)对于友好类,在另外一个类中使用友好类创建对象时,要保证他们是在同一个包中。访问权限优先级:public、protected、友好、private,3.类的继承新类可以继承一般类的状态和行为,并根据需要增加自己新的状态和行为。由继承而得到的类称为子类,被继承的类称为父类(超类)。java不支持多重继承,子类只能有一个父类,但父类可以有多个子类。1)创建子类格式class 子类名 extends 父类名子类中成员例:class Students extends People.,2)子类的继承性(1)子类和父类在同一包中的继承性如果子类和父类在同一个包中,子类继承其父类中不是private的成员变量和成员方法作为自己的成员变量和成员方法。例:,import java.applet.*;import java.awt.*;class Fatherprivate int money;float weight,height;String head;String speak(String s)return s;class Son extends FatherString hand,foot;,public class E_extends extends AppletSon boy;public void init()boy=new Son();boy.weight=1.70f;boy.height=120f;boy.head=一个头;boy.hand=两只手;boy.foot=两只脚;public void paint(Graphics g)g.drawString(boy.speak(继承此方法),5,20);g.drawString(boy.head+boy.hand+boy.foot+boy.weight+boy.height,5,40);,(2)子类和父类不在同一包中的继承性如果子类和父类不在同一个包中,子类继承其父类public和protected的成员变量和成员方法作为自己的成员变量和成员方法。不能继承私有和友好成员。例:,/Father.javapackage tom;public class Fatherint height;protected int money;public int weight;public Father(int m)money=m;protected int getMoney()return money;void setMoney(int newMoney)money=newMoney;,/Jerry.javapackage tom.jiafei;import tom.Father;public class Jerry extends Fatherpublic Jerry()super(20);public static void main(String args)Jerry jerry=new Jerry();/jerry.height=12;jerry.weight=200;jerry.money=800;int m=jerry.getMoney();/jerry.setMoney(300);System.out.println(m=+m);,3)成员变量的隐藏和方法的重写当在子类中定义的成员和父类中的成员变量同名时,称子类的成员变量隐藏了父类的成员变量。当子类中定义了一个方法,并且该方法的名字、返回类型、参数个数和类型同父类的某个方法,父类的该方法也将被隐藏,此时称父类的方法被重写。例:,import java.applet.*;import java.awt.*;class Chengjifloat f(float x,float y)return x*y;class Xiangjia extends Chengjifloat f(float x,float y)return x+y;,public class E_cover extends AppletXiangjia sum;public void init()sum=new Xiangjia();public void paint(Graphics g)g.drawString(sum=+sum.f(4,6),100,40);,对于子类创建的一个对象,如果子类重写了父类的方法,则运行时调用子类重写的方法,如果未重写,则调用的是从父类继承来的方法。例:,import java.applet.*;import java.awt.*;class Areafloat f(float r)return 3.14f*r*r;float g(float x,float y)return x+y;class Circle extends Areafloat f(float r)return 3.14f*2.0f*r;,public class E_cover2 extends AppletCircle yuan;public void init()yuan=new Circle();public void paint(Graphics g)g.drawString(yuan=+yuan.f(5.0f),5,20);g.drawString(yuan=+yuan.g(2.0f,8.0f),5,40);,注意:重写父类的方法时,不可以降低方法的访问权限4)final类final方法final类不能被继承,一个方法被定义为final则该方法不能重写,一个成员变量被修饰为final就是常量。5)继承的传递性类B继承了类A,类C又继承了类B,这时类C应包含类A和类B的所有成员,以及类C自身成员。这称为类继承的传递性。例:,class Aint a1=2;public int a2=4;public int a3=6;int geta3()return a3;void seta3(int i)a3=i;class B extends Aint b1=3;,class C extends Bint c1=7;void method1()a1+;a2+;seta3(geta3()+1);b1+;c1+;class E_passpublic static void main(String args)C c=new C();c.method1();System.out.println(c.a1+,+c.a2+,+c.geta3()+,+c.b1+,+c.c1);,6)对象的上转型对象设A类是B类的父类,用子类创建一个对象,并把这个对象的引用放到父类的对象中时,如:A a;a=new B();或A a;B b=new B();a=b;称父类对象a是子类对象b的上转型对象。对象的上转型对象的实体是子类负责创建的,但上转型对象会失去原对象的一些属性和功能。,上转型对象的特点:(1)上转型对象不能操作子类新增的成员变量和方法(2)上转型对象可以操作子类继承或重写的变量和方法(3)如果子类重写了父类的某个方法,对象上转型对象调用时一定是调用这个重写的方法,注意:(1)父类创建的对象和子类对象的上转型对象不是一个含义(2)可以将对象的上转型对象再强制转换到一个子类对象,这时该子类对象又具备该子类所有的属性和功能。(3)不可以将父类创建的对象的引用赋值给子类声明的对象。例:,class 类人猿private int n=100;void crySpeak(String s)System.out.println(s);class People extends 类人猿void computer(int a,int b)int c=a*b;System.out.println(c);void crySpeak(String s)System.out.println(*+s+*);,class E_uptraferpublic static void main(String args)类人猿 monkey=new People();monkey.crySpeak(i love this game);People people=(People)monkey;puter(10,10);,4.多态性多态性就是指父类的某个方法被其子类重写时,可以各自产生自己的功能行为。例:,class Animalvoid cry()class Dog extends Animalvoid cry()System.out.println(汪汪.);class Cat extends Animalvoid cry()System.out.println(喵喵.);,class E_duotaipublic static void main(String args)Animal animal;if(Math.random()=0.5)animal=new Dog();animal.cry();else animal=new Cat();animal.cry();,5.abstract类和abstract方法用abstract修饰的类称为抽象类,修饰的方法称为抽象方法。注意:(1)abstract类不能用new运算创建对象,必须产生其子类,由子类创建对象。(2)对于abstract方法只允许声明,不允许实现。(3)如果一个非抽象类是abstract类的子类,它必须具体实现父类的abstract方法。(4)如果一个类含有abstract方法,那么这个类必须用abstract修饰,但abstract类可以没有abstract方法。(5)一个abstract类只关心它的子类是否具有某种功能,并不关心功能的具体行为,功能具体行为由子类负责实现。例:,abstract class 图形public abstract double 求面积();class 梯形 extends 图形double a,b,h;梯形(double a,double b,double h)this.a=a;this.b=b;this.h=h;public double 求面积()return(1/2.0)*(a+b)*h);,class 圆形 extends 图形double r;圆形(double r)this.r=r;public double 求面积()return(3.14*r*r);,class 堆图形 底;double 高;堆(图形 底,double 高)this.底=底;this.高=高;void 换底(图形 底)this.底=底;public double 求体积()return(底.求面积()*高)/3.0;,public class E_abstractpublic static void main(String args)堆 zui;图形 tuxing;tuxing=new 梯形(2.0,7.0,10.7);System.out.println(梯形的面积+tuxing.求面积();zui=new 堆(tuxing,30);System.out.println(梯形底的堆的体积+zui.求体积();tuxing=new 圆形(10);System.out.println(半径是10的圆的面积+tuxing.求面积();zui.换底(tuxing);System.out.println(圆形底堆的体积+zui.求体积();,6.super关键字1)使用super关键字调用父类的构造方法子类不继承父类的构造方法,但是可以在子类的构造方法中调用父类的构造方法,系统规定用this表示当前类的构造方法,用super表示直接父类的构造方法。实际上子类的构造方法包含自身类的构造方法和直接父类的构造方法。注意:(1)在定义构造方法中,可使用this调用本类的其他构造方法,使用super表示直接父类的构造方法,如果两个都不用,系统自动加上super关键字。(2)调用this或super的构造方法的语句必须放在第一条语句,并且两者最多只能调用其中一条。例:,class peopleString name;int age;people()people(String name,int age)this.name=name;this.age=age;System.out.println(in people);,class student extends peopleString school;student()this(null,0,null);System.out.println(in student1);student(String name,int age,String school)super(name,age);this.school=school;System.out.println(in student2);,class graduate extends studentgraduate()System.out.println(in graduate);class E_superpublic static void main(String args)people p=new graduate();,2)使用super操作被隐藏的成员变量和方法例:class Sumint n;float f()float sum=0;for(int i=1;i=n;i+)sum=sum+i;return sum;,class Average extends Sumint n;float f()float c;super.n=n;c=super.f();return c/n;float g()float c;c=super.f();return c/2;,public class E_super2public static void main(String a)Average aver=new Average();aver.n=100;float result1=aver.f();float result2=aver.g();System.out.println(result1=+result1);System.out.println(result2=+result2);,7.接口1)接口的声明与使用(1)接口声明interface 接口的名字(2)接口体接口体包含常量定义和方法定义两部分,接口中只能进行方法的声明,不允许提供方法的实现。例:interface Printtable final int MAX=100;void add();float sum(float x,float y);,(3)接口的使用一个类通过关键字implements声明自己使用一个或多个接口。如果使用多个接口,用逗号分隔。class A implements Printable,Addableclass Dog extends Animal implements Eatable,Sleepable如果一个类使用了某个接口,那么这个类必须实现该接口的所用方法。在类中实现接口的方法时,方法的名字、返回类型、参数个数及类型必须与接口中的完全一致。接口中的方法默认是public的,在接口中实现时一定要用public修饰。接口方法返回类型若不是void的,在类中实现方法体时,必须要用return语句;若是void类型类体不用return语句。Java包中也提供了接口。例:接口作为函数参数,将来应该传递实现该接口的类的对象,import java.applet.*;import java.awt.*;interface Computablefinal int MAX=100;void speak(String s);int f(int x);float g(float x,float y);,class China implements Computableint xuehao;public int f(int x)int sum=0;for(int i=1;i=x;i+)sum=sum+i;return sum;public float g(float x,float y)return 6;public void speak(String s),class Japan implements Computableint xuehao;public int f(int x)return 68;public float g(float x,float y)return x+y;public void speak(String s),public class E_interface extends AppletChina li;Japan henlu;public void init()li=new China();henlu=new Japan();li.xuehao=191819;henlu.xuehao=241848;public void paint(Graphics g)g.drawString(xuehao:+li.MAX+li.xuehao+从1到100求和+li.f(100),10,20);g.drawString(xuehao:+henlu.MAX+henlu.xuehao+加法+henlu.g(2.0f,3.0f),10,40);,2)接口回调可以把实现某一接口类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口中的方法。例:,interface ShowMessagevoid brand(String s);class TV implements ShowMessagepublic void brand(String s)System.out.println(s);class PC implements ShowMessagepublic void brand(String s)System.out.println(s);,public class E_interface2public static void main(String arg)ShowMessage sm;sm=new TV();sm.brand(长虹电视);sm=new PC();sm.brand(联想电脑);,接口声明时,如果再interface前加上public关键字,称这样的接口是一个public接口。Public接口可被任何一个类使用。如果不加public修饰,就是友好接口,友好接口可以被同一个包中的类使用。接口中变量默认是public static final,方法默认为public abstract。接口可以被继承(通过extends关键字),子接口将具有父接口的全部方法和常量。若父类实现某接口,则子类自然也实现该接口,子类不需要再使用implements声明自己实现该接口。,编写一个抽象类person,内有变量姓名,年龄,性别,有构造方法(注意构造方法的重载,this、super的使用)、speak(String s)方法,speak方法是抽象方法,目的是打印一个参数s。再定义person类的子类student,增加变量学校、专业;定义person类的子类teacher,增加变量学校、职称、教授课程。最后定义一个接口,接口中有常量country和显示成员变量的方法display(),在类student和teacher中使用了该方法。写出一个主类,测试上述类的正确性,测试时使用上转型对象和接口回调技术来体现多态性。,