加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java 抽象类与接口

发布时间:2020-12-14 06:32:40 所属栏目:Java 来源:网络整理
导读:抽象类 当基类比较抽象的时候一些函数就无法实现。比如动物类,你可以知道猫如何叫狗如何叫,但你无法说清动物如何叫,于是对于比较抽象的基类,其中的一些方法可以只声明,不实现。这样的方法叫做抽象方法,含有抽象方法的类叫做抽象类。抽象方法和抽象类需

抽象类

当基类比较抽象的时候一些函数就无法实现。比如动物类,你可以知道猫如何叫狗如何叫,但你无法说清动物如何叫,于是对于比较抽象的基类,其中的一些方法可以只声明,不实现。这样的方法叫做抽象方法,含有抽象方法的类叫做抽象类。抽象方法和抽象类需要用关键字abstract来标识。

含有抽象方法的类的对象是不安全的,因此java中不允许创建抽象类的对象。

对于一个不含有抽象方法的类也可以设为抽象类,这样,就能限制这个类不能产生对象了。

接口

当一个类足够抽象,将不会实现任何方法。接口(interface)是一个完全抽象的类,不提供任何具体实现。

接口同类一样有public和默认(包)访问权限。

接口中的域默认是static和final的

接口中的方法默认是public的,所以继承的时候注意实现的时候要声明为public。

接口的用处和抽象类看起来并不相同。比如上面说的抽象基类动物类,动物会叫,继承类包括猫狗。但是汽车,电视都会“叫”,却并不合适继承,这时一个“声音”接口就比较合适。

接口的多重继承

Because an interface has no implementation at all—that is,there is no storage associated with an interface—there’s nothing to prevent many interfaces from being combined.

A { B { <span style="color: #0000ff;">class C <span style="color: #0000ff;">implements<span style="color: #000000;"> A,B {
@Override
<span style="color: #0000ff;">public
<span style="color: #0000ff;">void
<span style="color: #000000;"> f() {
System.out.println("f()"<span style="color: #000000;">);
}
}

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> Test {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
<span style="color: #0000ff;">new<span style="color: #000000;"> C().f();
}
}

2、如果两个方法名字相同参数列表不同,会实现重载。

A { f( B { <span style="color: #0000ff;">class C <span style="color: #0000ff;">implements<span style="color: #000000;"> A,B {
@Override
<span style="color: #0000ff;">public
<span style="color: #0000ff;">void
<span style="color: #000000;"> f() {
System.out.println(
"f()"<span style="color: #000000;">);
}
@Override
<span style="color: #0000ff;">public <span style="color: #0000ff;">void f(<span style="color: #0000ff;">int<span style="color: #000000;"> x) {
System.out.println("f(" + x + ")"<span style="color: #000000;">);
}
}

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> Test {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
C c = <span style="color: #0000ff;">new<span style="color: #000000;"> C();
c.f(); c.f(1<span style="color: #000000;">);
}
}

A { B { <span style="color: #0000ff;">class<span style="color: #000000;"> C {
<span style="color: #0000ff;">public
<span style="color: #0000ff;">void
<span style="color: #000000;"> f() {
System.out.println(
"f()"<span style="color: #000000;">);
}
}

<span style="color: #0000ff;">class D <span style="color: #0000ff;">extends C <span style="color: #0000ff;">implements<span style="color: #000000;"> A,B {
}

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> Test {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
D d = <span style="color: #0000ff;">new<span style="color: #000000;"> D();
d.f();
}
}

?

<div class="cnblogs_code">

 A {     

C++中存在菱形继承的问题。

?java虽然不存在类的多重继承,但是存在接口多重继承。考虑下面的代码

F { S1 F { S2 F { T S1,S2 { <span style="color: #0000ff;">class Fo <span style="color: #0000ff;">implements<span style="color: #000000;"> T {
<span style="color: #0000ff;">public
<span style="color: #0000ff;">void
f() { System.out.println("f"<span style="color: #000000;">); }
<span style="color: #0000ff;">public
<span style="color: #0000ff;">void
s1() { System.out.println("s1"<span style="color: #000000;">); }
<span style="color: #0000ff;">public
<span style="color: #0000ff;">void
s2() { System.out.println("s2"<span style="color: #000000;">); }
<span style="color: #0000ff;">public
<span style="color: #0000ff;">void
t() { System.out.println("t"<span style="color: #000000;">); }
}

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> Diamond {
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
Fo fo = <span style="color: #0000ff;">new<span style="color: #000000;"> Fo(); fo.f();
}
}

其实由上面的讨论也可以想到这完全不会有问题。因为java的接口根本不提供具体实现。这也是Java设计单一继承和接口的原因。

?接口中的域

定义时即要初始化,可以是被非常量的表达式初始化。

i = 0; j = k = j * 10

这些域不是接口的一部分,它们的值被存储在该接口的静态存储区域内。

?

配适器设计模式

某个现有的类的接口和需求不同,可以通过实现某个接口达到要求。(因为《thinking in java》提到所以稍微看了一下。。理解浅显。。

一般都是用插头举例,如果插头型号不合适就在外面在套一个转换插头实现工作。(原谅我是在写不出符合逻辑的例子。。。。。

AImplementsB A

举个实际的用处。Scanner的构造器接受的是一个Readable接口,也就是说只要一个类实现了Readable接口,就可以使Scanner作用于它。

Readable接口中只有一个方法public int read(CharBuffer arg0);在read内部将输入内容添加到CharBuffer参数中,返回添加或者没有输入返回-1。

<span style="color: #0000ff;">public <span style="color: #0000ff;">class RandomWords <span style="color: #0000ff;">implements<span style="color: #000000;"> Readable {
<span style="color: #0000ff;">private
<span style="color: #0000ff;">static Random rand = <span style="color: #0000ff;">new<span style="color: #000000;"> Random();
<span style="color: #0000ff;">private <span style="color: #0000ff;">static <span style="color: #0000ff;">final <span style="color: #0000ff;">char[] capitals =
"QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm"<span style="color: #000000;">.toCharArray();
<span style="color: #0000ff;">private <span style="color: #0000ff;">int count = 0<span style="color: #000000;">;
<span style="color: #0000ff;">public RandomWords(<span style="color: #0000ff;">int<span style="color: #000000;"> count) {
<span style="color: #0000ff;">this.count =<span style="color: #000000;"> count;
}
@Override
<span style="color: #0000ff;">public <span style="color: #0000ff;">int<span style="color: #000000;"> read(CharBuffer cb) {
<span style="color: #0000ff;">if (count-- == 0) <span style="color: #0000ff;">return -1<span style="color: #000000;">;
cb.append(capitals[rand.nextInt(capitals.length)]);
cb.append(" "<span style="color: #000000;">);
<span style="color: #0000ff;">return 1<span style="color: #000000;">;
}
<span style="color: #0000ff;">public <span style="color: #0000ff;">static <span style="color: #0000ff;">void<span style="color: #000000;"> main(String[] args) {
Scanner in = <span style="color: #0000ff;">new Scanner(<span style="color: #0000ff;">new RandomWords(10<span style="color: #000000;">));
<span style="color: #0000ff;">while<span style="color: #000000;"> (in.hasNext()) {
System.out.print(in.next() + ","<span style="color: #000000;">);
}
in.close();
}
}

接口可以嵌套在其他类或接口中。

private 或 public 或 默认访问权限 都可以。

没弄明白什么用ing。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读