抽象、继承、多态.ppt_第1页
抽象、继承、多态.ppt_第2页
抽象、继承、多态.ppt_第3页
抽象、继承、多态.ppt_第4页
抽象、继承、多态.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

5.1 用extends定义继承,一个类可以是另外一个类的子类,使用extends来表示继承另一个类 class Animal float weight; void eat() System.out.println( “eat in Animal“ ); ,5.1 用extends定义继承,public class Mammal extends Animal int heartRate; void breathe() System.out.println( “breathe in Mammal“ ); public static void main( String args ) Mammal aMammal = new Mammal(); aMammal.weight = 20f; aMammal.eat(); aMammal.heartRate = 80; aMammal.breathe(); ,继承了超类的weight属性,继承了超类的eat()方法,若weight、eat()定义为private,如何?,子类和父类的关系,是子类类型一定是父类类型 是Mammal,就一定是Animal,这句总是成立的。只要是哺乳动物,就一定是动物。 一个对象是子类类型,也是父类类型。 可以把子类类型的值赋给父类类型的变量。 Mammal aMammal=new Mammal(); Animal aAnimal=aMammal;,子类和父类的关系,是父类类型不一定是子类类型 是Animal,就不一定是Mammal。并不是所有的动物都是哺乳动物。 子类类型的变量父类类型的值:父类类型的值不能赋值给子类类型的变量,子类和父类的关系,一个类只能继承一个类,也就是说只能有一个父类。 java中的所有类都间接或直接继承了Object类。 Object obj=aAnimal; Object obj2=“java“;,4.5 包,为什么要用包? 解决命名冲突 把类有序的组织起来 把不同的类按照功能(或其他标准)放在不同的空间 比如音乐放music目录下,电影放movie目录下。书放书包,钱放钱包。,这个空间叫包,4.5 包-命名,包的名字一般采用小写,域名倒写的方式, com.sun,.haut。 域名是唯一的,这样保证了包名不会重复。,4.5 包-包和目录的关系,包的实际表现为java文件放在不同的目录下。 Math类属java.lang包,该Math.java在java/lang下。,4.5 包,4.5 包-包和目录的关系,同名的文件可以存放在不同的目录下,同名的类也可以在不同包中。 目录下可以有子目录,包下也可以有子包。比如java包下就有util,lang包, 包的完整名为从父一直到自己:java.util,java.lang。,4.5 包-声明一个类属于包,放在java文件第一句,用package关键字 package ;/声明该类属于包。 public class Student package .haut;/声明该类属于.haut包 public class HelloWorld ,4.5 包-声明一个类属于包,如果一个java文件没有声明属于包,也就是没有package声明,那么该类属于“缺省包”。 类的全名:就是包名+.+类名。如上述声明的HelloWorld类的全名为.haut.HelloWorld。 java和javax开头的包是java保留的,不允许使用。,4.6 访问权限修饰符,决定一个类能否使用另一个类、变量、方法等。 四种可见性修饰符:private、默认、protected、public。 类和类之间的关系: 是否子类:子类,非子类 是否同一包:同一包,不同包,4.6 访问权限修饰符,public:包内可见+包外可见 protected:包内可见+包外子类可见。 缺省:只包内可见,所以又叫包友好。注意包外子类不可见。 private:自己可见。,4.6 访问权限修饰符,否,是,是,是,protected,是,否,否,不同包,非子类,是,否,否,不同包,子类,是,是,否,同一包,非子类,是,是,否,同一包,子类,public,默认(或缺省,包友好),private,是否可见,4.6 访问权限修饰符,如何使用:可以在class、变量、方法、构造方法前加这些可见性的修饰符。 private int age; private void sum() private Student() protected void show(),4.6 访问权限修饰符,class Father1 int i; private int j; private void show() /私有方法不能被继承 System.out.println(“show in father1“); ,不是私有,可以被包内子类继承,私有变量,不能被继承,4.6 访问权限修饰符,public class Son1 extends Father1 int total; void sum() total = i + j; public static void main(String args) Son1 aSon1=new Son1(); aSon1.i=12; aSon1.show(); ,不能编译,编译会提示无法访问私有变量,不是私有变量,可以继承,私有方法不能继承,class Father1 int i; private int j; private void show() out.println(“show in father1“); ,4.6 访问权限修饰符,使用修饰符一般规则 尽量缩小可见范围。 变量一般声明为private的,然后声明get和set方法进行访问。 如果子类需要直接访问就声明为protected。,5.2 Override,子类中方法与父类中方法签名相同和返回类型相同 class Animal3 void eat() System.out.println(“parent“); ,5.2 Override,public class Mammal3 extends Animal3 void eat() System.out.println(“son“); public static void main( String args ) Mammal3 son = new Mammal3(); Animal3 father=son; father.eat(); ,和父类中eat()方法签名相同,父类的eat()方法被Override,Override是根据实际类型选择调用的方法,Overload是根据声明的类型决定的,?,5.2 Override,和父类方法修饰符比,子类方法修饰符的可见范围至少一样大。 父类为包友好,子类中可为 若父类方法修饰符为protected,子类中可为?,包友好、protected、public,使用Override,如果本打算Override的方法,因为方法签名不一样,那就不是Override。这种错误很难发现。,class Animal4 void startSleep(int seconds) out.println(“sleep “+ seconds); ,public class Mammal4 extends Animal4 /子类只能睡预定之间的一半 void startsleep(int seconds) out.println(“only sleep “+ seconds/2); ,本质是想Override,实际上方法签名不一样,并没有覆盖,是定义了一个新的方法,使用Override,可以使用java 5.0中的Override注释来解决,指定一个方法Override父类方法。 Override void startsleep(int seconds 编译器会自动进行检查,确保Override父类的方法,5.3 Super-在构造方法中使用,调用父类构造方法,必须位于第一行。,class Person7 String name; Person7(String _name) =_name; ,class Student7 extends Person7 String className; Student7(String name,String className) super(name); this.className=className; ,5.3 Super-在构造方法中使用,如果子类的构造方法中没有明确调用超类的构造方法,编译器会在子类的构造方法第一行增加调用父类无参的构造方法(自己验证) 如果父类没有无参的构造方法,不能编译(自己验证),5.3 Super-访问父类的方法或变量,不用是第一句。 public class Person4 private String name; Person4(String name) =name; public void disp() out.println(“My name is “+name); ,class Student extends Person4 private int id; Student(String name,int id) super(name); this.id=id; Override public void disp() super.disp(); out.println(“My id is “+id); ,5.4 final,阻止类被继承和方法被Override 课堂练习:设计个例子,演示 修饰变量 表示这个变量只能被初始化一次,一般在声明的时候进行赋值 适用场合:赋值之后不会改变 常用final和static同时修饰变量,表示是个常数。 用大写字母表示,有多个单词时用_连接。 final static int MONTHS_OF_YEAR=12;,6.1 抽象类,有abstract修饰的类。abstract修饰的方法是抽象方法。 public abstract class Shape abstract double area(); 特点 不能实例化(new),但可以用来声明变量,Shape aShape 抽象类可以有或没有抽象方法。 有abstract方法的类必须定义为abstract类。 抽象类除了有abstract修饰符外,和其它类一样。,抽象方法没有方法体,而不是方法体为空。,6.1.2 实现抽象类,extends:继承抽象类 子类继承抽象类后: 要么实现超类所有的抽象方法 要么子类必须声明自己也是抽象类 子类继承抽象类,其实现的方法的权限必须大于或等于父类该方法的权限 父类权限为缺省,子类权限可以为缺省、protected、public 问题:父类权限为protected,子类实现的方法权限可以为哪些。,6.1.2 instanceof,判断对象的具体类型 变量名 instanceof 类名 abstract class Shape void disp() out.println(area(); abstract double area(); ,class Circle extends Shape double r; Circle(double _r) this.r=_r; Override public double area() return Math.PI*r*r; ,class Rect extends Shape double w,len; Rect(double _w,double _len) this.w=_w;this.len=_len; Override public double area() return w*len; ,6.1.2 instanceof,class ShapeDemo public static void main(String args) Shape shapes=new Circle(1.3),new Rect(2.1,3.2); show(shapes); public static void show(Shape shapes) for(Shape temp:shapes) if(temp instanceof Circle) out.println(“circle“); temp.disp(); ,temp是Circle还是Rect?计算机并不知道,6.1.3 抽象类的应用,抽象类除了抽象方法外还有非抽象方法。 非抽象方法是所有子类都会用到的辅助方法,内容一样。 抽象方法是所有子类都会用到的,内容不一样。,6.1.3 抽象类的应用,测试一个方法运行所花时间 为了更为准确,多次运行该方法,然后求一个运行时间的平均值。 求1000个数的和、平方和所要时间,记录开始时刻和结束时刻,求时间差,6.1.3 抽象类的应用,public class TestSumTime public void run() long startTime=System.nanoTime(); int sum=0; for(int i=0;i1000;i+) sum+=i; long endTime=System.nanoTime();,public class TestSquareSumTime public void run() long startTime=System.nanoTime(); int sum=0; for(int i=0;i1000;i+) sum+=i*i; long endTime=System.nanoTime(); ,6.1.3 抽象类的应用,public abstract class TestRunTime1 abstract void run(); public void test() long startTime=System.nanoTime(); /开始计时 run(); long endTime=System.nanoTime();/停止计时 out.printf(“运行时间为:%dns%n“,(endTime-startTime); ,6.2 接口,接口表现的是一种能力,自己能够做什么。 接口规定了应该做什么,并不规定应该怎么做。 interface Command double NUM=12; void execute(); 可以定义变量、内部类、声明方法(但不能有方法体),默认都是public abstract,默认都是public final static,6.2.2 实现接口,一个类实现接口用implements 要么实现其中的所有方法 要么声明为抽象类,?,java实现链表形式的栈,class Node int data; Node next; public Node(int data) this.data = data; public class StackSelf Node top = null; public StackSelf() ,top,java实现链表形式的栈-push,public void push(int data) Node newNode = new Node(data); newNode.next = top; top = newNode; ,java实现链表形式的栈-disp,public void disp() Node nextNode = top; while (nextNode != null) System.out.printf(“%2s“, nextNode.data); nextNode = nextNode.next; System.out.println(); ,java实现链表形式的栈-main,public static void main(String args) StackSelf selfStack = new StackSelf(); for (int i = 0; i 6; i+)

温馨提示

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

评论

0/150

提交评论