java_继承与接口详细讲解全解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
属性和方法的访问限定符
一个类作为整体对程序的其他部分可见,并不能 代表类内的所有域和方法也同时对程序的其他部 分可见,前者只是后者的必要条件 属性和方法的可见性
当前类 子孙 同 Package √ √ √ √ × √ × × 其他 Package √ × × ×
public protected private
接口的实现
public class MyApplet extends Applet implements Runnable , MouseListener { … … }
一个类只能有一个父类,但是它可以同时实现若 干个接口。如果把接口理解成特殊的类,那么这 个类利用接口实际上就获得了多个父类,即实现 了多继承。 instanceof 运算符可用来判断一个对象的类是否 实现了某个接口。
调用父类的构造方法
子类继承父类所有的属性和方法(非private), 但不继承构造方法。 子类或定义自己的构造方法,或使用隐含构造方 法。 在继承情况下的对象初始化:
为对象分配内存并初始化(0、null、false) 执行每一层的类的显式初始化(从父类到子类)。 执行每一层的类的构造方法 (从父类到子类) 。
调用父类构造方法
为了保证安全性,在子类的构造方法中,应首先 调用一个父类的构造方法。 子类可在自己的构造方法中使用super(…) 来调用 父类带参数的构造方法。 super(…)调用语句必须是子类构造方法中的第一 个可执行语句。 若子类 的构造方法中没有super(…)语句,系统 将隐含调用父类无参数构造方法 若父类的构造方法都有参数,则子类必须定义自 己的构造方法,然后通过super(…)语句调用父类 的某个构造方法。
接口类型的变量和实现类的实例
可以声明接口类型的变量和接口类型的参数。 接口的实现类和接口之间的存在着类型兼容性, 由于这个原因,所以:
接口类型的变量可以接受传递给它的实现类的实例 接口类型的参数可以接受传递给它的实现类的实例
利用接口类型的变量或参数存储实现类的实例, 是面向对象编程的重要方法——多态
class Employee{ private double salary = 1800; public void setSalary(double salary) { this.salary = salary; } public double getSalary() { return this.salary; } }
接口
wenku.baidu.com
“接口”和抽象类有些类似。 接口中的方法都是没有方法体的抽象方法。 接口中只能定义 static final 属性 。 接口定义的仅仅是实现某一特定功能的一组功能 的对外接口和规范,而并没有真正地实现这个功 能。 接口的功能实现是在“继承”了这个接口的各个 类中完成的,由这些类来具体定义接口中所有抽 象方法的方法体。 通常把对接口的“继承”称为“实现”。
继承
Employee
属性: name age salary 方法: setSalary getInfo
Engineer
Secretary Manager
属性: allowance 方法: setAllowance getInfo
Director
属性: telephone department 方法: setTel getInfo
调用父类被覆盖的方法— super.方法名
方法的覆盖
Number_PhoneCard类: abstract boolean performDial(); double getBalance() final boolean performConnection(long cn,int pw) D200_Card类: boolean performDial() 覆盖 实现抽象方法 double getBalance() 覆盖 实现细节不同
抽象与抽象类
程序员可以先创建一个定义共有属性和方法的一 般类,再从一般类派生出具有特性的新类。 abstract class A{ abstract int min(int x, int y); int max(int x, int y){ return x>y ? x : y; } } 抽象类不能用new创建对象。
方法覆盖(overwriting)
在面向对象的程序设计中,子类可以把从父类那里继承来 的某个方法改写,形成同父类方法同名、解决的问题也相 似、但具体实现和功能却不尽一致的新方法。 定义与父类完全相同的方法,实现对父类方法的覆盖: 完全相同的方法名 完全相同的参数列表 完全相同类型的返回值 抛出的例外要相同 访问权限不能缩小 否则就不是方法的覆盖,而是子类自己定义与父类无关的 方法,父类的方法未被覆盖。不正确的覆盖有时会引发编 译时候的语法错误。
}
接口的规定
类定义中使用 implements 指定实现某一接口 类中必须具体实现该 interface 中定义的抽象方 法。 实现的方法必须指定为public限定符。 实现接口的类要实现接口的全部方法。如果不需 要某个方法,也要定义成一个空方法体的方法。 public 方法名() { }
接口类型变量和参数示例
interface I{ void doSome(); } class IC1 implements I{//接口I的实现类IC1 public void doSome(){ System.out.println("IC1 impl…"); } } class IC2 implements I{//接口I的另一个实现类 public void doSome(){ System.out.println("IC2 impl…"); } } class Test{ static void testI(I i){ //接口类型的参数 i.doSome(); } //见下页
继承与接口
继承 控制符 接口 内部类
继承
继承是一种由已有的类创建新类的机制,是面向 对象程序设计的基石之一。 子类继承父类的属性和方法,还可以定义新的属 性和方法,也可以改写父类的方法。 继承实际上是存在于面向对象程序中的两个类之 间的一种关系。 Java要求每个类都有父类(隐含为java.lang包中 的Object类)。 super 是对父类的引用,引用父类的构造方法、 父类成员属性和方法。
内部类(inner class)
在某个类的内部定义的类称之内部类。 内部类的定义方法
定义命名的内部类:可以在类中(甚至方法中)定义 内部类,并在类的内部多次使用(创建多个对象)。 定义匿名内部类(一次性类):可以在new关键字后 定义内部类,以立即创建一个对象
内部类的类文件命名方法 设外层类名为Myclass,则该类的内部类名为: Myclass$c1.class (c1 为命名内部类名) Myclass$1.class (表示类中定义的第一个匿名 内部类)
继承—增加属性和方法
class Employee { String name ; int age ; float salary ; void upSalary(float inc) { salary = salary + inc ; } } class Manager extends Employee { float allowance ; void setAllowance(float a) { allowance = a ; } } class Direator extends Manager { String telephone ,department ; void setTel(String tel) { telephone = tel ;} }
接口例
interface CalArea { double pi = 3.14 ; double calRArea(double r) ; } public class CalAreaImp implements CalArea { public double calRArea(double r) { return pi * r *r ; } public static void main(String[] args){ CalAreaImp imp=new CalAreaImp(); if(imp instanceof CalArea) //此处返回true System.out.println( imp.calRArea(5)); }
属性的覆盖(overwriting)
如何访问被隐藏的父类属性:
调用从父类继承的方法操作的是从父类继承的属性。 使用super.属性名。
class D200_Card extends Number_PhoneCard { final double additoryFee=0.1; double balance ; //覆盖 boolean performDial() { … } double getBalance() { … } double getSuperBalance() { return super.balance; //访问继承属性 } }
接口类型变量和参数示例(续)
//接上页 public static void main(String[] s) { //接口类型的变量i,赋予IC1的实例 I i = new IC1(); i.doSome(); //此时调用IC1中的实现方法 //将IC2的实例赋予i i = new IC2(); i.doSome(); //此时调用IC2中的实现方法 //将i作为参数传递 testI(i); //此时直接将IC1的实例作为实参传递给testI testI(new IC1()); }//main }//Test
class A{ int x=1 ; A(){ x=10; } A(int p1){ //p1=5 x=x+p1; } } class Sa extends A { }
class Sb extends A { Sb() { x=x+3; } Sb(int p1) { //p1=5 x=x+p1; } Sb(int p1,int p2){ //p1=5,p2=100 super(p1); x=x+p2; } } class Ssb extends Sb { Ssb() { x=x+6 ; } }
√ √ √
无访问限定符 √
属性和方法的访问限定符
为了使对象具有良好的封装性,一般将类的非静 态属性设计成私有。 为了使其它类或对象能够访问这些私有属性,本 类必须提供访问私有属性的方法(公共方法)。 按照惯例,读私有属性的方法取名为get… 写私有属性的方法取名为 set… ,get/set后面跟 上属性的名称,其中属性的第一个字母要大写。 这些方法在术语上叫做Setter/Getter方法。
接口的实现
Object abstract class 继承 class class java—单重继承 接口 实现
class
final class
接口的定义
[public] interface 接口名 [extends 父接口名列表] { // 常量域声明 public static final 域类型 域名 = 常量值; // 抽象方法声明 public abstract 返回值类型 方法名( 参数列表 ) ; } 接口是由常量和抽象方法组成的特殊类。
访问控制符
访问控制符是一组起到限定类、域或方法是否可 以被程序里的其他部分访问和调用的修饰符 。 类访问控制符
公共类 :public 类名 一般类
一个包中的类只能访问另一个包中的public类。 一般类只能在同一包中使用,一个包中的类不用 说明可相互访问。 把常在一起协同工作的类放在一个包里是很自然 的。