Java接口(Interface,组成更新)

我们知道,在Java的语法中,接口Interface里只能有抽象方法,实现接口的类必须重写这些抽象方法,但是这些都是在JDK8之前,在Java8之后,接口的组成有了更新,Java9之后,又有新的更新。

下面我们就用男女恋爱的例子一步步带入来进行讲解这些更新 

我们先展示一段代码示例,男孩和女孩谈恋爱,按照Java8之前的做法

  • TalkLove:谈恋爱接口,目前里面只有吃饭eat()和看电影watchMovie()2个抽象方法。
  • StudentBoy:学生男类,实现了TalkLove谈恋爱类,重写了吃饭eat()和看电影watchMovie()方法。
  • StudentGirl:学生妹类,实现了TalkLove谈恋爱类,重写了吃饭eat()和看电影watchMovie()方法。
  • Demo:测试类,测试学生男和学生妹的恋爱。

TalkLove:谈恋爱接口代码

package com.TestInterfaceUpdate;/*** @author 林高禄* @create 2020-06-02-15:56*/
public interface TalkLove {void eat();void watchMovie();}

Boy:男孩类代码

package com.TestInterfaceUpdate;/*** @author 林高禄* @create 2020-06-02-15:59*/
public class StudentBoy implements TalkLove {@Overridepublic void eat() {System.out.println("男孩和女孩一起吃饭");}@Overridepublic void watchMovie() {System.out.println("男孩和女孩一起看电影");}
}

Girl:女孩类代码

package com.TestInterfaceUpdate;/*** @author 林高禄* @create 2020-06-02-16:00*/
public class StudentGirl implements TalkLove {@Overridepublic void eat() {System.out.println("女孩和男孩一起吃饭");}@Overridepublic void watchMovie() {System.out.println("女孩和男孩一起看电影");}
}

Demo:测试类代码

package com.TestInterfaceUpdate;/*** @author 林高禄* @create 2020-06-02-16:01*/
public class Demo {public static void main(String[] args) {TalkLove boy = new StudentBoy();boy.eat();boy.watchMovie();TalkLove girl = new StudentGirl();girl.eat();girl.watchMovie();}
}

运行Demo:测试类,输出

男孩和女孩一起吃饭
男孩和女孩一起看电影
女孩和男孩一起吃饭
女孩和男孩一起看电影

看起来男孩和女孩的恋爱一直进行着没有问题,但是随着时间的推移,都说日久生情嘛,2个人的恋爱总不能只是吃吃饭看看电影啊,这时男孩和女孩的暧昧程度愈来愈深,走在一起想要牵手了,好啊,那就牵手啊,调牵手方法啊,那么方法在哪里呢?。

方案1:

有些人就说了,那就在学生男类StudentBoy里面新建一个牵手的方法,在学生妹类StudentGirl新建一个牵手的方法,这样就可以牵手了。

说上面话的人是什么意思,难道就只有学生拥有牵手的权利?我其他的新增类,比如中年男子,又比如我大程序猿,好不容易有个妹子愿意交往,实现了恋爱的接口TalkLove,难道就只能吃吃饭看看电影做这些花钱的事,就不能牵牵手?我大程序猿就只能当腰包吗?

这些人马上就出来解释了,那就在程序猿里再加个牵手的方法

是的,你这样做程序猿是解决了,但是其他职业的呢,业务员不开心了,公务员也不开心了,要是为了能满足各行各业的需求,各行各业都要加一遍牵手的方法,那岂不是很冗余?牵手这种共性是每个恋爱的人渴望的第一步,都是大家认知的共性,就不能共用出来吗?

方案2:

好,又有人提出方案了,在恋爱的接口TalkLove再写一个牵手的抽象方法,这样恋爱中的人就可以牵手了

兄弟,你这样做的话,将来恋爱的还可以重写牵手方法牵牵手,但是按照Java的语法,之前恋爱的那些不就炸锅了?他们都出现异常了啊,有名无实啊,表面上可以牵手,但是实际上不能啊,要想牵手,要想恢复正常秩序,还得每个人都得重写牵手的方法,这和方案1没什么2样,而且是大工程。

方案3:

还有人提出方案,新建一个接口,里面加一个牵手的抽象方法,让满足想牵手的人再实现这个接口,这样之前的类也不会出现异常

看似可以,但是还是存在缺点,就是之前恋爱的那些人,想牵手的,还得修改去实现这个新增的接口。并且,作为一个正常的人,你总不能仅仅满足于牵手吧,将来还要接吻的,接着还要这个,那个什么的,大家都懂得。那你总不能呢个接吻也要新建一个接口,然后满足的情侣又要去实现这个接口,将来还要这个、那个xx的,还要新增这个那个接口,每次爱情的升温都要新增一个接口,还要去实现,这相当于我谈个恋爱,想接吻还得成立这么一个部门,然后我还得去这个部门办证,这样才能接吻,想开个房搞点大家都懂得的事,也还得去办个证,这不是非常不可理吗?非常不人性话吗?

那怎么办?

别急,Java的开发人员还是非常人性化的,这不,Java8就满足了这个需求

接口的组成

  • 常量:publicstatic final
  • 抽象方法:public abstract
  • 默认方法(Java8):default
  • 静态方法(Java8):static
  • 私有方法(Java9):private或者private static

鉴于Java8提供的特性,那么我们可以在恋爱的接口TalkLove再写牵手的方法,只不过这个方法不是抽象的,而是默认的,将来接吻这个那个什么的,也都是可以这样处理

修改后的恋爱的接口TalkLove的代码

