分享
 
 
 

Java编程思想(2nd)学习笔记(8)-1

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

第2章 接口与内隐类

一. 接口

1. 如果实现接口的class未实现接口中的所有函数,则这个class必须被声明为abstractclass,而接口中未被实现的函数在这个class中为abstractclass。

interface Interface{

public void f();

public void g();

}

abstract class First implements Interface{

public void f(){}

}

class Second extends First{

public void g(){}

}

public class ExplicitStatic{

public static void main(String[] args){

Interface f = new Second();

f.f();

f.g();

}

}

2. 接口中的所有函数自动具有public访问权限,所以实现某个接口时,必须将承袭自该接口的所有函数都定义为public

interface MyInterface {

public void f();

void g();

}

class First implements MyInterface {

public void f(){}

//!void g(){}出错,应定义为public

}

3. 接口中的数据成员自动成为static和final

interface MyInterface{

int i = 5;

void f();

void g();

}

class First implements MyInterface {

public void f(){}

public void g(){}

}

public class ExplicitStatic{

public static void main(String[] args){

MyInterface x = new First();

// MyInterface的数据成员I为static,可直接调用

System.out.println("MyInterface.i = " + MyInterface.i + " , x.i = " + x.i);

// MyInterface的数据成员I为final,不能修改

//x.i++;

// MyInterface.i++;

}

}

4. 多重继承

1) devricedclass可以同时继承多个interface和一个abstract或concretebaseclass。如果同时继承了baseclass和interface,那么要先写下具象类的名称,然后才是interfaces的名称。

2) 如果derivedclass所继承的具象类具有与interfaces相同的函数,则可在derivedclass不实现那个函数。

interface CanFight{

void fight();

}

interface CanSwim{

void swim();

}

class ActionCharacter{

public void fight(){}

}

class Hero extends ActionCharacter

implements CanFight, CanSwim{

public void swim(){};

}

public class ExplicitStatic{

static void f(CanFight x) { x.fight(); }

static void s(CanSwim x) { x.swim(); }

static void a(ActionCharacter x) { x.fight(); }

static void h(Hero x){

x.fight(); x.swim();

}

public static void main(String[] args){

Hero h = new Hero();

f(h); s(h); a(h); h(h);

}

}

因为在ActionCharacterclass中有与接口CanFight完全相同的函数fight(),所以在Heroclass可以不实现fight()方法。当要调用x.fight()时,会调用ActionCharacterclass中的fight()函数。

3) 接口的合并时的名称冲突问题

interface I1 { void f(); }

interface I2 { int f(int i); }

interface I3 { int f(); }

class C { public int f() { return 1; } }

class C2 implements I1, I2{

public void f() {}

public int f(int i) { return 1; }

}

class C3 extends C implements I2{

public int f(int i) { return 1; }

}

class C4 extends C implements I3{

public int f() { return 1; }

}

//class C5 extends C implements I1{}(a)

//class C6 extends C implements I1{ public void f(){} }(b)

interface I4 extends I1, I3{}//(c)

class C7 implements I4{

public void f() {}

public int f() { return 1; }

}

(a)处代码会产生以下错误: method f() in class C cannot implement method f() in interface I1 with different return type, was void。

(b)处代码也是错误的: method f() in class C6 cannot override method f() in class C with different return type, was int。由(b)处代码也可看出,虽然你试图实现接口I1中的函数,但由于extends C在前,所以编译器会把C6中的函数看成是覆写classC中的函数,而不是象你想象中的作为实现接口中的函数的函数。

(c)处代码在原书中(P253)说会出错,但我在测试时并没发生错误。但当你试图通过C7来实现接口I4时,是无论如何也不可能编译通过的。

4) Java中唯一可以使用多重继承的地方

Java是不允许通过关键字extends来实现多重继承的,但除了通过多重继承来扩充接口除外。

interface I1{

void f1();

}

interface I2{

void f2();

}

interface Ie1 extends I2{

void fe1();

}

class Ce1 implements Ie1{

public void f2() {}

public void fe1() {}

}

interface Ie2 extends Ie1, I1{

void fe2();

}

class Ce2 implements Ie2{

public void fe2() {}

public void f2() {}

public void fe1() {}

public void f1() {}

}

接口Ie2继承了两个接口。

5. 嵌套的interfaces

嵌套的interfaces可以在定义该内部接口的外部类(接口)之外被使用(但内隐类不行)。

1) 当接口嵌套于class中

a) 不论接口为public、friendly或private,都可被实现为public、friendly、private三种嵌套类。

b) 被声明为private的接口不能在class外被使用。

class A{

private interface B{

void f();

}

public class BImp implements B{

public void f() {}

}

private class BImp2 implements B{

public void f() {}

}

public B getB() { return new BImp(); }

private B dRef;

public void recivedD(B d){

dRef = d;

dRef.f();;

}

}

public class ExplicitStatic{

public static void main(String[] args){

A a = new A(); //(a)

//A.B ab = a.getB();(b)

//A.BImp = a.getB();(c)

a.recivedD(a.getB());

}

}

虽然Aclass含有接口,但它仍可被实例化,如(a)。

由于接口B为private,所以在(b)处调用接口B时会出错。但当把接口B声明为public时,(b)将通过编译。但(c)处依然会出错,因为内隐类的作用域为定义该内隐类的外部类内(见内隐类)。

2) 当接口嵌套于接口中

1) 嵌套于接口中的接口自动为public,且只能为public。

2) 当实现某个接口时,无需实现其中嵌套的接口。

3) Private接口无法在其所定义的class之外被实现。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有