java 接口和内部类
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
接口的继承
interface Shape area()
extends extends
可以通过继承 接口创建新的 接口 使用extends 关键字实现接 口的继承
Shape2D interface Perimeter()
implements
Shape3D interface volumn()
implemewk.baidu.comts
内部类
一个类的定义放在另一个类的内部,这个类就叫做内部 类。 public class First { public class Contents{ public void f(){ System.out.println("In Class First's inner Class Contents method f()"); } } } 像这样的,Contents就叫做内部类
继承式的匿名内部类 public class Car { public void drive(){ System.out.println("Driving a car!"); } public static void main(String[] args) { Car car = new Car(){ public void drive() { System.out.println("Driving anther car!"); } }; car.drive(); } } 结果输出了:Driving another car! Car引用变量不是引用Car对象,而是Car匿名子类的对象。
接口定义
接口必须通过类来实现它的抽象方法 public class A implements B{...} 当类实现了某个接口时,它必须实现接口中的所有抽象 方法,否则这个类必须声明为抽象的 不允许创建接口的实例(实例化),但允许定义接口类型 的引用变量,该引用变量引用实现了这个接口的类的实 例 public class B implements A{} A a = new B(); //引用变量a被定义为A接口类型,引 用了B实例 A a = new A(); //错误,接口不允许实例化 一个类只能继承一个直接的父类,但可以实现多个接口, 间接的实现了多继承. public class A extends B implements C, D{...} //B 为class,C,D为interface
接口式的匿名内部类
interface Vehicle { public void drive(); } class Test{ public static void main(String[] args) { Vehicle v = new Vehicle(){ public void drive(){ System.out.println("Driving a car!"); } }; v.drive(); } } 上面的代码很怪,好像是在实例化一个接口。事实并非如此, 接口式的匿名内部类是实现了一个接口的匿名类。而且只能实现 一个接口。
接口的创建使用interface关键字,如:
public interface PCI{ int num=124; //常量 void start(); //方法 void stop(); }
接口实质上是一个常量和抽象方法的集合,方 法默认属性为:public abstract;常量默认属 性为:public static final;
接口定义
1, 接口中的成员变量默认都是public,static,final类型的(都可 省略),必须被显示初始化,即接口中的成员变量为常量(大写, 单词之间用"_"分隔) 2, 接口中的方法默认都是public,abstract类型的(都可省略), 没有方法体,不能被实例化 public interface A { int CONST = 1; //合法,CONST默认为public,static,final类 型 void method(); //合法,method()默认为public,abstract类型 public abstract void method2(); //method2()显示声明为 public,abstract类型 }
class
class
Java接口与多继承
interface Circle Scaleable Scale()
extends implements extends
Square
implements
CircleScaleable
SquareScaleable
Java不支持类的多继承,但可以通过接口实现多继承机制; 一个类只能继承于一个父类,但能同时实现多个接口; 辨别下面类A的定义形式的正确性? class A extends B,C{ …… } class A extends B implements C{ …… } class A implements B,C{ …… } class A extends B implements C,D{ …… }
接口说明
如果一个抽象类中的所有方法都是抽象的,就可以将这 个类用另外一种方式来定义,也就是接口定义。 接口是抽象方法和常量值的定义的集合,从本质上讲, 接口是一种特殊的抽象类,这种抽象类中只包含常量和 方法的定义,而没有变量和方法的实现 可以使用extends来继承接口的常量和抽象方法,但 它与类中的extends不同,它可以继承有多个父接口 (多重继承),各父接口间用逗号隔开。 接口中的所有常量必须是public static final,方法必 须是public abstract,这是系统默认的,不管你在定 义接口时,写不写修饰符都是一样的 定义接口
接口
接口是抽象类的一种变体,它与抽象类又有一 些差异。 接口是用关键字interface来定义的,形式为:
[修饰符] interface 接口名 { //方法和数据声明 }
接口中的所有方法都是抽象的(abstract可以 缺省),没有方法体。 必须在接口的子类中重写接口里所有抽象方法。
接口
}
private String str; }
在内部类Contents中,可以使用外围类First的字段str。 那么,它是如何实现的呢? 是这样的,用外围类创建内部类对象时,此内部类对象会 秘密的捕获一个指向外围类的引用,于是,可以通过这个引 用来访问外围类的成员。 通常,这些都是编译器来处理,我们看不到,也不用关心 这个。 正是因为如此,我们创建内部类对象时,必须与外围类对 象相关联。
接口实现
class cat implements Animal { public void shout () { System.out.print(“喵喵”); } } 实现接口 implements 一个类可以实现若干个接口 非抽象类必须实现所有的抽象方法
接口例子
interface prt { public void prtln(); } class A implements prt{ int a = 3; public void prtln() { //输出a; } }
内部类的分类
内部类分为: 成员内部类、静态嵌套类、方法内部类、 匿名内部类。 (1)、内部类仍然是一个独立的类,在编译之后内 部类会被编译成独立的.class文件,但是前面冠以外 部类的类名和$符号。 (2)、内部类不能用普通的方式访问。内部类是外 部类的一个成员,因此内部类可以自由地访问外部类 的成员变量,无论是否是private的。 (3)、内部类声明成静态的,就不能随便的访问外 部类的成员变量,仍然是只能访问外部类的静态成员 变量。
创建了内部类对象时,它会与创造它的外围对象有了某 种联系,于是能访问外围类的所有成员,不需任何特 殊条件。
public class First {
public class Contents{ public void getStr(){ System.out.println("First.str="+str); }
匿名内部类
匿名内部类就是没有名字的内部类。什么情况下 需要使用匿名内部类?如果满足下面的一些条 件,使用匿名内部类是比较合适的: · 只用到类的一个实例。 · 类在定义后马上用到。 · 类非常小(SUN推荐是在4行代码以下) · 给类命名并不会导致你的代码更容易被理 解。
在使用匿名内部类时,要记住以下几个原则: · 匿名内部类不能有构造方法。 · 匿名内部类不能定义任何静态成员、方法和 类。 · 匿名内部类不能是 public,protected,private,static。 · 只能创建匿名内部类的一个实例。 · 一个匿名内部类一定是在new的后面,用其隐 含实现一个接口或实现一个类。 · 因匿名内部类为局部内部类,所以局部内部 类的所有限制都对其生效。
成员内部类
成员内部类 class Outer { class Inner{} } 编译上述代码会产生两个文件:Outer.class 和Outer$Inner.class。
方法内部类
把类放在方法内 class Outer { public void doSomething(){ class Inner{ public void seeOuter(){ } } } }
接口定义
接口中只能包含public,static,final类型的成员变量和 public,abstract类型的成员方法 public interface A { int var; //错,var是常量,必须显示初始化 void method(){...}; //错,接口中只能包含抽象方法 protected void method2(); //错,接口中的方法必须是 public类型 static void method3(){...}; //错,接口中不能包含静态方法 }
接口定义
接口中没有构造方法,不能被实例化 public interface A { public A(){...}; //错,接口中不能包含构造方 法 void method(); }
接口定义
一个接口不能实现(implements)另一个接口,但它可以 继承多个其它的接口 public interface A { void methodA(); } public interface B { void methodB(); } public interface C extends A, B //C称为复合接口 { void methodC(); } public interface C implements A{...} //错
接口和内部类
接口
接口是抽象类的一种极端情况,即接口中没有 任何实现的方法。 接口实际上是为所有实现接口的类定义了一个 “规格”或一种“协议”,彻底的将实现分离 开来。 Shape 实例: area()
Circle
radius area()
Rectangle Length width area()
接口例子
class B implements prt{ int b = 4; public void prtln() { //输出b; } }
public class MyInterfaceDemo { public static void dost(prt c) { c.prtln(); } public static void main(String[] args) { A a1 = new A(); B b1 = new B(); MyInterfaceDemo.dost(a1); MyInterfaceDemo.dost(b1); } }
接口
接口的实现 使用implements关键字 实现一个接口的类必须实现接口中的所有方 法,否则,必须将类定义为抽象类
接口
圆形、三角形及图形 的关系中,实际上图 形的画法是不存在的, 因为图形是个抽象的 概念,只有具体的到 某个具体图形才具有 画法,因而可以把图 形定义为接口类,而 在它的子类圆形、三 角形中实现画法,它 们的关系如图