package com.TestInterfaceUpdate;/*** @author 林高禄* @create 2020-06-02-15:56*/
public interface TalkLove {void eat();void watchMovie();default void handInhand(){System.out.println("有想法");System.out.println("等待");System.out.println("终于等到");System.out.println("双方牵手");}
}

修改后的学生男类StudentBoy,毕竟牵手男方总要主动一点,所以还是重写了牵手的方法。学生妹类StudentGir我们这里就不重写了,被动一点,这里只是演示默认方法也是可以重写的,与实际无关,毕竟现实世界还是有妹纸很主动的。

package com.TestInterfaceUpdate;/*** @author 林高禄* @create 2020-06-02-15:59*/
public class StudentBoy implements TalkLove {@Overridepublic void eat() {System.out.println("男孩和女孩一起吃饭");}@Overridepublic void watchMovie() {System.out.println("男孩和女孩一起看电影");}@Overridepublic void handInhand() {System.out.println("男孩主动牵女孩的手");}
}
package com.TestInterfaceUpdate;/*** @author 林高禄* @create 2020-06-02-16:00*/
public class StudentGirl implements TalkLove {@Overridepublic void eat() {System.out.println("女孩和男孩一起吃饭");}@Overridepublic void watchMovie() {System.out.println("女孩和男孩一起看电影");}
}

 修改后的测试类Demo代码

package com.TestInterfaceUpdate;/*** @author 林高禄* @create 2020-06-02-16:01*/
public class Demo {public static void main(String[] args) {TalkLove boy = new StudentBoy();boy.eat();boy.watchMovie();boy.handInhand();System.out.println("-------------------");TalkLove girl = new StudentGirl();girl.eat();girl.watchMovie();girl.handInhand();}
}

运行测试类,输出:

男孩和女孩一起吃饭
男孩和女孩一起看电影
男孩主动牵女孩的手
-------------------
女孩和男孩一起吃饭
女孩和男孩一起看电影
有想法
等待
终于等到
双方牵手

男孩和女孩牵手后,接着会发生各种各样的不可告知的事,后面的情节自己脑补,终于到了领结婚证的时候了,但是结婚证不是男孩发的,也不是女孩发的,是由专门的机构发的,这个机构我们暂时还是得交给恋爱的接口TalkLove来处理,恋爱的接口TalkLove新加一个发证的方法,这个方法只能是这个机构恋爱的接口TalkLove来发,其他人都不能,这就需要静态方法来处理

修改后的恋爱的接口TalkLove代码,类无法重写静态的方法,所以无法重写fazheng()的方法

package com.TestInterfaceUpdate;/*** @author 林高禄* @create 2020-06-02-15:56*/
public interface TalkLove {void eat();void watchMovie();default void handInhand(){System.out.println("有想法");System.out.println("等待");System.out.println("终于等到");System.out.println("双方牵手");}static void faZheng(){System.out.println("有想法");System.out.println("等待");System.out.println("终于等到");System.out.println("终于领到证了");}
}

 修改后的测试类Demo代码

package com.TestInterfaceUpdate;/*** @author 林高禄* @create 2020-06-02-16:01*/
public class Demo {public static void main(String[] args) {TalkLove boy = new StudentBoy();boy.eat();boy.watchMovie();boy.handInhand();//boy.f   // 男孩没法发证,因为是静态的,也无法重写发证的方法System.out.println("-------------------");TalkLove girl = new StudentGirl();girl.eat();girl.watchMovie();girl.handInhand();//girl.f   // 男女孩没法发证,因为是静态的,也无法重写发证的方法System.out.println("-------------------");TalkLove.faZheng();}
}

运行测试类,输出:

男孩和女孩一起吃饭
男孩和女孩一起看电影
男孩主动牵女孩的手
-------------------
女孩和男孩一起吃饭
女孩和男孩一起看电影
有想法
等待
终于等到
双方牵手
-------------------
有想法
等待
终于等到
终于领到证了

我们仔细看一下恋爱的接口TalkLove的代码,发现有想法、等待、终于等到都是重复的,那我们可不可以共用,这就需要接口的私有方法来处理了,同接口的静态方法一样,私有方法实现类不能重写,也不能通过实现类来调用,毕竟是私有的。

修改后恋爱的接口TalkLove的代码

package com.TestInterfaceUpdate;/*** @author 林高禄* @create 2020-06-02-15:56*/
public interface TalkLove {void eat();void watchMovie();default void handInhand(){mathod();System.out.println("双方牵手");}static void faZheng(){//mathod();//报错,静态的方法无法调非静态的方法mathod2();System.out.println("终于领到证了");}private void mathod(){// 非静态方法可以调用静态方法mathod2();}private static void mathod2(){System.out.println("有想法");System.out.println("等待");System.out.println("终于等到");}
}

测试代码不用修改,运行,报一下错

 

这是为什么,编译的时候没错,运行的时候错了,这是因为本屌丝的版本是Java8,而前面也提到,接口的私有方法是 Java9新增的特性,所以会出错,那么,如果你的版本是Java9或者是以上的版本,那么就不会出错。

好了,本次接口的更新就讲到这里,最后还是祝各位同行们能牵到心仪姑娘的手,并且拿到结婚证! 

哎呀,本主播也是有洁癖,看着这个报错不舒服,于是就换了一个Java版本,换成了Java14.0.1

 运行输出:

男孩和女孩一起吃饭
男孩和女孩一起看电影
男孩主动牵女孩的手
-------------------
女孩和男孩一起吃饭
女孩和男孩一起看电影
有想法
等待
终于等到
双方牵手
-------------------
有想法
等待
终于等到
终于领到证了

功德圆满!!! 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部